diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index c9133efad..901bbf9ea 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -32,6 +32,7 @@ body: - 03-Azure/01-03-Infrastructure/05_Azure_VMware_Solution - 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization - 03-Azure/01-03-Infrastructure/07_Azure_Monitor + - 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure - 03-Azure/01-04- AI/01_Azure_OpenAI_Service - 04-Microsoft-365 validations: diff --git a/.github/ISSUE_TEMPLATE/featurerequest.yaml b/.github/ISSUE_TEMPLATE/featurerequest.yaml index 24595b801..65c056c98 100644 --- a/.github/ISSUE_TEMPLATE/featurerequest.yaml +++ b/.github/ISSUE_TEMPLATE/featurerequest.yaml @@ -32,6 +32,7 @@ body: - 03-Azure/01-03-Infrastructure/05_Azure_VMware_Solution - 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization - 03-Azure/01-03-Infrastructure/07_Azure_Monitor + - 03-Azure/01-03-Infrastructure/10_Oracle_on_Azure - 03-Azure/01-04- AI/01_Azure_OpenAI_Service - 04-Microsoft-365 validations: diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/00-Getting-started.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/00-Getting-started.md deleted file mode 100644 index 3560095cb..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/00-Getting-started.md +++ /dev/null @@ -1,23 +0,0 @@ -# Challenge 0: Getting started - -**[Home](../README.md)** - [Challenge One](./01-Setup-Environment.md) - -## Introduction - -Kubernetes has emerged as the common standard for sizable and scalable containerized platforms, with Azure Kubernetes Service (AKS) representing Azure's tailored solution in this realm. In this tutorial, we're going to delve into the essential concepts of AKS, alongside an overview of Kubernetes (K8s) fundamentals. We'll also uncover typical scenarios and operational insights that one may encounter while managing an AKS environment in day-to-day operations. - -## Architecture - -To have a relateable scenario, we will create a basic AKS cluster setup and use some common services. - -## Components - -- Azure resource groups are logical containers for Azure resources. You use a single resource group to structure everything related to this solution in the Azure portal. -- Azure Key Vault is a secret store used in Azure to securly manage your keys, certificates and secrets. -- Azure Kubernetes Service is the native approach from Azure for a kubernetes PaaS solution. -- Azure Container Insights is a feature from Azure monitor to simplify monitoring and logging of AKS resources via the Azure Portal. - -### Learning resources - -- [AKS documentation](https://learn.microsoft.com/en-us/azure/aks/) -- [AKS best practices](https://learn.microsoft.com/en-us/azure/aks/best-practices) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/01-Setup-Environment.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/01-Setup-Environment.md deleted file mode 100644 index e75904f94..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/01-Setup-Environment.md +++ /dev/null @@ -1,32 +0,0 @@ -# Challenge 1: Set up the environment - -[Previous Challenge](./00-Getting-started.md) - **[Home](../README.md)** - [Next Challenge](./02-Deploy-and-configure.md) - -## Introduction - -In this challenge we will setup the basic Azure resources we need to fulfill our goal of managing and operating an AKS cluster in daily business operations. You are free to choose the most suitable method for provisioning these resources. - -## Challenge - -- West Europe Region -- Naming conventions for resources -- Key-Vault for storing secrets (optional) -- Go with one node in the beginning -- Default K8s roles -- Kubenet as network provider -- Basic permission concept for accessing resources - -## Success Criteria - -- Naming convention defined -- AKS deployed -- Permission concept is created - -## Learning resources - -- [AKS documentation](https://learn.microsoft.com/en-us/azure/aks/) -- [AKS best practices](https://learn.microsoft.com/en-us/azure/aks/best-practices) - -## Solution - Spoilerwarning - -Challenge 1: [Setup the environment](../Solutionguide/01-Setup-Environment-solution.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/02-Deploy-and-configure.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/02-Deploy-and-configure.md deleted file mode 100644 index 7d789fb3d..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/02-Deploy-and-configure.md +++ /dev/null @@ -1,29 +0,0 @@ -# Challenge 2: Deploy and configure your first pod - -[Previous Challenge](./01-Setup-Environment.md) - **[Home](../README.md)** - [Next Challenge](./03-Azure-Monitor.md) - -## Introduction - -Now it is time to deploy some pods in our newly deployed cluster. Therefor you will need to apply some yaml-templates to the AKS, after you connected to it. We will use some upstream containers for that. - -## Challenges - -- Connect to your AKS cluster via Azure CLI -- Deploy a BusyBox Container from upstream sources by creating your own manifest -- Access your BusyBox Container via kubectl - -## Success Criteria - -- Config for AKS merged in local kubeconfig -- BusyBox container running and viewable via kubectl -- Container was accessed via kubectl - -## Learning resources - -- [Connect to AKS via CLI](https://learn.microsoft.com/en-us/azure/aks/learn/quick-kubernetes-deploy-cli#connect-to-the-cluster) -- [Kubernetes Cheatsheet](https://kubernetes.io/docs/reference/kubectl/cheatsheet/) -- [Busybox upstream source](https://hub.docker.com/_/busybox) - -## Solution - Spoilerwarning - -Challenge 2: [Deploy and configure your first pods](../Solutionguide/02-Deploy-and-configure-solution.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/03-Azure-Monitor.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/03-Azure-Monitor.md deleted file mode 100644 index b8f8af6b5..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/03-Azure-Monitor.md +++ /dev/null @@ -1,27 +0,0 @@ -# Challenge 3: Add Azure Monitor to your environment - -[Previous Challenge](./02-Deploy-and-configure.md) - **[Home](../README.md)** - [Next Challenge](./04-Scale-up.md) - -## Introduction - -To observe our cluster we now add Azure Monitor to our environment. This is the go-to solution for monitoring Azure services and can directly be connected to our cluster. - -## Challenges - -- Create Azure Monitor resource in same region and resource group like the other resources -- Configure Container Insights feature for the cluster - -## Success Criteria - -- Azure Monitor is added to the environment -- Container Insights feature is configured -- Metrics can be viewed in Azure Portal - -## Learning Resources - -- [Azure Monitor Documentation](https://learn.microsoft.com/en-us/azure/azure-monitor/overview) -- [Container Insights Documentation](https://learn.microsoft.com/en-us/azure/azure-monitor/containers/container-insights-overview) - -## Solution - Spoilerwarning - -Challenge 3: [Add Azure Monitor to your environment](../Solutionguide/03-Azure-Monitor-solution.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/04-Scale-up.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/04-Scale-up.md deleted file mode 100644 index 86078a73e..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/04-Scale-up.md +++ /dev/null @@ -1,32 +0,0 @@ -# Challenge 4: Scale up your services - -[Previous Challenge](./03-Azure-Monitor.md) - **[Home](../README.md)** - [Next Challenge](./05-Ingress-controller.md) - -## Introduction - -Since kubernetes is a hyperscaler, we need to use it as such and deploy more services. Therefor we will add some common containers from upstream to our cluster and see what happens. - -## Challenges - -- Connect to your cluster via CLI -- Create a manifest for a basic redis container -- Create a manifest for a basic wordpress container -- Apply your manifests to your cluster -- Scale your redis deployment up and down and try to scale up your whole cluster via your changes -- Check Azure Monitor for some insights on your infrastructure - -## Success Criteria - -- New containers are running smoothly in your cluster -- Note down your observations from Azure Monitor, what can you observe here and was it expected? - -## Learning resources - -- [Azure Scalesets](https://learn.microsoft.com/en-us/azure/virtual-machine-scale-sets/overview) -- [Kubernetes Daemonsets](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) -- [Redis upstream source](https://hub.docker.com/_/redis) -- [Wordpress upstream source](https://hub.docker.com/_/wordpress) - -## Solution - Spoilerwarning - -Challenge 4: [Scale up your services](../Solutionguide/04-Scale-up-solution.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/05-Ingress-controller.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/05-Ingress-controller.md deleted file mode 100644 index 192703bd0..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Challenges/05-Ingress-controller.md +++ /dev/null @@ -1,37 +0,0 @@ -# Challenge 5: Access your services via an ingress controller - -[Previous Challenge](./04-Scale-up.md) - **[Home](../README.md)** - -## Introduction - -To now access our services from outside the cluster, we will deploy and configure an ingress controller. One of the core concepts for AKS workloads and use cases. - -## Challenges - -- Connect to your cluster via CLI -- Create a manifest for your ingress controller with image from NginX -- Apply your ingress manifest to your cluster -- Set up the configuration for both your ingress and WordPress container to enable access to the initial configuration screen of WordPress. Ensure that traffic is directed through the ingress controller -- Check Azure Monitor, if everthing works as expected - -## Success Criteria - -- Ingress Controller is deployed to cluster -- Wordpress can be configured via browser call -- All traffic between internet and cluster is routed via the ingress controller - -## Learning resources - -- [Ingress controller upstream source](https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/) -- [Ingress controller documentation](https://docs.nginx.com/nginx-ingress-controller/) -- [Ingress in AKS documentation](https://learn.microsoft.com/en-us/azure/aks/ingress-basic?tabs=azure-cli) - -## Solution - Spoilerwarning - -Challenge 5: [Access your services via an ingress controller](../Solutionguide/05-Ingress-controller-solution.md) - -# Finish - -Congratulations! You finished the MicroHack Operationalize AKS Cluster. We hope you had the chance to learn about Kubernetes Clusters and how to implement them using Azure. If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. - -Thank you for investing the time and see you next time! diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/KeyvaultSetup.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/KeyvaultSetup.png deleted file mode 100755 index e3fa3d279..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/KeyvaultSetup.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup01.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup01.png deleted file mode 100755 index b435802bb..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup01.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup02.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup02.png deleted file mode 100755 index 00a4ab377..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup02.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup03.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup03.png deleted file mode 100755 index 160c04583..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup03.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup04.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup04.png deleted file mode 100755 index 23c58eee9..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/akssetup04.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/namingconventions.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/namingconventions.png deleted file mode 100755 index 2fcd4d2b2..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/01-setup-env/namingconventions.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor01.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor01.png deleted file mode 100755 index 9f0a0d0f3..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor01.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor02.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor02.png deleted file mode 100755 index 259b99f2a..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor02.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor03.png b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor03.png deleted file mode 100755 index 0a277164c..000000000 Binary files a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/03-monitor/monitor03.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/README.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/README.md deleted file mode 100644 index 8b1378917..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Images/README.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/README.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/README.md deleted file mode 100644 index 3ec4b72bd..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Operationalize your AKS Cluster - -## Introduction and context - -In this MicroHack we are going to cover some basic tasks you are facing when running an AKS cluster. - -Kubernetes is a technology for container orchestration, enabling efficient deployment, scaling, and management of applications in a cloud environment. It offers benefits like scalability, flexibility across various clouds, high availability, and automated updates. Microsoft Azure's Azure Kubernetes Service (AKS) enhances the capabilities of Kubernetes by integrating it seamlessly into the Azure ecosystem, simplifying cluster management and ensuring high security and compliance. With AKS, users get an environment that is not only easy to manage but also cost-effective, as it charges only for the resources used without additional fees for the Kubernetes management infrastructure. This makes AKS a great platform choice for both small and large enterprises seeking to optimize containerized applications with minimal overhead and maximum efficiency. - -We will take some insights in fundamental operational tasks like scaling and learn how to observe our cluster with Azure Monitor. - -## Learning Objectives - -In this hack you will learn how to setup an AKS, how to handle daily business tasks, monitor operations and resources via Azure Monitor and access your deployments via an ingress controller. - -## Content and Challenges - -- Challenge 0: [Getting started](./Challenges/00-Getting-started.md) -- Challenge 1: [Setup the environment](./Challenges/01-Setup-Environment.md) -- Challenge 2: [Deploy and configure your first pods](./Challenges/02-Deploy-and-configure.md) -- Challenge 3: [Add Azure Monitor to your environment](./Challenges/03-Azure-Monitor.md) -- Challenge 4: [Scale up your services](./Challenges/04-Scale-up.md) -- Challenge 5: [Access your services via an ingress controller](./Challenges/05-Ingress-controller.md) - -## Prerequisites - -- VS Code -- Azure CLI -- kubectl -- terraform/bicep extension -- Azure Subscription - -## Solution Guide - -- Challenge 1: [Setup the environment](./Solutionguide/01-Setup-Environment-solution.md) -- Challenge 2: [Deploy and configure your first pods](./Solutionguide/02-Deploy-and-configure-solution.md) -- Challenge 3: [Add Azure Monitor to your environment](./Solutionguide/03-Azure-Monitor-solution.md) -- Challenge 4: [Scale up your services](./Solutionguide/04-Scale-up-solution.md) -- Challenge 5: [Access your services via an ingress controller](./Solutionguide/05-Ingress-controller-solution.md) - -## Contributor - -Maximilian Schaugg -Denis Kurkov -Leonie Möller -Rasmus Pranke -Judith Högerl diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/01-Setup-Environment-solution.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/01-Setup-Environment-solution.md deleted file mode 100644 index cbad8b155..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/01-Setup-Environment-solution.md +++ /dev/null @@ -1,55 +0,0 @@ -# Challenge 1: Set up the environment - -Duration: 15 min - -**[Home](../README.md)** - [Next Challenge Solution](./02-Deploy-and-configure-solution.md) - -Feel free to create your environment using any source you prefer. The following links provide solutions for utilizing the Portal, the CLI, or Terraform - -- [Portal](https://learn.microsoft.com/en-us/azure/aks/learn/quick-kubernetes-deploy-portal?tabs=azure-cli) -- [CLI](https://learn.microsoft.com/en-us/azure/aks/learn/quick-kubernetes-deploy-cli) -- [Terraform](https://learn.hashicorp.com/tutorials/terraform/aks) - -Here, you can learn how to set up everything using the Azure Portal. - -## Task 1: Naming convention - -In Azure, it is recommended to use a naming convention, as certain resources require globally unique names. -For our microhack, we will go with the best practice convention provided by microsoft, which has the following structure: - - -A detailed overview of all the shortcuts can be found here [link](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming) - -## Task 2: Setting up the keyvault - -The first resource we are going to deploy is a KeyVault. It We will start by deploying a KeyVault, which will serve as a secure storage for our secrets. -Go to the menu 'Create new resource' in the Portal and complete the forms as shown: - - -## Task 3: Setting up the AKS - -Now we create the AKS via the portal. Once again, access the resource creation menu, go to Kubernetes Services, and complete all the required fields as depicted in the picture. We will utilize the same resource group as as the one used for the KeyVault: -Standard Setup: - - - -Nodepools: - - - -Access: - - - -Network: - - - -## Task 4: Accessing the resources - -Azure offers various methods to access resources, such as through the Portal or CLI. Therefore, it is crucial to implement a well-defined permission concept. You can find some best practices related to permissions at the following link: -[Security Design Considerations](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/security) - -## Next Challenge - -Challenge 2: [Deploy and configure your first pods](../Challenges/02-Deploy-and-configure.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/02-Deploy-and-configure-solution.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/02-Deploy-and-configure-solution.md deleted file mode 100644 index d5ace4542..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/02-Deploy-and-configure-solution.md +++ /dev/null @@ -1,40 +0,0 @@ -# Challenge 2: Deploy and configure your first pod - -Duration: 30 min - -[Previous Challange Solution](./01-Setup-Environment-solution.md) - **[Home](../README.md)** - [Next Challenge Solution](./03-Azure-Monitor-solution.md) - -## Task 1: Setup the environment - -For deploying something on kubernetes, we can use tools like terraform or helm. If you want to use those, take a look here: - -- [terraform kubernetes provider](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs) -- [helm](https://helm.sh/docs/) - -If not, you can just create a YAML-Manifest on your own, but be aware of the right intendation! - -[Here](https://github.com/josedom24/kubernetes/blob/master/ejemplos/busybox/busybox.yaml) is a sample manifest for the BusyBox-Container. - -## Task 2: Connect to the cluster - -After installing kubectl and connecting to your AKS Cluster ([Connect to AKS via CLI](https://learn.microsoft.com/en-us/azure/aks/learn/quick-kubernetes-deploy-cli)) apply your manifest using the following command: - -```bash -kubectl apply -f (manifest-filename) -``` - -To see your container and some others that are deployed by default, just type in the following: - -```bash -kubectl get pod --all-namespaces -``` - -To access your freshly deployed container, you can use the following command: - -```bash -kubectl exec -it (pod-name) /bin/sh -``` - -## Next Challenge - -Challenge 3: [Add Azure Monitor to your environment](../Challenges/03-Azure-Monitor.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/03-Azure-Monitor-solution.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/03-Azure-Monitor-solution.md deleted file mode 100644 index 902da02fe..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/03-Azure-Monitor-solution.md +++ /dev/null @@ -1,28 +0,0 @@ -# Challenge 3: Add Azure Monitor to your environment - -Duration: 10 minutes - -[Previous Challange Solution](./02-Deploy-and-configure-solution.md) - **[Home](../README.md)** - [Next Challenge Solution](./04-Scale-up-solution.md) - -## Task 1: Create an Azure Monitor instance - -Please follow these steps to create an Azure Monitor instance: - -First, create a Log Analytics Workspace. - -Basics: - - -Afterwards, go to your kubernetes cluster and go to the Insights-Tab: - - - - -Here is a solution guide directly from Microsoft for creating Azure Monitor and configure Container Insights: - -- [Azure Monitor setup](https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/configure-azure-monitor) -- [Configure Container Insights](https://learn.microsoft.com/en-us/azure/azure-monitor/containers/container-insights-onboard) - -## Next Challenge - -Challenge 4: [Scale up your services](../Challenges/04-Scale-up.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/04-Scale-up-solution.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/04-Scale-up-solution.md deleted file mode 100644 index 82cf82948..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/04-Scale-up-solution.md +++ /dev/null @@ -1,36 +0,0 @@ -# Challenge 4: Scale up your services - -Duration: 15 min - -[Previous Challange Solution](./03-Azure-Monitor-solution.md) - **[Home](../README.md)** - [Next Challenge Solution](./05-Ingress-controller-solution.md) - -## Task 1: Create your clusters - -Here you can find ready to go manifests for both instances: - -- [redis](https://kubernetes.io/docs/tutorials/configuration/configure-redis-using-configmap/) -- [wordpress](https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/) - -## Task 2: Scale the clusters - -Scaling your clusters can be achieved via the scale command of kubectl. Here is a sample: - -```bash -kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME) -``` - -For example, for redis you can execute the following commands: - -```bash -kubectl create deploy redis --image=redis -``` - -Next, you can specify the number of replicas, e.g. 5: - -```bash -kubectl scale --replicas=5 deployment/redis -``` - -## Next Challenge - -Challenge 5: [Access your services via an ingress controller](../Challenges/05-Ingress-controller.md) diff --git a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/05-Ingress-controller-solution.md b/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/05-Ingress-controller-solution.md deleted file mode 100644 index c55e5847f..000000000 --- a/03-Azure/01-01-App Innovation/02_OperationalizeAKSCluster/Solutionguide/05-Ingress-controller-solution.md +++ /dev/null @@ -1,56 +0,0 @@ -# Challenge 5: Access your services via an ingress controller - -Duration: 30 minutes - -[Previous Challange Solution](./04-Scale-up-solution.md) - **[Home](../README.md)** - -## Task 1: Deploy Wordpress and MySQL - -In case you have not completed challenge 4, follow these steps to deploy Wordpress and MySQL with Persistent Volumes: -[wordpress](https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/) - -## Task 2: Set up Ingress Controller - -NginX Ingress is one of the go-to resources for purposes like ours. An example manifest and all configuration information can be found [here](https://kubernetes.github.io/ingress-nginx/deploy/). - -After getting wordpress and nginx, create an ingress.yaml file for the ingress configuration: - -``` -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: wordpress-ingress - annotations: - kubernetes.io/ingress.class: nginx -spec: - rules: - - http: - paths: - - pathType: Prefix - path: / - backend: - service: - name: wordpress - port: - number: 80 -``` - -then run: - -```bash -kubectl apply -f ingress.yaml -``` - -Get the information about your ingress: - -```bash -kubectl get ingress -``` - -Use the public IP from this info and check if $YOUR_PUBLIC_ID/wp-admin returns the Wordpress login page. - -# Finish - -Congratulations! You finished the MicroHack Operationalize AKS Cluster. We hope you had the chance to learn about Kubernetes Clusters and how to implement them using Azure. If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. - -Thank you for investing the time and see you next time! diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/.gitignore b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/.gitignore deleted file mode 100644 index aa4fadc41..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/.idea/ -**/node_modules -/Flightbooker/flightbooker-frontend/node_modules/ -/Flightbooker/flightbooker-backend/node_modules/ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/00-Getting-started.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/00-Getting-started.md deleted file mode 100644 index 4c448b47c..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/00-Getting-started.md +++ /dev/null @@ -1,101 +0,0 @@ -# Challenge 0: Getting started and setting up the environment - -**[Home](../README.md)** - [Challenge One](./01-Build-and-push-locally.md) - -## Introduction - -Modern microservices typically run on a cloud environment and are the architecture of choice for applications and plattforms. This introduction will tell you more about the topic in general. -This intro will ensure that all pre-requesites and concepts are in place to start planning and deploying the architecture. - -The challenge will be to set up the basic Azure resources we need to achieve our goal of deploying an app based on microservices. For this we need to create a container registry and a container app environment. - -## Architecture - -To have a relateable scenario, we will create a booking system for an airline, where customers can book their seats and receive a bill. - -Real world scenarios can include up to hundreds of microservices within an environment. To keep it as simple as possible we will only work with two microservices for this microhack within a single environment. - -Below you can find the architecture diagram of the application we are going to build: - - - -- Web App front-end application shows users the available seats for the airline and lets them choose their preferred seats: -  - -Customers can click on their preferred amount and location of seats and book them with the "book" Button. The front-end will show an order confirmation and the booked seats will no longer be available for booking: - - -- Backend Web API which contains the business logic of bookings management service and data storage. It stores the seats and carries out the booking process by assigning the status to the chosen seats. - -#### Components - -- Azure resource groups are logical containers for Azure resources. You use a single resource group to structure everything related to this solution in the Azure portal. - -- Azure Container Registry to build and host container images and deploy images from the Azure Container Registry to the Container Apps. - -- Azure Container Apps is a fully managed, serverless container service used to build and deploy modern apps at scale. The underlying Service is Azure Kubernetes which provides you with the needed infrastructure. In this solution, you're hosting all microservices on Azure Container Apps and deploying them into a single Container App environment. This environment acts as a secure boundary around the system. - -- dapr provides a set of APIs that simplify the authoring of microservice applications. Once you enable dapr in Azure Container Apps, it exposes its APIs via a sidecar that works as a reverse proxy for the service. Here we use it for service to service invocation between frontend and backend. - -- Azure Front Door is an application delivery network as a service that offers dynamic site accerleration as well as global load balancing with near real-time failover. - It also works as a global, scalable entry-point to protect and decouple the inner structure from incoming traffic. - -#### Install/Upgrade Azure Container Apps Extension - -To be able to work with Azure Container Apps on the azure CLI you want to make sure you have the Container Apps extension installed. - -Open your PowerShell or Bash console and sign in to Azure from the CLI. - -``` -az login -``` - -If you have multiple Azure subscriptions under your account you need to select the subscription you want to use. - -``` -az account set --subscription -``` - -Ensure your CLI is updated to the latest version. - -``` -az upgrade -``` - -Now you can install/update the Azure Container Apps extension for CLI. - -``` -az extension add --name containerapp --upgrade -``` - -If you haven't already, register the "Microsoft.App" and "Microsoft.OperationalInsights" namespaces. - -``` -az provider register --namespace Microsoft.App -az provider register --namespace Microsoft.OperationalInsights -``` - -#### Challenge - -- Use coherent naming conventions for resources -- Set up an Azure Container registry with admin account -- Create a Container App environment for multiple container apps in West Europe region -- Basic permission concept for accessing resources - -#### Success Criteria - -- Naming convention defined -- Azure container registry is deployed and accessable -- App environment is present -- Permission concept is created - -#### Learning Resources - -- [Microservices with Container Apps and Dapr](https://docs.microsoft.com/en-us/azure/architecture/example-scenario/serverless/microservices-with-container-apps-dapr) -- [Microservices with Azure Container Apps](https://docs.microsoft.com/en-us/azure/container-apps/microservices) -- [Container Registry](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-azure-cli) -- [Container App Environment](https://docs.microsoft.com/en-us/azure/container-apps/environment) - -## Solution - Spoilerwarning - -Challenge 0: [Getting started and setting up the environment](../Solutionguide/00-Getting-started-solution.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/01-Build-and-push-locally.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/01-Build-and-push-locally.md deleted file mode 100644 index 6db5b91a6..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/01-Build-and-push-locally.md +++ /dev/null @@ -1,28 +0,0 @@ -# Challenge 1: Build and push Microservice Images locally - -[Previous Challenge](./00-Getting-started.md) - **[Home](../README.md)** - **[Next Challenge](./02-Azure-Container-Apps.md)** - -## Introduction - -In this Repository we have provided the code for the example application for an airline booking service as described in [Challenge 0](./00-Getting-started.md). -To later be able to deploy them in Container Apps we first have to build images of each microservice via docker and push them to our Azure Container Registry. - -## Challenge - -- Clone subdirectory Flightbooker and push into personal repository -- Create docker images of the microservices -- Push the images to your ACR - -## Success Criteria - -- Application runs locally -- Images are pushed to the ACR -- Images can be pulled from the ACR - -## Learning Resources - -- [Push to Container Registries](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli?tabs=azure-cli) - -## Solution - Spoilerwarning - -Challenge 1: [Build and push Microservice Images locally](../Solutionguide/01-Build-and-push-locally-solution.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/02-Azure-Container-Apps.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/02-Azure-Container-Apps.md deleted file mode 100644 index be1be2ac8..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/02-Azure-Container-Apps.md +++ /dev/null @@ -1,39 +0,0 @@ -# Challenge 2: Deploy Microservices to Azure Container Apps - -[Previous Challenge](./01-Build-and-push-locally.md) - **[Home](../README.md)** - **[Next Challenge](./03-GitHub-Actions.md)** - -## Introduction - -Since our images are now push- and pullable from our registry and the environment is set up, we can deploy our microservices to Azure. As described in the intro, we will be using Azure Container Apps. The Azure Container Apps service enables you to run microservices and containerized applications on a serverless platform. With Container Apps, you enjoy the benefits of running containers while you leave behind the concerns of manually configuring cloud infrastructure and complex container orchestrators. -We also want to enable dapr in our Azure Container Apps, so we can use it for Service to Service invocation between Frontend and Backend. dapr can solve the challenges of where the other services are located, how to call a service securely and how to handle retries in distributed applications by functioning as a reverse proxy. - - -## Challenge - -- Create Container Apps for each microservice -- West Europe as region -- Part of our Container App environment -- Images are pulled from the ACR -- Basic Security is set up -- Set up environment variables for VITE_DAPR_HOST and VITE_DAPR_HTTP_PORT (hint: BookingService.js) -- Set scale to 0-1 replicas -- Activate dapr in Container Apps - -## Success Criteria - -- All Services are deployed in the environment -- The frontend is accessible under public DNS and/or IP -- The frontend can access the backend container app through the environment variables -- If you choose and book seats you'll get a confirmation and seats are no longer available -- Backend is not reachable publicly -- App runs in Container Apps with dapr - -#### Learning Resources - -- [Benefits of Container Apps](https://docs.microsoft.com/en-us/azure/container-apps/compare-options) -- [dapr](https://docs.dapr.io/concepts/overview/) -- [dapr Service Invocation](https://learn.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/service-invocation) - -## Solution - Spoilerwarning - -Challenge 2: [Deploy Microservices to Azure Container App](../Solutionguide/02-Azure-Container-Apps-solution.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/03-GitHub-Actions.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/03-GitHub-Actions.md deleted file mode 100644 index 05ed8dc29..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/03-GitHub-Actions.md +++ /dev/null @@ -1,36 +0,0 @@ -# Challenge 3: Deploy Microservices to Azure Container Apps via GitHub Actions - -[Previous Challenge](./02-Azure-Container-Apps.md) - **[Home](../README.md)** - **[Next Challenge](./04-FrontDoor.md)** - -## Introduction - -Our application is now running on Azure, which is great, but we can still use some tools to optimize it. -So far if we'd make any changes to the source code we would have to build the application locally, create a new image, push it to the Container Registry and create a Revision of the subject Container App manually. To enhance this process we can use GitHub Actions to automate the build and deploy process. -GitHub Actions is designed to help simplify workflows with flexible automation and offer easy-to-use CI/CD capabilities. Building a workflow pipeline with GitHub Actions will make the deployment more efficient and it's possible to automate everything within the GitHub repositories. - -## Challenge - -- Configure GitHub actions to connect to Azure -- Add Action Secrets to GitHub Repository -- Create a build pipeline for frontend and backend that creates an Image of your code and pushes it to the ACR whenever there is a new commit pushed. Basically automate what you've done in Challenge 1. -- Create a deploy pipeline for frontend and backend that deploys the app to the production environment, automating what you've done manually in Challenge 2. - -## Success Criteria - -- GitHub actions is connected to Azure -- Credentials created for Azure -- Credentials created for Azure Container Registry -- Pushing a commit to the GitHub repository automatically triggers the GitHub actions build pipeline -- New builds are pushed to the ACR and deployed to Container Apps automatically -- Triggered Workflows can be followed in the live logs. - - - -## Learning Resources - -- [GitHub Actions](https://resources.github.com/devops/tools/automation/actions/) -- [CI/CD pipeline with GitHub Actions](https://github.blog/2022-02-02-build-ci-cd-pipeline-github-actions-four-steps/) - -## Solution - Spoilerwarning - -Challenge 3: [Deploy Microservices to Azure Container App via GitHub Actions](../Solutionguide/03-GitHub-Actions-solution.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/04-FrontDoor.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/04-FrontDoor.md deleted file mode 100644 index 055467aea..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Challenges/04-FrontDoor.md +++ /dev/null @@ -1,42 +0,0 @@ -# Challenge 4: Integrate Azure Front Door - -[Previous Challenge](./03-GitHub-Actions.md) - **[Home](../README.md)** - -## Introduction - -To be able to use the full potential of Azure for our new application, we want to add Azure Front Door to our environment. Front Door enables you to define, manage, and monitor the global routing for your web traffic by optimizing for top-tier end-user perfomrance and reliability. It includes a range of traffic-routing methods and backend health monitoring options. The health monitoring options include: - -- reports on how your Azure Front Door behaves along with associated Web Application Firewall metrics, -- metrics to help monitor Azure Front Door in real-time to track, troubleshoot, and debug issues and -- protocols to help you track, monitor, and debug your Front Door. Acces logs have information about every request that Front Door receives, Activity logs provide visibility into the operations done, Health Probe logs provide logs for failed probe to origin and Web Application Firewall logs give detailed information of requests that gets logged through detection or prevention mode of a Front door endpoint. - -## Challenge - -- Add Azure Front Door to your platform -- Use Azure for monitoring Access reports -- Use Azure Front Door to monitor Metrics -- Use Azure Front Door to monitor protocols - -## Success Criteria - -- Front Door used in the environment -- Frontend Accesss through Front Door url -- Reports for "Traffic by Domain" within the last week available -- Metrics available -- FrontDoorAccessLog, FrontDoorHealthProbeLog and FrontDoorApplicationFirewallLog accessable - -## Learning Resources - -- [Azure Front Door](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview) -- [Azure Front Door (classic)](https://learn.microsoft.com/en-us/azure/frontdoor/classic-overview) -- [Implementing Front Door](https://learn.microsoft.com/en-us/azure/frontdoor/quickstart-create-front-door) - -## Solution - Spoilerwarning - -Challenge 4: [Integrate Azure Front Door](../Solutionguide/04-FrontDoor-solution.md) - -# Finish - -Congratulations! You finished the MicroHack Serverless Microservices. We hope you had the chance to learn about Microservices and how to implement them using Azure. If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. - -Thank you for investing the time and see you next time! diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/Dockerfile b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/Dockerfile deleted file mode 100644 index aa017b6f1..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM node:lts-alpine -ENV NODE_ENV=production -WORKDIR /usr/src/app -COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] -RUN npm install --production --silent && mv node_modules ../ -COPY . . -EXPOSE 443 -RUN chown -R node /usr/src/app -USER node -CMD ["npm", "start"] \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/README.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/README.md deleted file mode 100644 index 7aaef70f8..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/README.md +++ /dev/null @@ -1,3 +0,0 @@ -to start run: `npm install`, then `npm run dev` or the script from start_backend.ps1 if you want to start the application with dapr -in the terminal in the flightbooker-frontend folder -If it's not working make sure you have installed all necessary npm resources and have docker desktop running. diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/index.js b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/index.js deleted file mode 100644 index 01b069e4e..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/index.js +++ /dev/null @@ -1,119 +0,0 @@ -/* -Execute to initialize: -npm init -(fill in data) - -npm install -for this: -npm install -npm install express -npm install cors - */ - -const express = require("express"); -const cors = require("cors"); -const app = express(); -app.use(cors()); -port = 3000; - -app.use(express.json()); - -const unmodifiedSeatList = [ - { - name: "1A", - status: "free", - }, - { - name: "1B", - status: "free", - }, - { - name: "1C", - status: "free", - }, - { - name: "2A", - status: "free", - }, - { - name: "2B", - status: "free", - }, - { - name: "2C", - status: "free", - }, - { - name: "3A", - status: "free", - }, - { - name: "3B", - status: "free", - }, - { - name: "3C", - status: "free", - }, -]; - -let seatList = [ - { - name: "1A", - status: "free", - }, - { - name: "1B", - status: "free", - }, - { - name: "1C", - status: "free", - }, - { - name: "2A", - status: "free", - }, - { - name: "2B", - status: "free", - }, - { - name: "2C", - status: "free", - }, - { - name: "3A", - status: "free", - }, - { - name: "3B", - status: "free", - }, - { - name: "3C", - status: "free", - }, -]; -app.get("/api/seats", (req, res) => { - res.send(seatList); -}); - -app.post("/api/seat", (req, res) => { - if (req.body && typeof req.body === "object") { - seatList = req.body.map((seat) => ({ - name: String(seat.name), - status: String(seat.status), - })); - } - res.send(seatList); -}); - -app.get("/api/reset", (req, res) => { - seatList = unmodifiedSeatList; - res.send(seatList); -}); - -app.listen(port, () => { - console.log(`Example app listening on port ${port}`); -}); diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/package-lock.json b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/package-lock.json deleted file mode 100644 index e8f944951..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/package-lock.json +++ /dev/null @@ -1,6415 +0,0 @@ -{ - "name": "flightbooker-backend", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "flightbooker-backend", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "cors": "^2.8.5", - "express": "^4.21.1" - }, - "devDependencies": { - "@babel/cli": "^7.23.4", - "@babel/core": "^7.23.7", - "@babel/preset-env": "^7.23.8", - "nodemon": "^3.0.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/cli": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", - "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "commander": "^4.0.1", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/cli/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@babel/cli/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@babel/cli/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "optional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@babel/cli/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@babel/cli/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/cli/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/@babel/cli/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@babel/cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@babel/cli/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "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.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/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==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "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.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001580", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz", - "integrity": "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/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==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", - "dev": true, - "dependencies": { - "browserslist": "^4.22.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.645", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.645.tgz", - "integrity": "sha512-EeS1oQDCmnYsRDRy2zTeC336a/4LZ6WKqvSaM1jLocEk5ZuyszkQtCpsqvuvaIXGOUjwtvF6LTcS8WueibXvSw==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/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==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nodemon": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz", - "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/nodemon/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nodemon/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/nodemon/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/nodemon/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nodemon/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/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==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/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==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/cli": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", - "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true - }, - "@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "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.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "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" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" - }, - "dependencies": { - "@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "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.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001580", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz", - "integrity": "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "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==" - }, - "cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", - "dev": true, - "requires": { - "browserslist": "^4.22.2" - } - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "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" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "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==" - }, - "electron-to-chromium": { - "version": "1.4.645", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.645.tgz", - "integrity": "sha512-EeS1oQDCmnYsRDRy2zTeC336a/4LZ6WKqvSaM1jLocEk5ZuyszkQtCpsqvuvaIXGOUjwtvF6LTcS8WueibXvSw==", - "dev": true - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "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==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "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" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "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" - } - }, - "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" - } - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "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==" - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "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==" - }, - "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "nodemon": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz", - "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" - }, - "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" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "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" - } - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "requires": { - "side-channel": "^1.0.6" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "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": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "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" - } - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "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==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^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==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/package.json b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/package.json deleted file mode 100644 index 8687c5bbb..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "dependencies": { - "cors": "^2.8.5", - "express": "^4.21.1" - }, - "name": "flightbooker-backend", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "npm run build && node dist/index.js", - "build": "babel index.js -d dist", - "dev": "nodemon ./index.js localhost 3000" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/lxm11r/ServerlessMicroservices.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/lxm11r/ServerlessMicroservices/issues" - }, - "devDependencies": { - "@babel/cli": "^7.23.4", - "@babel/core": "^7.23.7", - "@babel/preset-env": "^7.23.8", - "nodemon": "^3.0.3" - }, - "homepage": "https://github.com/lxm11r/ServerlessMicroservices#readme", - "description": "" -} \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/start_backend.ps1 b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/start_backend.ps1 deleted file mode 100644 index 6acd88f37..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/start_backend.ps1 +++ /dev/null @@ -1 +0,0 @@ -dapr run --app-port 3000 --app-id flightbooker-backend --app-protocol http --dapr-http-port 3501 -- npm start \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/start_backend.sh b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/start_backend.sh deleted file mode 100644 index 6acd88f37..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-backend/start_backend.sh +++ /dev/null @@ -1 +0,0 @@ -dapr run --app-port 3000 --app-id flightbooker-backend --app-protocol http --dapr-http-port 3501 -- npm start \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/Dockerfile b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/Dockerfile deleted file mode 100644 index 61b4130f0..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM node:lts-alpine -ENV NODE_ENV=production -WORKDIR /usr/src/app -COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] -RUN npm install --production --silent && mv node_modules ../ -COPY . . - -EXPOSE 5173 - -RUN chown -R node /usr/src/app -USER node - -CMD ["npm", "start"] diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/README.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/README.md deleted file mode 100644 index 63f526e4d..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/README.md +++ /dev/null @@ -1,3 +0,0 @@ -to start run: `npm install`, `npm run dev` or the script from start_frontend.ps1 if you want to start the application with dapr -in the terminal in the flightbooker-frontend folder -If it's not working make sure you have installed all necessary npm resources and have docker desktop running. diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/index.html b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/index.html deleted file mode 100644 index 030a6ff51..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite App - - - - - - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/package-lock.json b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/package-lock.json deleted file mode 100644 index 652e9dfa7..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/package-lock.json +++ /dev/null @@ -1,1586 +0,0 @@ -{ - "name": "hello-world", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "hello-world", - "version": "1.0.0", - "dependencies": { - "@vitejs/plugin-vue": "^5.0.3", - "axios": "^1.7.4", - "vite": "^5.4.8", - "vue": "^3.4.15", - "vuex": "^4.1.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", - "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", - "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", - "dependencies": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", - "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", - "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.7", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", - "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", - "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz", - "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==" - }, - "node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", - "dependencies": { - "@vue/shared": "3.4.21" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", - "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", - "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", - "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "vue": "3.4.21" - } - }, - "node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/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==" - }, - "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", - "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vuex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", - "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", - "dependencies": { - "@vue/devtools-api": "^6.0.0-beta.11" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - } - }, - "dependencies": { - "@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==" - }, - "@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "optional": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", - "optional": true - }, - "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", - "optional": true - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "@vitejs/plugin-vue": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", - "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", - "requires": {} - }, - "@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", - "requires": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", - "requires": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "@vue/compiler-sfc": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", - "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", - "requires": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.7", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" - } - }, - "@vue/compiler-ssr": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", - "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", - "requires": { - "@vue/compiler-dom": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "@vue/devtools-api": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz", - "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==" - }, - "@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", - "requires": { - "@vue/shared": "3.4.21" - } - }, - "@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", - "requires": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", - "requires": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", - "csstype": "^3.1.3" - } - }, - "@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", - "requires": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "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" - } - }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "requires": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, - "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" - } - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "optional": true - }, - "magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "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" - } - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" - }, - "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" - }, - "postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - } - }, - "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==" - }, - "rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "requires": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - }, - "vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", - "requires": { - "esbuild": "^0.21.3", - "fsevents": "~2.3.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - } - }, - "vue": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", - "requires": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "vuex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", - "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", - "requires": { - "@vue/devtools-api": "^6.0.0-beta.11" - } - } - } -} diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/package.json b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/package.json deleted file mode 100644 index 2e6e62336..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "flightbooker-frontend", - "version": "1.0.0", - "scripts": { - "dev": "vite --host", - "build": "vite build", - "preview": "vite preview --port 4173", - "start": "vite --host --port 5173" - }, - "dependencies": { - "axios": "^1.7.4", - "vue": "^3.4.15", - "vuex": "^4.1.0", - "@vitejs/plugin-vue": "^5.0.3", - "vite": "^5.4.8" - } -} \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/App.vue b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/App.vue deleted file mode 100644 index c335a4f71..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/App.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/base.css b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/base.css deleted file mode 100644 index 71dc55a3c..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/base.css +++ /dev/null @@ -1,74 +0,0 @@ -/* color palette from */ -:root { - --vt-c-white: #ffffff; - --vt-c-white-soft: #f8f8f8; - --vt-c-white-mute: #f2f2f2; - - --vt-c-black: #181818; - --vt-c-black-soft: #222222; - --vt-c-black-mute: #282828; - - --vt-c-indigo: #2c3e50; - - --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); - --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); - --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); - --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); - - --vt-c-text-light-1: var(--vt-c-indigo); - --vt-c-text-light-2: rgba(60, 60, 60, 0.66); - --vt-c-text-dark-1: var(--vt-c-white); - --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); -} - -/* semantic color variables for this project */ -:root { - --color-background: var(--vt-c-white); - --color-background-soft: var(--vt-c-white-soft); - --color-background-mute: var(--vt-c-white-mute); - - --color-border: var(--vt-c-divider-light-2); - --color-border-hover: var(--vt-c-divider-light-1); - - --color-heading: var(--vt-c-text-light-1); - --color-text: var(--vt-c-text-light-1); - - --section-gap: 160px; -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--vt-c-black); - --color-background-soft: var(--vt-c-black-soft); - --color-background-mute: var(--vt-c-black-mute); - - --color-border: var(--vt-c-divider-dark-2); - --color-border-hover: var(--vt-c-divider-dark-1); - - --color-heading: var(--vt-c-text-dark-1); - --color-text: var(--vt-c-text-dark-2); - } -} - -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - position: relative; - font-weight: normal; -} - -body { - min-height: 100vh; - color: var(--color-text); - background: var(--color-background); - transition: color 0.5s, background-color 0.5s; - line-height: 1.6; - font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, - Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - font-size: 15px; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/logo.svg b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/logo.svg deleted file mode 100644 index bc826fed8..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/main.css b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/main.css deleted file mode 100644 index c133f9156..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/assets/main.css +++ /dev/null @@ -1,35 +0,0 @@ -@import "./base.css"; - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - - font-weight: normal; -} - -a, -.green { - text-decoration: none; - color: hsla(160, 100%, 37%, 1); - transition: 0.4s; -} - -@media (hover: hover) { - a:hover { - background-color: hsla(160, 100%, 37%, 0.2); - } -} - -@media (min-width: 1024px) { - body { - display: flex; - place-items: center; - } - - #app { - display: grid; - grid-template-columns: 1fr 1fr; - padding: 0 2rem; - } -} diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Button.vue b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Button.vue deleted file mode 100644 index 9d052b15c..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Button.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - Book Seats - - - - - - - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Modal.vue b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Modal.vue deleted file mode 100644 index 89e279270..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Modal.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - Booking receipt - - - - - You have booked the following seats: - - - {{ seat.name }} - - - - - - - - - - - - - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Seat.vue b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Seat.vue deleted file mode 100644 index f942b1392..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Seat.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - {{ seat.name }} - - - - - - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/SeatMap.vue b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/SeatMap.vue deleted file mode 100644 index a58e01ff5..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/SeatMap.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Title.vue b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Title.vue deleted file mode 100644 index ed801b356..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/components/Title.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - - - MicroAir Booking Service - For reservation choose one or more seats. - - - - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/main.js b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/main.js deleted file mode 100644 index c250261f7..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/main.js +++ /dev/null @@ -1,7 +0,0 @@ -import { createApp } from 'vue' -import { store } from './store' -import App from './App.vue' - -import './assets/main.css' - -createApp(App).use(store).mount('#app') diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/services/BookingService.js b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/services/BookingService.js deleted file mode 100644 index ddc4a8e88..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/services/BookingService.js +++ /dev/null @@ -1,27 +0,0 @@ -import axios from "axios"; - -const DAPR_HOST = import.meta.env.VITE_DAPR_HOST || "http://localhost"; -const DAPR_HTTP_PORT = import.meta.env.VITE_DAPR_HTTP_PORT || "3000"; - -let axiosConfig = { - headers: { - "dapr-app-id": "flightbooker-backend", - }, -}; - -export async function getAllSeats() { - const response = await axios.get( - `${DAPR_HOST}:${DAPR_HTTP_PORT}/api/seats`, - axiosConfig - ); - return response.data; -} - -export async function bookSeat(data) { - const response = await axios.post( - `${DAPR_HOST}:${DAPR_HTTP_PORT}/api/seat`, - data, - axiosConfig - ); - return response.data; -} diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/store/index.js b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/store/index.js deleted file mode 100644 index 9693eac70..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/src/store/index.js +++ /dev/null @@ -1,63 +0,0 @@ -import { bookSeat, getAllSeats } from "@/services/BookingService"; -import { createStore } from "vuex"; - -// Create a new store instance. -export const store = createStore({ - state: { - selected: [], - selectedCount: 0, - seatList: [], - }, - mutations: { - SET_SEATS(state, seats) { - state.seatList = seats; - }, - BOOK_SEATS(state, seats) { - state.seatList = seats; - }, - ADD(state, payload) { - state.selected = payload; - }, - REMOVE(state, payload) { - state.selected = payload; - }, - COUNT(state, payload) { - state.selectedCount += payload; - }, - RESET_COUNT(state) { - state.selectedCount = 0; - }, - }, - actions: { - getSeats({ commit }) { - getAllSeats().then((seats) => { - commit("SET_SEATS", seats); - }); - }, - bookSeats({ commit }, payload) { - bookSeat({ payload }).then((seats) => { - commit("BOOK_SEATS", seats); - }); - }, - add(context, payload) { - const selected = context.state.selected; - selected.push(payload); - context.commit("ADD", selected); - }, - remove(context, payload) { - const selected = context.state.selected; - for (var i = 0; i < selected.length; i++) { - if (selected[i] == payload) { - selected.splice(i, 1); - } - } - context.commit("REMOVE", selected); - }, - count(context, payload) { - context.commit("COUNT", payload); - }, - resetCount(context) { - context.commit("RESET_COUNT"); - }, - }, -}); diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/start_frontend.ps1 b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/start_frontend.ps1 deleted file mode 100644 index 50c055dca..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/start_frontend.ps1 +++ /dev/null @@ -1 +0,0 @@ -dapr run --app-port 5173 --app-id flightbooker-frontend --app-protocol http --dapr-http-port 3501 -- npm run dev \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/start_frontend.sh b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/start_frontend.sh deleted file mode 100644 index 286f754b6..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/start_frontend.sh +++ /dev/null @@ -1 +0,0 @@ -dapr run --app-port 5173 --app-id flightbooker-frontend --app-protocol http --dapr-http-port 3502 -- npm run dev \ No newline at end of file diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/vite.config.js b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/vite.config.js deleted file mode 100644 index d16f2761a..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Flightbooker/flightbooker-frontend/vite.config.js +++ /dev/null @@ -1,17 +0,0 @@ -import { fileURLToPath, URL } from 'node:url' - -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [vue()], - server: { - port: 5173 - }, - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) - } - } -}) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/Challenge0-Env.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/Challenge0-Env.png deleted file mode 100644 index a1ee51ffa..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/Challenge0-Env.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/README.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/README.md deleted file mode 100644 index 8b1378917..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/README.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/booking-receipt.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/booking-receipt.png deleted file mode 100644 index 08aa5c80f..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/booking-receipt.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-disabled.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-disabled.png deleted file mode 100644 index d2a24e097..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-disabled.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-enabled.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-enabled.png deleted file mode 100644 index 77400c4b1..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-enabled.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-service-invocation.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-service-invocation.png deleted file mode 100644 index 525873c2c..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/dapr-service-invocation.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/flightbooker-frontend.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/flightbooker-frontend.png deleted file mode 100644 index 20296a14a..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/flightbooker-frontend.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-basics.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-basics.png deleted file mode 100644 index 97bc2c91b..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-basics.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-create.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-create.png deleted file mode 100644 index e7d48402c..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-create.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-endpoint.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-endpoint.png deleted file mode 100644 index 2b0a6d919..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-endpoint.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-origin.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-origin.png deleted file mode 100644 index 6a4be7c87..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-origin.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-origingroup.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-origingroup.png deleted file mode 100644 index 21d77e9ef..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-origingroup.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-route.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-route.png deleted file mode 100644 index 9cbeba1ca..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/frontdoor-route.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/github-actions.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/github-actions.png deleted file mode 100644 index 30bc873e7..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/github-actions.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/ingress.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/ingress.png deleted file mode 100644 index 2f97837d5..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/ingress.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/seatarray.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/seatarray.png deleted file mode 100644 index 7b81efc17..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/seatarray.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/serverless-architectur-reduced.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/serverless-architectur-reduced.png deleted file mode 100644 index 949458fc1..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/serverless-architectur-reduced.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/serverless-architecture.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/serverless-architecture.png deleted file mode 100644 index 436f429d1..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/serverless-architecture.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/tagged-docker-images.png b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/tagged-docker-images.png deleted file mode 100644 index 63f8e77cf..000000000 Binary files a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Images/tagged-docker-images.png and /dev/null differ diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/README.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/README.md deleted file mode 100644 index 67b52f114..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Build a serverless microservices architecture - -## Introduction and context - -In this MicroHack we will build a serverless microservices architecture. - -Microservices are self-contained modules that handle independent services and can be developed, tested, deployed, scaled, and monitored independently. -A serverless architecture is a model within cloud computing where the service provider manages the infrastructure, so developers don't have to worry about provisioning servers and can focus on the code itself. -In summary, serverless microservices are independent modules deployed within a serverless infrastructure and run only when they are needed by the application which minimizes the costs. - -## Learning Objectives - -In this hack you will learn how to set up a whole microservice architecture in a small scenario in your own environment. Once we deployed the basic application, we will take a look at Azure Frontdoor and gain more insights, on how to monitor and manage your new setup. - -## Content and Challenges - -- Challenge 0: [Getting started and setting up the environment](./Challenges/00-Getting-started.md) -- Challenge 1: [Build and push Microservice Images locally](./Challenges/01-Build-and-push-locally.md) -- Challenge 2: [Deploy Microservices to Azure Container App](./Challenges/02-Azure-Container-Apps.md) -- Challenge 3: [Deploy Microservices to Azure Container App via GitHub Actions](./Challenges/03-GitHub-Actions.md) -- Challenge 4: [Integrate Azure Front Door](./Challenges/04-FrontDoor.md) - -## Prerequisites - -- VS Code -- Azure Subscription -- Azure CLI -- Resource Group with contributor rights -- GitHub with GitHub Actions -- Docker [(with WSL2 backend)](https://docs.docker.com/desktop/windows/wsl/) - -## Solution Guide - -- Challenge 0: [Getting started and setting up the environment](./Solutionguide/00-Getting-started-solution.md) -- Challenge 1: [Build and push Microservice Images locally](./Solutionguide/01-Build-and-push-locally-solution.md) -- Challenge 2: [Deploy Microservices to Azure Container App](./Solutionguide/02-Azure-Container-Apps-solution.md) -- Challenge 3: [Deploy Microservices to Azure Container App via GitHub Actions](./Solutionguide/03-GitHub-Actions-solution.md) -- Challenge 4: [Integrate Azure Front Door](./Solutionguide/04-FrontDoor-solution.md) - -## Contributor - -Denis Kurkov -Leonie Möller -Maximilian Schaugg -Rasmus Pranke -Judith Högerl diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/00-Getting-started-solution.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/00-Getting-started-solution.md deleted file mode 100644 index e08dbd7f5..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/00-Getting-started-solution.md +++ /dev/null @@ -1,41 +0,0 @@ -# Exercise 0: Set up the Environment - -**[Home](../README.md)** - [Next Challenge Solution](01-Build-and-push-locally-solution.md) - -## Task 1: Set up an Azure Container Registry with admin account - -First, you have to create a [Resource Group](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-cli) - -The second step is to create a Container Registry. There are multiple options to achieve this, e.g. via the Azure portal or using the Azure CLI. In this challenge will use the Azure CLI: - -``` -az acr create ` - --resource-group $RESOURCE_GROUP ` - --name $ACR_NAME ` - --sku Basic ` - --admin-enabled true -``` - -The Resource Group and Container Registry names are global variables, you should set them in advance and replace them with the actual names. -With the -`--sku Basic` -you are setting the basic permission concept. - -If you'd like to do it with the Azure Portal (or any other way) you can find a tutorial [here](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal?tabs=azure-cli). - -## Task 2: Create a Container App environment for multiple container apps in West Europe Region - -A Container App Environment like the Container Registry can be setup in several ways. Using the azure CLI it would be: - -``` -az containerapp env create ` - --name $ENVIRONMENT ` - --resource-group $RESOURCE_GROUP` - --location "westeurope" -``` - -In this example we used $ACR_NAME=flightbookeracr,$RESOURCE_GROUP=ServerlessMicroservices and $ENVIRONMENT=Flightbooker-env but you are free to choose your own names. - -## Next Challenge - -Challenge 1: [Build and push Microservice Images locally](../Challenges/01-Build-and-push-locally.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/01-Build-and-push-locally-solution.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/01-Build-and-push-locally-solution.md deleted file mode 100644 index 63c72a1cb..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/01-Build-and-push-locally-solution.md +++ /dev/null @@ -1,180 +0,0 @@ -# Challenge 1: Build and push Microservice Images locally - -Duration: 25 minutes - -[Previous Challange Solution](./00-Getting-started-solution.md) - **[Home](../README.md)** - [Next Challenge Solution](./02-Azure-Container-Apps-solution.md) - -## Task 1: Clone the FlightBooker Folder from this Repository - -If you are using VS Code make sure you are connected to your gitHub account. -Then you can use the terminal or the command palette to clone the repository. -In order to optimize your workflow for the upcoming challenges create a new gitHub repository in your own account and copy only the ServerlessMicroservices or even only the Flightbooker folder into it. This way you can easily make changes and follow the Challenges. - -You can check if the services run locally on you Computer. Therefore, navigate to the frontend folder in your terminal and execute the command `npm install`. In a second terminal navigate to the backend folder and do the same. After that you should be able to run `npm run dev` in the frontend terminal and `npm start` in the backend terminal and open the application on your localhost. If this doesn't work, check if you have installed all dependencies. - -## Task 2: Create Docker images of the microservices - -The next step would be to add Docker files and build a Docker image for each microservice. -You can find how to add Docker files and build images [here](https://learn.microsoft.com/en-us/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-04) which is applied on our case below: - -The general process for the frontend and backend is the same. Make sure you have docker running, for example via Docker Desktop. If you work with VS Code also make sure you have the Docker extension. In VS Code open the Command Palette and type `add docker files to workspace` then select the Docker: Add Docker files to workspace command. In the following chose Node.js as the application platform, the respective package.json file, port 3000 for the backend (5173 for the frontend) and no Docker Compose file. -This will create a Dockerfile and a .dockerignore. Now that you have the basic Dockerfiles you might have to make some changes so that the image created from them will be able to run. Here's how they could look like: - -### Docker image backend - -``` -FROM node:lts-alpine -ENV NODE_ENV=production -WORKDIR /usr/src/app -COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] -RUN npm install --production --silent && mv node_modules ../ -COPY . . -EXPOSE 443 -RUN chown -R node /usr/src/app -USER node -CMD ["npm", "start"] -``` - -### Docker image frontend - -``` -FROM node:lts-alpine -WORKDIR /app -ENV PATH /app/node_modules/.bin:$PATH -COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] -RUN npm install -COPY . . -EXPOSE 5173 -CMD ["npm", "run", "dev"] -``` - -To build the Docker image again open the Command Palette and run `Docker Images: Build Image` and choose the right Dockerfile to build the image. This will open the Terminal with the `docker build`command. Once that's done you can go to the Docker Explorer and under Images your newly created Docker image will appear. - -### include tag - -To be able to push the image to the azure registry, you must tag it with the registry name. So open your VS Code's task file at `./vscode/tasks.json` and find the task with the type docker-build. Add the tag property, using your registry name (in this case flightbookeracr) in the `dockerBuild` property. - -``` -{ - "type": "docker-build", - "label": "docker-build-backend", - "platform": "node", - "dockerBuild": { - "dockerfile": "${workspaceFolder}/Dockerfile", - "context": "${workspaceFolder}", - "pull": true, - "tag": "YOUR-REGISTRY-NAME.azurecr.io/flightbookerbackend:latest" - } -}, -``` - -Since we need this for both frontend and backend we need this and all docker tasks twice (or you work in two different VS Code instances alternatively). If you only work with one this is how the tasks.json could look like: - -``` -{ - "version": "2.0.0", - "tasks": [ - { - "type": "docker-build", - "label": "docker-build-frontend", - "platform": "node", - "dockerBuild": { - "dockerfile": "${workspaceFolder}/Flightbooker/flightbooker-frontend/Dockerfile", - "context": "${workspaceFolder}/Flightbooker/flightbooker-frontend", - "pull": true, - "tag": "flightbookeracr.azurecr.io/flightbookerfrontend:latest" - }, - "node": { - "package": "${workspaceFolder}/Flightbooker/flightbooker-frontend/package.json" - } - }, - { - "type": "docker-run", - "label": "docker-run: release", - "dependsOn": [ - "docker-build-frontend" - ], - "platform": "node", - "node": { - "package": "${workspaceFolder}/Flightbooker/flightbooker-frontend/package.json" - } - }, - { - "type": "docker-run", - "label": "docker-run: debug", - "dependsOn": [ - "docker-build-frontend" - ], - "dockerRun": { - "env": { - "DEBUG": "*", - "NODE_ENV": "development" - } - }, - "node": { - "package": "${workspaceFolder}/Flightbooker/flightbooker-frontend/package.json", - "enableDebugging": true - } - }, - - { - "type": "docker-build", - "label": "docker-build-backend", - "platform": "node", - "dockerBuild": { - "dockerfile": "${workspaceFolder}/Flightbooker/flightbooker-backend/Dockerfile", - "context": "${workspaceFolder}/Flightbooker/flightbooker-backend", - "pull": true, - "tag": "flightbookeracr.azurecr.io/flightbookerbackend:latest" - }, - "node": { - "package": "${workspaceFolder}/Flightbooker/flightbooker-backend/package.json" - } - }, - { - "type": "docker-run", - "label": "docker-run: release", - "dependsOn": [ - "docker-build-backend" - ], - "platform": "node", - "node": { - "package": "${workspaceFolder}/Flightbooker/flightbooker-backend/package.json" - } - }, - { - "type": "docker-run", - "label": "docker-run: debug", - "dependsOn": [ - "docker-build-backend" - ], - "dockerRun": { - "env": { - "DEBUG": "*", - "NODE_ENV": "development" - } - }, - "node": { - "package": "${workspaceFolder}/Flightbooker/flightbooker-backend/package.json", - "enableDebugging": true - } - } - ] -} -``` - -Now we have to build both our images again. You can do this the same way as described above. - -## Task 3: Push images to your ACR - -The previous [link](https://learn.microsoft.com/en-us/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-04) also includes a tutorial on how to push the image to a registry. - -In our Docker explorer there should now be two images with the registry name in front of them like `flightbookeracr.azurecr.io/flightbooker-backend`. If you expand them and right-click latest you can select Push and accept the tag which will push the images to your azure registry that you specified in the image name. - -If the output displays "Authentication required" run az acr login --name $REGISTRY_NAME in the terminal. - -Now you can check in your Azure portal if the Images got pushed to the registry by going to the registry and from there to Repositories under Services. Alternatively they should also be visible in the Docker extension explorer under the Registries node. - -## Next Challenge - -Challenge 2: [Deploy Microservices to Azure Container App](../Challenges/02-Azure-Container-Apps.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/02-Azure-Container-Apps-solution.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/02-Azure-Container-Apps-solution.md deleted file mode 100644 index c1bce2741..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/02-Azure-Container-Apps-solution.md +++ /dev/null @@ -1,99 +0,0 @@ -# Challenge 2: Deploy Microservices to Azure Container App - -Duration: 20 minutes - -[Previous Challenge Solution](01-Build-and-push-locally-solution.md) - **[Home](../README.md)** - [Next Challenge Solution](03-GitHub-Actions-solution.md) - -## Task 1: Create Container Apps for each microservice with the images from the ACR - -You can create a container app with the Azure portal or with the Azure CLI. - -For the backend your CLI code should look something like this: - -``` -az containerapp create ` - --name flightbooker-backend ` - --resource-group $RESOURCE_GROUP ` - --environment $CONTAINERAPPS_ENVIRONMENT ` - --registry-server "$ACR_NAME.azurecr.io"` - --image "$ACR_NAME.azurecr.io/flightbookerbackend:latest"` - --target-port 3000` - --ingress 'internal' ` - --query properties.configruation.ingress.fqdn -``` - -If you want to check if the backend is working properly you can also for now set the ingress to 'external' and change it later on. -When the deployment of the backend is finished you will receive an application URL (FQDN) visible on the overview page of your new container app. If ingress is set to external you can open it with '/api/seats' appended and you will see the an array with the seats like this: - - - -Before you can deploy the frontend you need to take some additional steps since the frontend needs to be able to access the backend. Copy the FQDN of your backend Container App. In VS Code create a .env file in the flightbooker-frontend folder. There you create two environment variables: - -``` -VITE_DAPR_HOST='YOUR_BACKEND_FQDN' -VITE_DAPR_HTTP_PORT='443' -``` - -This will connect the variables in the BookingService.js with your environment variables and instead of the localhost the frontend will access the backend container app. - -Now you can begin to deploy the frontend: - -``` -az containerapp create ` - --name flightbooker-frontend ` - --resource-group $RESOURCE_GROUP` - --environment $CONTAINERAPPS_ENVIRONMENT` - --image "$ACR_NAME.azurecr.io/flightbookerfrontend:latest"` - --registry-server "$ACR_NAME.azurecr.io"` - --env-vars VITE_DAPR_HOST=https://$(az containerapp show --resource-group $RESOURCE_GROUP --name flightbooker-backend --query properties.configuration.ingress.fqdn -o tsv) VITE_DAPR_HTTP_PORT=443` - --target-port 5173` - --ingress 'external' ` - --query properties.configruation.ingress.fqdn -``` - -Instead of the query in the VITE_DAPR_HOST you can also again just copy and paste your backend FQDN. - -In this case we want to have just one replica available so go to the Scale section und the Application tag in your newly deployed frontend and change the scale to 0-1. - -To deploy the apps with the portal, take a look [here](https://learn.microsoft.com/en-us/azure/container-apps/get-started-existing-container-image-portal?pivots=container-apps-private-registry). - -For a method using a service principal and key vault, you can find a solution [here](https://learn.microsoft.com/en-us/azure/container-instances/container-instances-using-azure-container-registry). - -After deployment you can copy the Application URL (FQDN) of the frontend container app and open it in your browser and you should be able to browse the frontend web app. - -## Task 2: Setup basic Security - -If you set up the backend ingress to "internal", it won't be reachable from the public internet but only from applications deployed within your Azure Container Environment. -If you set it to external first you can change it under the Ingress tab in your backend container app to disable external ingress. - - - -## Task 3: Activate dapr in your Container Apps - -So far dapr was not enabled on the Azure Container Apps we provisioned. You can check this in the Portal and it should look something like this: - - -To enable dapr for both Apps, run the following commands: - -``` -az containerapp dapr enable --name "flightbooker-backend" ` - --resource-group $RESOURCE_GROUP` - --dapr-app-id "flightbooker-backend"` - --dapr-app-port 443 - -az containerapp dapr enable --name "flightbooker-frontend" ` - --resource-group $RESOURCE_GROUP` - --dapr-app-id "flightbooker-frontend" ` - --dapr-app-port 5173 -``` - -Or you can just enable it in the portal: - - - -For more dapr configurations look [here](https://learn.microsoft.com/en-us/azure/container-apps/dapr-overview?tabs=bicep1%2Cyaml). -With this you should be able to access the Frontend Web App and call the backend API app using dapr. This is a [Service-to-Service invocation](https://learn.microsoft.com/en-us/azure/container-apps/microservices-dapr-service-invoke?pivots=nodejs). - -## Next Challenge - -Challenge 3: [Deploy Microservices to Azure Container App via GitHub Actions](../Challenges/03-GitHub-Actions.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/03-GitHub-Actions-solution.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/03-GitHub-Actions-solution.md deleted file mode 100644 index 97b2ddb75..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/03-GitHub-Actions-solution.md +++ /dev/null @@ -1,194 +0,0 @@ -# Challenge 3: Deploy Microservices to Azure Container App via GitHub Actions - -Duration: 30 minutes - -[Previous Challenge Solution](02-Azure-Container-Apps-solution.md) - **[Home](../README.md)** - [Next Challenge Solution](04-FrontDoor-solution.md) - -## Task 1: Connect GitHub Actions to Azure - -From the Azure CLI run the following code: - -``` -az ad sp create-for-rbac ` - --name "FlightBookerSP" - --role "contributor" - --scopes "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP" ` - --sdk-auth -``` - -For $SUBSCRIPTION_ID and $RESOURCE_GROUP use your respectable ones. -Copy the JSON output for the next step. - -To create a Service Principal you have to have owner role over the azure subscription you're working in. If you don't have that you will not be able to do the deployment automatically via GitHub actions but the build pipeline should still be possible. - -## Task 2: Create credentials for Azure - -To use Azure Credentials in GitHub Actions we need to create some secrets. In GitHub go to your repository and select "Settings", then "Secrets" and then "Actions". Create a "New Repository Secret". -Name it for example "FLIGHTBOOKER_AZURE_CREDENTIALS" and paste the copied JSON. - -## Task 3: Create credentials for Azure Container Registry - -To be able to build, push and pull images with GitHub actions you will also need a secret for the ACR username and password. - -To get the username and password use the following command or look it up in the Azure Portal: -`az acr credential show -n $ACR-NAME` - - -Now create two more secrets like in Task 2, one named "FLIGHTBOOKER_REGISTRY_USERNAME" and the other "FLIGHTBOOKER_REGISTRY_PASSWORD" where you save the respective values. - -## Task 4: Create GitHub Action for Backend - -Create a new folder at your project root called ".github/workflows". Then create a .yaml file for your Backend build and deploy GitHub Action. You have to change all of "flightbookeracr" to the name you gave for $ACR_NAME and ServerlessMicroservices to the name you gave to $RESOURCE_GROUP. - -``` -name: flightbooker-backend deployment - -# When this action will be executed -on: - # Automatically trigger it when detected changes in repo - push: - branches: - [ main ] - paths: - - 'FlightBooker/flightbooker-backend/**' - - '.github/workflows/build-deploy-backend.yaml' - - # Allow mannually trigger - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout to the branch - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Log in to container registry - uses: docker/login-action@v1 - with: - registry: flightbooker.azurecr.io - username: ${{ secrets.FLIGHTBOOKER_REGISTRY_USERNAME }} - password: ${{ secrets.FLIGHTBOOKER_REGISTRY_PASSWORD }} - - - name: Build and push container image to registry - uses: azure/docker-login@v1 - with: - login-server: flightbooker-azurecr.io - username: ${{ secrets.FLIGHTBOOKER_REGISTRY_USERNAME }} - password: ${{ secrets.FLIGHTBOOKER_REGISTRY_PASSWORD }} - - run: | - cd Flightbooker/flightbooker-backend - docker build . -t flightbookeracr.azurecr.io/flightbookerbackend:latest - docker push flightbookeracr.azurecr.io/flightbookerbackend:latest - - deploy: - runs-on: ubuntu-latest - needs: build - - steps: - - name: Azure Login - uses: azure/actions/login@v1 - with: - creds: ${{ secrets.FLIGHTBOOKER_AZURE_CREDENTIALS }} - - - - name: Deploy to containerapp - uses: azure/CLI@v1 - with: - inlineScript: | - az config set extension.use_dynamic_install=yes_without_prompt - az containerapp registry set -n flightbooker-backend -g ServerlessMicroservices --server flightbookeracr.azurecr.io --username ${{ secrets.FLIGHTBOOKER_REGISTRY_USERNAME }} --password ${{ secrets.FLIGHTBOOKER_REGISTRY_PASSWORD }} - az containerapp update -n flightbooker-backend -g ServerlessMicroservices --image flightbookeracr.azurecr.io/flightbookerbackend:latest -``` - -## Task 5: Create GitHub Actions for Frontend - -We need to create a similar file for the frontend: - -``` -name: flightbooker-frontend deployment - -# When this action will be executed -on: - # Automatically trigger it when detected changes in repo - push: - branches: - [ main ] - paths: - - 'Flightbooker/flightbooker-frontend/**' - - '.github/workflows/build-deploy-frontend.yaml' - - # Allow mannually trigger - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout to the branch - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Log in to container registry - uses: docker/login-action@v1 - with: - registry: flightbookeracr.azurecr.io - username: ${{ secrets.FLIGHTBOOKER_REGISTRY_USERNAME }} - password: ${{ secrets.FLIGHTBOOKER_REGISTRY_PASSWORD }} - - - name: Build and push container image to registry - uses: azure/docker-login@v1 - with: - login-server: flightbookeracr.azurecr.io - username: ${{ secrets.FLIGHTBOOKER_REGISTRY_USERNAME }} - password: ${{ secrets.FLIGHTBOOKER_REGISTRY_PASSWORD }} - - run: | - cd Flightbooker/flightbooker-frontend - docker build . -t flightbookeracr.azurecr.io/flightbookerfrontend:latest - docker push flightbookeracr.azurecr.io/flightbookerfrontend:latest - - - deploy: - runs-on: ubuntu-latest - needs: build - - steps: - - name: Azure Login - uses: azure/actions/login@v1 - with: - creds: ${{ secrets.FLIGHTBOOKER_AZURE_CREDENTIALS }} - - - - name: Deploy to containerapp - uses: azure/CLI@v1 - with: - inlineScript: | - az config set extension.use_dynamic_install=yes_without_prompt - az containerapp registry set -n flightbooker-frontend -g ServerlessMicroservices --server flightbookeracr.azurecr.io --username ${{ secrets.FLIGHTBOOKER_REGISTRY_USERNAME }} --password ${{ secrets.FLIGHTBOOKER_REGISTRY_PASSWORD }} - az containerapp update -n flightbooker-frontend -g ServerlessMicroservices --image flightbookeracr.azurecr.io/flightbookerfrontend:latest -``` - -What exactly is happening in the build: - -- step 1: checks out the branch in our repository -- step 2: sets up the docker builder so we are able to build the image later -- step 3: logs in to our azure container registry -- step 4: navigating to the right folder, then building the docker image and pushing it to the container registry - -What exactly is happening in the deploy: - -- step 1: logs into azure subscription using the credentials from the Service Principal stored in GitHub action secrets -- step 2: Uses azure CLI to deploy/update the Azure Container App and deploy a new revision - -With this in place, you can commit your work and the GitHub action should be triggered, if all is configured correctly. You should also be able to see the results in the GitHub Actions workflows tab as well and the Azure Container App should be updated which you can see in the logs. - -## Next Challenge - -Challenge 4: [Integrate Azure Front Door](../Challenges/04-FrontDoor.md) diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/04-FrontDoor-solution.md b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/04-FrontDoor-solution.md deleted file mode 100644 index 1b819d832..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/Solutionguide/04-FrontDoor-solution.md +++ /dev/null @@ -1,94 +0,0 @@ -# Challenge 4: Integrate Azure Front Door - -Duration: 15 minutes - -[Previous Challenge Solution](03-GitHub-Actions-solution.md) - **[Home](../README.md)** - -## Task 1: Add Azure FrontDoor to your platform - -A quickstart for setting up Azure Front Door with Azure Portal, CLI, PowerShell or Bicep for your App Service you can find [here](https://learn.microsoft.com/en-us/azure/frontdoor/create-front-door-portal) under the "Create a Front Door for your application" section. - -1. Search for Front Door and CDN profiles and select Create. Since we already have an application you can select Custom create and continue. - - - -2. On the Basics tab enter the following information (or adjust them to your settings) and then select Next:Secrets. In the subscription field choose the subscription you also used to create the Microservices. Same goes for the resource group. - - - -3. We can skip the secrets step for now but optionally if you have and existing Key Vault in azure that you plan to use to bring your own certificate for a custom domain, then add a certificate but you can also add one in the management experience after creation of the FrontDoor. - -4. Go to Next:Endpoint and add an endpoint. You can give it a name you seem fit, it'll automatically create an endpoint hostname for you, then click "add". - - - -5. Then select Add a route to configure routing to your Web App origin. On the Add a route page, enter the following information: - - - -You will also want to create a new origin group like this: - - - - - -- Name: A name to identify the mapping between domains and origin group. -- Domains: A domain name will be autogenerated for you but you can add a custom domain by selecting Add a new domain. -- Patterns to match: Set the URLs this route will accept. The default is all URL paths. -- Accepted protocols: Select the protocol the route will accept -- Redirect: Enable to redirect all HTTP traffic to HTTPS endpoint -- Origin group: Select Add a new origin group. Select a name and Add an origin. The origin host name is the FQDN of your frontend without "https://". -- Forwarding protocol: The protocol that will be forwarded to the origin group. Here we will match the incoming requests to origin. -- Caching: If you want to cache contetns closer to your users globally using Azure Front Door's edge POPs and the Microsoft network -- Rules: Once deployed you can configure Rules to apply to your route. - -6. Select + Add a policy to apply a Web Application Firewall (WAF) policy to your domain. -7. On the Add security policy page, give your policy a name then select your domain you want to associate it with. If you don't have a policy already just select Create New to create a new policy. -8. Lastly you can go on Review + Create and then Create to deploy the Azure Front Door profile. - -When all steps are completed and the Azure Front Door profile is deployed you can access it and will find the endpoint hostname in the overview section. If you copy and past this into your browser you can now access the frontend through Azure Front Door endpoint. - -More information on the Creation of Front Door your can find [here](https://learn.microsoft.com/en-us/azure/frontdoor/create-front-door-portal). - -A guide to create Azure Front Door with the Azure CLI is linked [here](https://learn.microsoft.com/en-us/azure/frontdoor/create-front-door-cli). - -## Task 2: Monitor your application - -### Access Reports - -Azure Front Door analytics reports provide a built-in and all-around view of how your Azure Front Door behaves along with associated Web Application Firewall metrics. You can also take advantage of Access Logs to do further troubleshooting and debugging. - -Go to your Azure Front Door and in the navigation pane select Reports or Security under Analytics. You can choose between seven diferent dimensions: - -- Traffic by domain -- Usage -- Traffic by location -- Cache -- Top url -- Top referrer -- Top user agent - After choosing the dimension, you can select different filters for a select time range, location, protocol or domains. - To learn more about what the different dimensions tell you, look [here](https://learn.microsoft.com/en-us/azure/frontdoor/standard-premium/how-to-reports). - -### Metrics - -Azure Front Door is integrated with Azure Monitor and has 11 metrics to help monitor Azure Front Door in real-time to track, troubleshoot, and debug issues. - -From the Azure portal menu select All Resource and then your Front Door profile. -Under Monitoring select Metrics and choose a metric to add. You can add filters and apply splitting to split data by different dimensions. - -[More on metrics](https://learn.microsoft.com/en-us/azure/frontdoor/standard-premium/how-to-monitor-metrics) - -### Protocols - -Select your Azure Front Door profile. In the profile, go to Monitoring, select Diagnostic Setting and select Add diagnostic setting. -Enter a name for your Diagnostic setting, then select the log from FrontDoorAccessLog, FrontDoorHealthProbeLog and FrontDoorWebApplicationFirewallLog. -You can select destination details to "Send to Log Analytics" and save. - -For more information about the different logs, go [here](https://learn.microsoft.com/en-us/azure/frontdoor/standard-premium/how-to-logs). - -# Finish - -Congratulations! You finished the MicroHack Serverless Microservices. We hope you had the chance to learn about Microservices and how to implement them using Azure. If you want to give feedback please dont hesitate to open an Issue on the repository or get in touch with one of us directly. - -Thank you for investing the time and see you next time! diff --git a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/package-lock.json b/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/package-lock.json deleted file mode 100644 index 360361dc0..000000000 --- a/03-Azure/01-01-App Innovation/03_ServerlessMicroservices/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ServerlessMicroservices", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/img/1920x300_EventBanner_MicroHack_MigrateAndModernize_wText.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/img/1920x300_EventBanner_MicroHack_MigrateAndModernize_wText.jpg deleted file mode 100644 index fec1dc358..000000000 Binary files a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/img/1920x300_EventBanner_MicroHack_MigrateAndModernize_wText.jpg and /dev/null differ diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/Readme.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/Readme.md similarity index 95% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/Readme.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/Readme.md index 9adcf37b8..b6ad5287c 100644 --- a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/Readme.md +++ b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/Readme.md @@ -1,6 +1,6 @@ - + -# MicroHack - Migrate and Modernize +# MicroHack - Migrate and Secure to be AI Ready - [**MicroHack introduction**](#MicroHack-introduction) - [**MicroHack context**](#microhack-context) @@ -61,9 +61,9 @@ This MicroHack has a few but important prerequisites In order to use the MicroHack time most effectively, the following prerequisites should be completed prior to starting the session. -* Azure Active Directory Tenant +* Entra ID Tenant * At least one Azure Subscription -* Azure Active Directory user with Contributor or Owner permissions on the Azure Subscription +* Entra ID user with Contributor or Owner permissions on the Azure Subscription With these pre-requisites in place, we can focus on building the differentiated knowledge in Azure Migrate that is required when working with the product. @@ -314,7 +314,7 @@ The goal of this exercise is to ... ## Finish -Congratulations! You finished the MicroHack for Migration and Modernization. We hope you had the chance to learn about the how to implement a successful migration strategy using Azure Migrate. +Congratulations! You finished the Migrate and Secure to be AI Ready Microhack. We hope you had the chance to learn about the how to implement a successful migration strategy using Azure Migrate. If you want to give feedback please don’t hesitate to open an Issue on the repository or get in touch with one of us directly. Thank you for investing the time and see you next time! diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/img/1920x300_EventBanner_MicroHack_Migrate_wText.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/img/1920x300_EventBanner_MicroHack_Migrate_wText.jpg new file mode 100644 index 000000000..648188df3 Binary files /dev/null and b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/img/1920x300_EventBanner_MicroHack_Migrate_wText.jpg differ diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/img/azuremigratebusinesscase.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/img/azuremigratebusinesscase.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/img/azuremigratebusinesscase.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/img/azuremigratebusinesscase.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/img/migration-assessment-architecture.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/img/migration-assessment-architecture.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/img/migration-assessment-architecture.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/img/migration-assessment-architecture.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/README.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/README.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/README.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/README.md diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/cloud.cfg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/cloud.cfg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/cloud.cfg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/cloud.cfg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/GitHub_Logo.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/GitHub_Logo.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/GitHub_Logo.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/GitHub_Logo.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/MSLogo.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/MSLogo.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/MSLogo.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/MSLogo.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/MSicon.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/MSicon.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/MSicon.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/MSicon.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/github-mark.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/github-mark.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/github-mark.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/github-mark.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/index.html b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/index.html similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/index.html rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/index.html diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/stylesheet.css b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/stylesheet.css similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/demopage/stylesheet.css rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/demopage/stylesheet.css diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/deploy.ps1 b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/deploy.ps1 similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/deploy.ps1 rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/deploy.ps1 diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/destination.bicep b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/destination.bicep similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/destination.bicep rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/destination.bicep diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/main.bicep b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/main.bicep similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/main.bicep rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/main.bicep diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/source.bicep b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/source.bicep similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/resources/source.bicep rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/resources/source.bicep diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS1-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS1-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/CS7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/CS7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/Challenge-1.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/Challenge-1.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/img/Challenge-1.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/img/Challenge-1.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/solution.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-1/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-1/solution.md diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMig4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMig4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/AzMigApp7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/AzMigApp7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Challenge-2.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Challenge-2.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Challenge-2.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Challenge-2.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover15.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover15.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover15.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover16.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover16.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover16.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover16.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover17-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover17-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover17-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover17-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover17.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover17.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover17.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover17.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover18.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover18.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover18.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover18.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8-2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8-2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8-3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8-3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8-3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover9-0.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9-0.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover9-0.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9-0.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/img/Discover9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/img/Discover9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/solution.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-2/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-2/solution.md diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/img/bc9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/img/bc9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/solution.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-3/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-3/solution.md diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess15.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess15.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess15.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess15.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess16.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess16.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess16.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess16.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess17.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess17.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess17.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess17.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Assess9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Assess9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/Depend6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/Depend6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/WebApp1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/WebApp1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/WebApp2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/img/WebApp2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/img/WebApp2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/solution.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-4/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-4/solution.md diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/Challenge-5.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Challenge-5.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/Challenge-5.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/Challenge-5.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl2-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl2-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl2-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl2-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl2-2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl2-2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl2-2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl2-2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/azreplapl6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/azreplapl6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/disk5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/disk5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig1-2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig1-2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig1-2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig1-2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/finalmig9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/finalmig9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mal4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mal4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw3-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw3-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw3-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw3-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw3-2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw3-2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw3-2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw3-2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/maw3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/maw3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig15.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig15.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig15.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig15.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig16.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig16.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig16.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig16.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig17-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig17-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig17-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig17-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig17.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig17.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig17.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig17.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig18.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig18.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig18.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig18.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/mig9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/mig9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep11-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep11-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep11-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep11-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/prep9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/prep9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/repl9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/repl9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/img/test9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/img/test9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/solution.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-5/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-5/solution.md diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Challenge-6.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Challenge-6.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Challenge-6.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Challenge-6.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-CSPM-monitoring.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-CSPM-monitoring.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-CSPM-monitoring.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-CSPM-monitoring.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-DefenderServerSettings.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-DefenderServerSettings.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-DefenderServerSettings.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-DefenderServerSettings.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-defenderplans.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-defenderplans.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-defenderplans.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-defenderplans.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-environment-settings.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-environment-settings.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/Def-environment-settings.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/Def-environment-settings.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/DefSecAlert.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/DefSecAlert.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/DefSecAlert.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/DefSecAlert.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/VM-runps.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/VM-runps.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/VM-runps.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/VM-runps.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/addmigtool.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/addmigtool.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/addmigtool.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/addmigtool.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/appservice7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/appservice7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize13-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize13-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/modernize9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/modernize9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost01.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost01.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost01.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost01.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost02.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost02.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost02.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost02.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost03.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost03.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost03.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost03.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost04.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost04.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/secpost04.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/secpost04.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/tfupdate4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/tfupdate4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vm-eicarstring.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vm-eicarstring.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vm-eicarstring.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vm-eicarstring.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmatpstatus.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmatpstatus.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmatpstatus.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmatpstatus.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmconnect.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmconnect.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmconnect.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmconnect.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmfile.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmfile.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmfile.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmfile.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmlinuxatpstatus.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmlinuxatpstatus.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmlinuxatpstatus.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmlinuxatpstatus.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmnewfile.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmnewfile.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmnewfile.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmnewfile.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmthreat.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmthreat.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vmthreat.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vmthreat.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vnnewfile.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vnnewfile.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/img/vnnewfile.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/img/vnnewfile.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/solution.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-6/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-6/solution.md diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/Challenge-complete.jpg b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/Challenge-complete.jpg similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/Challenge-complete.jpg rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/Challenge-complete.jpg diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/addmigtool.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/addmigtool.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/addmigtool.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/addmigtool.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/appservice7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/appservice7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize10.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize10.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize10.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize10.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize11.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize11.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize11.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize11.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize12.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize12.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize12.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize12.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize13-1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13-1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize13-1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13-1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize13.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize13.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize13.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize14.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize14.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize14.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize14.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize5.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize5.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize5.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize5.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize6.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize6.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize6.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize6.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize7.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize7.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize7.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize7.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize8.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize8.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize8.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize8.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize9.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize9.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/modernize9.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/modernize9.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate1.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate1.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate1.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate1.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate2.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate2.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate2.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate2.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate3.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate3.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate3.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate3.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate4.png b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate4.png similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/img/tfupdate4.png rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/img/tfupdate4.png diff --git a/03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/solution.md b/03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/solution.md similarity index 100% rename from 03-Azure/01-03-Infrastructure/06_Migration_Datacenter_Modernization/walkthrough/challenge-7/solution.md rename to 03-Azure/01-03-Infrastructure/06_Migration_Secure_AI_Ready/walkthrough/challenge-7/solution.md diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/Challenges/README.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/Challenges/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/Walkthrough/README.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/Walkthrough/README.md new file mode 100644 index 000000000..30404ce4c --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/Walkthrough/README.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/README.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/README.md new file mode 100644 index 000000000..452569f55 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/README.md @@ -0,0 +1,78 @@ +# Step-by-step Instructions how to Deploy Oracle Data Guard on Azure VMs - Terraform Automation + +## Overview + +This repository contains code to install and configure Oracle databases on Azure VM IaaS in an automated fashion. The scenario of two VMs in an Oracle Dataguard configuration, deployed through Terraform (TODO: and Ansible). + +For more information about how to install and configure Data Guard on an Azure virtual machine (VM) with CLI refer to the documentation [here](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/oracle-dataguard). + +__Important Note - Disclaimer__: The code of this repository is largely based on the Oracle Deployment Automation repository (lza-oracle), which can be found [here](https://github.com/Azure/lza-oracle). The goal of the Terraform automation scripts in this repository is primarily to facilitate the successful execution of the Microhack. The code in this repository is not intended for production use and should be used with caution. +At the lza-oracle repository, you can find the code for deploying Oracle databases on Azure VMs using different scenarios, such as single and Dataguard using Terraform, Bicept and Ansible. +If you are interested in deploying Oracle databases on Azure VMs, we recommend you to check the [lza-oracle](https://github.com/Azure/lza-oracle) repository. + +Note that Oracle licensing is not a part of this solution. Please verify that you have the necessary Oracle licenses to run Oracle software on Azure IaaS. + + +The above resources can be deployed using the sample Github action workflows provided in the repository. The workflows are designed to deploy the infrastructure and configure the Oracle database on the VMs. This is the recommended way to deploy the infrastructure and configure the Oracle database. Alternatively the infrastructure can be deployed using Azure CLI and the Oracle database can be configured using Ansible. + +Note that the code provided in this repository is for demonstration purposes only and should not be used in a production environment without thorough testing. + +## Prerequisites + +1. Azure Entra ID Tenant. +2. Minimum 1 subscription, for when deploying VMs. If you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/en-us/free/?ref=microsoft.com&utm_source=microsoft.com&utm_medium=docs&utm_campaign=visualstudio) before you begin. +3. Azure CLI installed on your local machine. You can install Azure CLI from [here](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). +4. Terraform installed on your local machine. You can install Terraform from [here](https://learn.hashicorp.com/tutorials/terraform/install-cli). + + +## 1. Authenticate Terraform to Azure + +To use Terraform commands against your Azure subscription, you must first authenticate Terraform to that subscription. [This doc](https://learn.microsoft.com/en-us/azure/developer/terraform/authenticate-to-azure?tabs=bash) describes how to authenticate Terraform to your Azure subscription. + +### 2. Create SSH Key + +To deploy Oracle Data Guard on the VMs, you can use **data_guard** module in this repo. The module is located on `terraform/data_guard` directory. + +Before using this module, you have to create your own ssh key to deploy and connect to the two virtual machines you will create. + +```bash +ssh-keygen -f ~/.ssh/mh-oracle-data-guard + +ls -lha ~/.ssh/ +-rw------- 1 yourname staff 2.6K 8 17 2023 mh-oracle-data-guard +-rw-r--r-- 1 yourname staff 589B 8 17 2023 mh-oracle-data-guard.pub +``` + +### 4. Define Variables + +Define the variables such as location and Resource Group name in the `global_variables.tf` file. For more reference on all variables you can set, see [variables description](variables.md) + +Next, you go to `terraform/data_guard` directory and create `fixtures.tfvars` file, then copy the contents of the ssh public key used for deploying virtual machines on Azure (~/.ssh/mh-oracle-data-guard.pub). + +This is a sample `fixtures.tfvars` file. + +```tf:fixtures.tfvars +ssh_key = "ssh-rsa xxxxxxxxxxxxxx=" +``` +### 5. Execute Terraform Commands +Execute below Terraform commands. When you deploy resources to Azure, you have to indicate `fixtures.tfvars` as a variable file, which contains the ssh public key. + +```bash + +$ terraform init + +$ terraform plan -var-file=fixtures.tfvars + +$ terraform apply -var-file=fixtures.tfvars +``` + +You can connect to the virtual machine with ssh private key. While deploying resources, a public ip address is generated and attached to the virtual machine, so that you can connect to the virtual machine with this IP address. The username is `oracle`, which is fixed in `terraform/data_guard/module.tf`. + +``` +$ ssh -i ~/.ssh/mh-oracle-data-guard oracle@ + + + +## Trademarks + +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies. diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/LICENSE b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/LICENSE new file mode 100644 index 000000000..9e841e7a2 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/backend.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/backend.tf new file mode 100644 index 000000000..556a8c85c --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/backend.tf @@ -0,0 +1,3 @@ +terraform { + backend "local" {} +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/jit_rule.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/jit_rule.tf new file mode 100644 index 000000000..39ba4ff7d --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/jit_rule.tf @@ -0,0 +1,91 @@ +######################################################################################### +# # +# JIT Access Policy # +# # +######################################################################################### +data "azurerm_virtual_machine" "oracle_primary_vm" { + name = module.vm_primary.vm.name + resource_group_name = module.common_infrastructure.resource_group.name + + depends_on = [module.vm_primary, + module.storage_primary + ] +} + +data "azurerm_virtual_machine" "oracle_secondary_vm" { + name = module.vm_secondary.vm.name + resource_group_name = module.common_infrastructure.resource_group.name + + depends_on = [module.vm_secondary + , module.storage_secondary + ] +} + +resource "time_sleep" "wait_for_primary_vm_creation" { + create_duration = var.jit_wait_for_vm_creation + + depends_on = [data.azurerm_virtual_machine.oracle_primary_vm, + module.storage_primary + ] +} + +resource "time_sleep" "wait_for_secondary_vm_creation" { + create_duration = var.jit_wait_for_vm_creation + + depends_on = [data.azurerm_virtual_machine.oracle_secondary_vm + , module.storage_secondary + ] +} + + +resource "azapi_resource" "jit_ssh_policy_primary" { + count = module.vm_primary.database_server_count + name = "JIT-SSH-Policy-primary" + parent_id = "${module.common_infrastructure.resource_group.id}/providers/Microsoft.Security/locations/${module.common_infrastructure.resource_group.location}" + type = "Microsoft.Security/locations/jitNetworkAccessPolicies@2020-01-01" + schema_validation_enabled = false + body = jsonencode({ + "kind" : "Basic" + "properties" : { + "virtualMachines" : [{ + "id" : "/subscriptions/${module.common_infrastructure.current_subscription.subscription_id}/resourceGroups/${module.common_infrastructure.resource_group.name}/providers/Microsoft.Compute/virtualMachines/${module.vm_primary.vm.name}", + "ports" : [ + { + "number" : 22, + "protocol" : "TCP", + "allowedSourceAddressPrefix" : "*", + "maxRequestAccessDuration" : "PT3H" + } + ] + }] + } + }) + + depends_on = [time_sleep.wait_for_primary_vm_creation] +} + +resource "azapi_resource" "jit_ssh_policy_secondary" { + count = module.vm_secondary.database_server_count + name = "JIT-SSH-Policy-secondary" + parent_id = "${module.common_infrastructure.resource_group.id}/providers/Microsoft.Security/locations/${module.common_infrastructure.resource_group.location}" + type = "Microsoft.Security/locations/jitNetworkAccessPolicies@2020-01-01" + schema_validation_enabled = false + body = jsonencode({ + "kind" : "Basic" + "properties" : { + "virtualMachines" : [{ + "id" : "/subscriptions/${module.common_infrastructure.current_subscription.subscription_id}/resourceGroups/${module.common_infrastructure.resource_group.name}/providers/Microsoft.Compute/virtualMachines/${module.vm_secondary.vm.name}", + "ports" : [ + { + "number" : 22, + "protocol" : "TCP", + "allowedSourceAddressPrefix" : "*", + "maxRequestAccessDuration" : "PT3H" + } + ] + }] + } + }) + + depends_on = [time_sleep.wait_for_secondary_vm_creation] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/module.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/module.tf new file mode 100644 index 000000000..2e94560c4 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/module.tf @@ -0,0 +1,257 @@ +data "azurerm_client_config" "current" {} + +module "common_infrastructure" { + source = "./modules/common_infrastructure" + + infrastructure = local.infrastructure + is_data_guard = true + is_diagnostic_settings_enabled = var.is_diagnostic_settings_enabled + diagnostic_target = var.diagnostic_target + tags = var.resourcegroup_tags + +} + +module "vm_primary" { + source = "./modules/compute" + + resource_group_name = module.common_infrastructure.created_resource_group_name + location = var.location + vm_name = "vm-primary-0" + public_key = var.ssh_key + sid_username = "oracle" + vm_sku = var.vm_sku + + vm_source_image_reference = var.vm_source_image_reference + aad_system_assigned_identity = true + public_ip_address_resource_id = module.network.db_server_puplic_ip_resources[0].id + + + is_diagnostic_settings_enabled = module.common_infrastructure.is_diagnostic_settings_enabled + diagnostic_target = module.common_infrastructure.diagnostic_target + storage_account_id = module.common_infrastructure.target_storage_account_id + storage_account_sas_token = module.common_infrastructure.target_storage_account_sas + log_analytics_workspace = module.common_infrastructure.log_analytics_workspace != null ? { + id = module.common_infrastructure.log_analytics_workspace.id + name = module.common_infrastructure.log_analytics_workspace.name + } : null + data_collection_rules = module.common_infrastructure.data_collection_rules + eventhub_authorization_rule_id = module.common_infrastructure.eventhub_authorization_rule_id + partner_solution_id = module.common_infrastructure.partner_solution_id + tags = module.common_infrastructure.tags + db_subnet = module.network.db_subnet + + availability_zone = 1 + + + + vm_user_assigned_identity_id = var.vm_user_assigned_identity_id + + vm_os_disk = { + name = "osdisk-primary" + caching = "ReadWrite" + storage_account_type = "Premium_LRS" + disk_encryption_set_id = null + disk_size_gb = 128 + } + + role_assignments = { + role_assignment_1 = { + role_definition_id_or_name = "Virtual Machine Contributor" + principal_id = data.azurerm_client_config.current.object_id + skip_service_principal_aad_check = false + } + } + + role_assignments_nic = { + role_assignment_1 = { + role_definition_id_or_name = "Contributor" + principal_id = data.azurerm_client_config.current.object_id + skip_service_principal_aad_check = false + } + } + + vm_extensions = { + azure_monitor_agent = { + name = "vm-primary-azure-monitor-agent" + publisher = "Microsoft.Azure.Monitor" + type = "AzureMonitorLinuxAgent" + type_handler_version = "1.0" + auto_upgrade_minor_version = true + automatic_upgrade_enabled = true + settings = null + } + } + + depends_on = [module.network, module.common_infrastructure] +} + + +module "vm_secondary" { + source = "./modules/compute" + + resource_group_name = module.common_infrastructure.created_resource_group_name + location = var.location + vm_name = "vm-secondary-0" + public_key = var.ssh_key + sid_username = "oracle" + vm_sku = var.vm_sku + + vm_source_image_reference = var.vm_source_image_reference + vm_user_assigned_identity_id = var.vm_user_assigned_identity_id + aad_system_assigned_identity = true + public_ip_address_resource_id = module.network.db_server_puplic_ip_resources[1].id + + is_diagnostic_settings_enabled = module.common_infrastructure.is_diagnostic_settings_enabled + diagnostic_target = module.common_infrastructure.diagnostic_target + storage_account_id = module.common_infrastructure.target_storage_account_id + storage_account_sas_token = module.common_infrastructure.target_storage_account_sas + log_analytics_workspace = module.common_infrastructure.log_analytics_workspace != null ? { + id = module.common_infrastructure.log_analytics_workspace.id + name = module.common_infrastructure.log_analytics_workspace.name + } : null + data_collection_rules = module.common_infrastructure.data_collection_rules + eventhub_authorization_rule_id = module.common_infrastructure.eventhub_authorization_rule_id + partner_solution_id = module.common_infrastructure.partner_solution_id + tags = module.common_infrastructure.tags + db_subnet = module.network.db_subnet + + + + vm_os_disk = { + name = "osdisk-secondary" + caching = "ReadWrite" + storage_account_type = "Premium_LRS" + disk_encryption_set_id = null + disk_size_gb = 128 + } + + role_assignments = { + role_assignment_1 = { + role_definition_id_or_name = "Virtual Machine Contributor" + principal_id = data.azurerm_client_config.current.object_id + skip_service_principal_aad_check = false + } + } + + vm_extensions = { + azure_monitor_agent = { + name = "vm-secondary-azure-monitor-agent" + publisher = "Microsoft.Azure.Monitor" + type = "AzureMonitorLinuxAgent" + type_handler_version = "1.1" + auto_upgrade_minor_version = true + automatic_upgrade_enabled = true + settings = null + } + } + #ToDo: Pending + # role_assignments_nic = { + # role_assignment_1 = { + # role_definition_id_or_name = "Contributor" + # principal_id = data.azurerm_client_config.current.object_id + # skip_service_principal_aad_check = false + # } + # } + + depends_on = [module.network, module.common_infrastructure] +} + +module "network" { + source = "./modules/network" + + resource_group = module.common_infrastructure.resource_group + is_data_guard = module.common_infrastructure.is_data_guard + is_diagnostic_settings_enabled = module.common_infrastructure.is_diagnostic_settings_enabled + diagnostic_target = module.common_infrastructure.diagnostic_target + storage_account_id = module.common_infrastructure.target_storage_account_id + log_analytics_workspace_id = try(module.common_infrastructure.log_analytics_workspace.id, "") + eventhub_authorization_rule_id = module.common_infrastructure.eventhub_authorization_rule_id + partner_solution_id = module.common_infrastructure.partner_solution_id + tags = module.common_infrastructure.tags + + + #ToDo: role_assignments_nic + # role_assignments_nic = { + # role_assignment_1 = { + # name = "Contributor" + # skip_service_principal_aad_check = false + # } + # } + + role_assignments_pip = { + role_assignment_1 = { + name = "Contributor" + skip_service_principal_aad_check = false + } + } + + role_assignments_nsg = { + role_assignment_1 = { + name = "Contributor" + skip_service_principal_aad_check = false + } + } + + role_assignments_vnet = { + role_assignment_1 = { + name = "Contributor" + skip_service_principal_aad_check = false + } + } + + role_assignments_subnet = { + role_assignment_1 = { + name = "Contributor" + skip_service_principal_aad_check = false + } + } +} + + +module "storage_primary" { + source = "./modules/storage" + + resource_group = module.common_infrastructure.resource_group + is_data_guard = module.common_infrastructure.is_data_guard + naming = "oracle-primary" + vm = module.vm_primary.vm + tags = module.common_infrastructure.tags + database_disks_options = { + data_disks = var.database_disks_options.data_disks + asm_disks = var.database_disks_options.asm_disks + redo_disks = var.database_disks_options.redo_disks + } + availability_zone = module.vm_primary.availability_zone + + role_assignments = { + role_assignment_1 = { + name = "Contributor" + skip_service_principal_aad_check = false + } + } +} + +module "storage_secondary" { + source = "./modules/storage" + + resource_group = module.common_infrastructure.resource_group + is_data_guard = module.common_infrastructure.is_data_guard + naming = "oracle-secondary" + vm = module.vm_secondary.vm + tags = module.common_infrastructure.tags + database_disks_options = { + data_disks = var.database_disks_options.data_disks + asm_disks = var.database_disks_options.asm_disks + redo_disks = var.database_disks_options.redo_disks + } + availability_zone = module.vm_secondary.availability_zone + + role_assignments = { + role_assignment_1 = { + name = "Contributor" + skip_service_principal_aad_check = false + } + } +} + + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/infrastructure.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/infrastructure.tf new file mode 100644 index 000000000..a91ed21d9 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/infrastructure.tf @@ -0,0 +1,149 @@ +######################################################################################### +# # +# Subscription # +# # +######################################################################################### +data "azurerm_subscription" "current" {} + +######################################################################################### +# # +# Resource Group # +# # +######################################################################################### +resource "azurerm_resource_group" "rg" { + count = local.resource_group_exists ? 0 : 1 + name = local.rg_name + location = var.infrastructure.region + tags = var.tags + + lifecycle { + ignore_changes = [ + tags + ] + } +} + +data "azurerm_resource_group" "rg" { + name = local.rg_name + + depends_on = [azurerm_resource_group.rg] +} + +######################################################################################### +# # +# Diagnostic Settings # +# # +######################################################################################### +resource "azurerm_storage_account" "diagnostic" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + name = "${local.prefix}diag${random_string.suffix.result}" + resource_group_name = data.azurerm_resource_group.rg.name + location = data.azurerm_resource_group.rg.location + tags = merge(local.tags, var.tags) + + account_tier = "Standard" + account_replication_type = "LRS" +} + +data "azurerm_storage_account" "diagnostic" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + name = azurerm_storage_account.diagnostic[count.index].name + resource_group_name = data.azurerm_resource_group.rg.name + + depends_on = [azurerm_storage_account.diagnostic] +} + +resource "random_string" "suffix" { + length = 14 + special = false + upper = false +} + +data "azurerm_storage_account_sas" "diagnostic" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + connection_string = azurerm_storage_account.diagnostic[0].primary_connection_string + + resource_types { + service = false + container = true + object = true + } + + services { + blob = true + queue = false + table = true + file = false + } + + start = timestamp() + expiry = timeadd(timestamp(), "8766h") + + permissions { + read = false + write = true + delete = false + list = true + add = true + create = true + update = true + process = false + tag = false + filter = false + } +} + +resource "azurerm_log_analytics_workspace" "diagnostic" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? 1 : 0 + name = "${local.prefix}diag${random_string.suffix.result}" + resource_group_name = data.azurerm_resource_group.rg.name + location = data.azurerm_resource_group.rg.location + sku = "PerGB2018" + retention_in_days = 30 + tags = merge(local.tags, var.tags) +} + +data "azurerm_log_analytics_workspace" "diagnostic" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? 1 : 0 + name = "${local.prefix}diag${random_string.suffix.result}" + resource_group_name = data.azurerm_resource_group.rg.name + + depends_on = [azurerm_log_analytics_workspace.diagnostic] +} + +resource "azurerm_eventhub_namespace" "diagnostic" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Event_Hubs" ? 1 : 0 + name = "${local.prefix}diag${random_string.suffix.result}" + resource_group_name = data.azurerm_resource_group.rg.name + location = data.azurerm_resource_group.rg.location + sku = "Standard" + capacity = 1 + tags = merge(local.tags, var.tags) +} + +resource "azurerm_eventhub_namespace_authorization_rule" "diagnostic" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Event_Hubs" ? 1 : 0 + name = "${local.prefix}diag${random_string.suffix.result}" + namespace_name = azurerm_eventhub_namespace.diagnostic[0].name + resource_group_name = data.azurerm_resource_group.rg.name + listen = var.eventhub_permission.listen + send = var.eventhub_permission.send + manage = var.eventhub_permission.manage +} + +resource "azurerm_new_relic_monitor" "diagnostic" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Partner_Solutions" ? 1 : 0 + name = "${local.prefix}diag${random_string.suffix.result}" + resource_group_name = data.azurerm_resource_group.rg.name + location = data.azurerm_resource_group.rg.location + plan { + effective_date = "2023-09-20T00:00:00Z" + } + + user { + email = var.logz_user.email + first_name = var.logz_user.first_name + last_name = var.logz_user.last_name + phone_number = var.logz_user.phone_number + } +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/monitoring_settings.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/monitoring_settings.tf new file mode 100644 index 000000000..bfcf4f2da --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/monitoring_settings.tf @@ -0,0 +1,127 @@ + +#Data collection rules +resource "azurerm_monitor_data_collection_rule" "collection_rule_linux" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? 1 : 0 + kind = "Linux" + location = var.infrastructure.region + name = "LinuxCollectionRule" + resource_group_name = local.rg_name + tags = var.tags + data_flow { + destinations = [data.azurerm_log_analytics_workspace.diagnostic[0].name] + output_stream = "Microsoft-Perf" + streams = ["Microsoft-Perf"] + transform_kql = "source" + } + data_flow { + destinations = [data.azurerm_log_analytics_workspace.diagnostic[0].name] + output_stream = "Microsoft-Syslog" + streams = ["Microsoft-Syslog"] + transform_kql = "source" + } + data_sources { + performance_counter { + counter_specifiers = ["Processor(*)\\% Processor Time", "Processor(*)\\% Idle Time", "Processor(*)\\% User Time", "Processor(*)\\% Nice Time", "Processor(*)\\% Privileged Time", "Processor(*)\\% IO Wait Time", "Processor(*)\\% Interrupt Time", "Processor(*)\\% DPC Time", "Memory(*)\\Available MBytes Memory", "Memory(*)\\% Available Memory", "Memory(*)\\Used Memory MBytes", "Memory(*)\\% Used Memory", "Memory(*)\\Pages/sec", "Memory(*)\\Page Reads/sec", "Memory(*)\\Page Writes/sec", "Memory(*)\\Available MBytes Swap", "Memory(*)\\% Available Swap Space", "Memory(*)\\Used MBytes Swap Space", "Memory(*)\\% Used Swap Space", "Process(*)\\Pct User Time", "Process(*)\\Pct Privileged Time", "Process(*)\\Used Memory", "Process(*)\\Virtual Shared Memory", "Logical Disk(*)\\% Free Inodes", "Logical Disk(*)\\% Used Inodes", "Logical Disk(*)\\Free Megabytes", "Logical Disk(*)\\% Free Space", "Logical Disk(*)\\% Used Space", "Logical Disk(*)\\Logical Disk Bytes/sec", "Logical Disk(*)\\Disk Read Bytes/sec", "Logical Disk(*)\\Disk Write Bytes/sec", "Logical Disk(*)\\Disk Transfers/sec", "Logical Disk(*)\\Disk Reads/sec", "Logical Disk(*)\\Disk Writes/sec", "Network(*)\\Total Bytes Transmitted", "Network(*)\\Total Bytes Received", "Network(*)\\Total Bytes", "Network(*)\\Total Packets Transmitted", "Network(*)\\Total Packets Received", "Network(*)\\Total Rx Errors", "Network(*)\\Total Tx Errors", "Network(*)\\Total Collisions", "System(*)\\Uptime", "System(*)\\Load1", "System(*)\\Load5", "System(*)\\Load15", "System(*)\\Users", "System(*)\\Unique Users", "System(*)\\CPUs"] + name = "perfCounterDataSource60" + sampling_frequency_in_seconds = 60 + streams = ["Microsoft-Perf"] + } + syslog { + facility_names = ["alert", "audit", "auth", "authpriv", "clock", "cron", "daemon", "ftp", "kern", "local0", "local1", "local2", "local3", "local4", "local5", "local6", "local7", "lpr", "mail", "news", "nopri", "ntp", "syslog", "user", "uucp"] + log_levels = ["Debug", "Info", "Notice", "Warning", "Error", "Critical", "Alert", "Emergency"] + name = "sysLogsDataSource-1688419672" + } + } + + + destinations { + + dynamic "log_analytics" { + for_each = local.law_destination_settings + iterator = dest + + content { + workspace_resource_id = dest.value.resource_id + name = dest.value.name + } + } + + dynamic "event_hub" { + for_each = local.eventhub_destination_settings + + content { + event_hub_id = each.value.resource_id + name = each.value.name + } + } + + dynamic "storage_blob" { + for_each = local.storage_account_destination_settings + + content { + storage_account_id = each.value.resource_id + container_name = each.value.container_name + name = each.value.name + } + } + } + + + depends_on = [data.azurerm_log_analytics_workspace.diagnostic] +} + +# Data collection rule for VM Insights +resource "azurerm_monitor_data_collection_rule" "collection_rule_vm_insights" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? 1 : 0 + description = "Data collection rule for VM Insights." + location = var.infrastructure.region + name = "MSVMI-DataCollectionRuleVMInsights" + resource_group_name = local.rg_name + tags = var.tags + + data_flow { + destinations = ["VMInsightsPerf-Logs-Dest"] + streams = ["Microsoft-InsightsMetrics"] + } + data_flow { + destinations = ["VMInsightsPerf-Logs-Dest"] + streams = ["Microsoft-ServiceMap"] + } + data_sources { + extension { + extension_name = "DependencyAgent" + name = "DependencyAgentDataSource" + streams = ["Microsoft-ServiceMap"] + } + performance_counter { + counter_specifiers = ["\\VmInsights\\DetailedMetrics"] + name = "VMInsightsPerfCounters" + sampling_frequency_in_seconds = 60 + streams = ["Microsoft-InsightsMetrics"] + } + } + destinations { + log_analytics { + name = "VMInsightsPerf-Logs-Dest" + workspace_resource_id = data.azurerm_log_analytics_workspace.diagnostic[0].id + } + } + depends_on = [ + data.azurerm_log_analytics_workspace.diagnostic + ] +} + +data "azurerm_monitor_data_collection_rule" "collection_rule_linux" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? 1 : 0 + + name = azurerm_monitor_data_collection_rule.collection_rule_linux[0].name + resource_group_name = local.rg_name +} + + +data "azurerm_monitor_data_collection_rule" "collection_rule_vm_insights" { + count = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? 1 : 0 + + name = azurerm_monitor_data_collection_rule.collection_rule_vm_insights[0].name + resource_group_name = local.rg_name +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/outputs.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/outputs.tf new file mode 100644 index 000000000..9686b921e --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/outputs.tf @@ -0,0 +1,98 @@ +############################################################################### +# # +# Subscription # +# # +############################################################################### +output "current_subscription" { + value = data.azurerm_subscription.current +} + +############################################################################### +# # +# Resource Group # +# # +############################################################################### +output "resource_group" { + value = data.azurerm_resource_group.rg +} + +output "created_resource_group_id" { + description = "Created resource group ID" + value = data.azurerm_resource_group.rg.id +} + +output "created_resource_group_name" { + description = "Created resource group name" + value = data.azurerm_resource_group.rg.name +} + +output "created_resource_group_subscription_id" { + description = "Created resource group' subscription ID" + value = data.azurerm_resource_group.rg.id +} + +output "is_data_guard" { + description = "Whether the deployment is for Data Guard" + value = var.is_data_guard +} + +output "is_diagnostic_settings_enabled" { + description = "Whether diagnostic settings are enabled" + value = var.is_diagnostic_settings_enabled +} + +output "target_storage_account_id" { + description = "Storage account ID used for diagnostics" + value = var.is_diagnostic_settings_enabled ? data.azurerm_storage_account.diagnostic[0].id : "" +} + +output "target_storage_account_sas" { + description = "Storage account SAS used for diagnostics" + value = var.is_diagnostic_settings_enabled ? data.azurerm_storage_account_sas.diagnostic[0].sas : "" +} + +output "log_analytics_workspace" { + description = "Log Analytics workspace ID" + value = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? { + id = data.azurerm_log_analytics_workspace.diagnostic[0].id + name = data.azurerm_log_analytics_workspace.diagnostic[0].name + } : null +} + +output "eventhub_authorization_rule_id" { + description = "ID of an Event Hub authorization rule" + value = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Event_Hubs" ? azurerm_eventhub_namespace_authorization_rule.diagnostic[0].id : null +} + +output "partner_solution_id" { + description = "Partner solution ID" + value = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Partner_Solutions" ? azurerm_new_relic_monitor.diagnostic[0].id : null +} + +output "diagnostic_target" { + description = "The destination type of the diagnostic settings" + value = var.diagnostic_target +} + +output "availability_zone" { + description = "Availability zones" + value = var.availability_zone +} + +output "tags" { + description = "Tags applied to the resources" + value = var.tags +} + +output "data_collection_rules" { + value = (var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace") ? { + "${data.azurerm_monitor_data_collection_rule.collection_rule_linux[0].name}" = { + id = data.azurerm_monitor_data_collection_rule.collection_rule_linux[0].id + }, + "${data.azurerm_monitor_data_collection_rule.collection_rule_vm_insights[0].name}" = { + id = data.azurerm_monitor_data_collection_rule.collection_rule_vm_insights[0].id + } + + } : {} + +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/providers.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/providers.tf new file mode 100644 index 000000000..ae8863f42 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/providers.tf @@ -0,0 +1,24 @@ +terraform { + required_version = ">=1.6.0" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = ">=3.11.0, <4.0" + } + azapi = { + source = "Azure/azapi" + version = "=1.8.0" + } + } +} + +provider "azurerm" { + features { + resource_group { + prevent_deletion_if_contains_resources = true + } + virtual_machine { + delete_os_disk_on_deletion = true + } + } +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/resource_lock.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/resource_lock.tf new file mode 100644 index 000000000..e15a22bd5 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/resource_lock.tf @@ -0,0 +1,27 @@ +resource "azurerm_management_lock" "subscription" { + count = length(var.subscription_locks) > 1 && length(try(var.subscription_locks.name, "")) > 0 ? 1 : 0 + name = var.subscription_locks.name + scope = data.azurerm_subscription.current.id + lock_level = var.subscription_locks.type +} + +resource "azurerm_management_lock" "resource_group" { + count = length(var.resource_group_locks) > 1 && length(try(var.resource_group_locks.name, "")) > 0 ? 1 : 0 + name = var.resource_group_locks.name + scope = data.azurerm_resource_group.rg.id + lock_level = var.resource_group_locks.type + + depends_on = [azurerm_resource_group.rg] +} + +resource "azurerm_management_lock" "storage_account_diagnostic" { + count = (length(var.resource_group_locks) > 1 && length(try(var.resource_group_locks.name, "")) > 0 && var.is_diagnostic_settings_enabled ) ? 1 : 0 + name = var.resource_group_locks.name + scope = data.azurerm_storage_account.diagnostic[0].id + lock_level = var.resource_group_locks.type + + depends_on = [azurerm_resource_group.rg, data.azurerm_storage_account.diagnostic] +} + +#ToDo: Add more locks for other resources + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/role_assignments.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/role_assignments.tf new file mode 100644 index 000000000..43603476f --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/role_assignments.tf @@ -0,0 +1,17 @@ +data "azurerm_client_config" "current" {} + +data "azurerm_role_definition" "builtin" { + for_each = var.role_assignments + name = each.value.name +} + +resource "azurerm_role_assignment" "assignment" { + for_each = var.role_assignments + role_definition_name = data.azurerm_role_definition.builtin[each.key].name + principal_id = data.azurerm_client_config.current.object_id + scope = try(each.value.scope, data.azurerm_subscription.current.id) + skip_service_principal_aad_check = try(each.value.skip_service_principal_aad_check, null) + description = try(each.value.description, null) + condition = try(each.value.condition, null) + condition_version = try(each.value.condition_version, null) +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/variables_global.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/variables_global.tf new file mode 100644 index 000000000..aa85b1c1f --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/variables_global.tf @@ -0,0 +1,95 @@ +variable "infrastructure" {} + +variable "is_data_guard" { + description = "Whether Data Guard is enabled" + default = false +} + +variable "is_diagnostic_settings_enabled" { + description = "Whether diagnostic settings are enabled" + default = false +} + +variable "diagnostic_target" { + description = "The destination type of the diagnostic settings" + default = "Log_Analytics_Workspace" + validation { + condition = contains(["Log_Analytics_Workspace", "Storage_Account", "Event_Hubs", "Partner_Solutions"], var.diagnostic_target) + error_message = "Allowed values are Log_Analytics_Workspace, Storage_Account, Event_Hubs, Partner_Solutions" + } +} + +variable "eventhub_permission" { + description = "Authorization rule permissions for Event Hub" + default = { + listen = true + send = true + manage = true + } +} + +variable "log_destinations" { + type = map(object({ + type = string // E.g., "LogAnalytics", "EventHub", "StorageBlob" + resource_id = optional(string) // For Log Analytics, Event Hub, Storage Account + # workspace_id = optional(string) // For Log Analytics + # eventhub_id = optional(string) // For Event Hub + # storage_account_id = optional(string) // For Storage Account + container_name = optional(string) // For Blob container + name = string // Destination name within the DCR + })) + default = {} +} + + + + + +variable "logz_user" { + description = "Logz.io" + default = { + email = "user@example.com" + first_name = "Example" + last_name = "User" + phone_number = "+12313803556" + } +} + +variable "role_assignments" { + description = "Role assignments" + default = {} +} + +variable "subscription_locks" { + type = object({ + name = optional(string, "") + type = optional(string, "CanNotDelete") + }) + default = {} + validation { + condition = contains(["CanNotDelete", "ReadOnly"], var.subscription_locks.type) + error_message = "Lock type must be one of: CanNotDelete, ReadOnly." + } +} + +variable "resource_group_locks" { + type = object({ + name = optional(string, "") + type = optional(string, "CanNotDelete") + }) + default = {} + validation { + condition = contains(["CanNotDelete", "ReadOnly"], var.resource_group_locks.type) + error_message = "Lock type must be one of: CanNotDelete, ReadOnly." + } +} + +variable "availability_zone" { + description = "The availability zones of the resource" + default = null +} + +variable "tags" { + description = "Tags to be added to the resources" + default = {} +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/variables_local.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/variables_local.tf new file mode 100644 index 000000000..f8a6cc21b --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/common_infrastructure/variables_local.tf @@ -0,0 +1,43 @@ +locals { + resource_group_exists = length(try(var.infrastructure.resource_group.arm_id, "")) > 0 + // If resource ID is specified extract the resourcegroup name from it otherwise read it either from input of create using the naming convention + rg_name = local.resource_group_exists ? ( + try(split("/", var.infrastructure.resource_group.arm_id))[4]) : ( + length(var.infrastructure.resource_group.name) > 0 ? ( + var.infrastructure.resource_group.name) : ( + format("%s-%s-%s-%s-%s", + "rg", + local.prefix, + "demo", + var.infrastructure.region, + "001" + ) + ) + ) + + // Resource group + prefix = "oracle" + + + law_destination_settings = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Log_Analytics_Workspace" ? { Log_Analytics_Workspace = { + type = "Log_Analytics_Workspace" + resource_id = data.azurerm_log_analytics_workspace.diagnostic[0].id + name = data.azurerm_log_analytics_workspace.diagnostic[0].name + } } : {} + + storage_account_destination_settings = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Storage_Account" ? { Storage_Account = { + type = "Storage_Account" + resource_id = data.azurerm_storage_account.diagnostic[0].id + container_name = data.azurerm_storage_account_sas.diagnostic[0].sas + name = data.azurerm_storage_account.diagnostic[0].name + } } : {} + + eventhub_destination_settings = var.is_diagnostic_settings_enabled && var.diagnostic_target == "Event_Hubs" ? { Event_Hubs = { + type = "Event_Hubs" + resource_id = azurerm_eventhub_namespace_authorization_rule.diagnostic[0].id + name = azurerm_eventhub_namespace_authorization_rule.diagnostic[0].name + } } : {} + + + tags = {} +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/availability_set.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/availability_set.tf new file mode 100644 index 000000000..816c3fd28 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/availability_set.tf @@ -0,0 +1,17 @@ +resource "azurerm_availability_set" "oracle_vm" { + count = var.availability_zone == null ? 1 : 0 + name = "as-${count.index}" + location = var.location + resource_group_name = var.resource_group_name + + platform_fault_domain_count = 2 + +} + +data "azurerm_availability_set" "oracle_vm" { + count = var.availability_zone == null ? 1 : 0 + name = "as-${count.index}" + resource_group_name = var.resource_group_name + + depends_on = [azurerm_availability_set.oracle_vm] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/data.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/data.tf new file mode 100644 index 000000000..a526daaa6 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/data.tf @@ -0,0 +1,14 @@ +data "azurerm_virtual_machine" "oracle_vm_primary" { + name = module.avm-res-compute-virtualmachine[keys(local.vm_config_data_parameter)[0]].virtual_machine.name + resource_group_name = var.resource_group_name + + depends_on = [module.avm-res-compute-virtualmachine] +} + +data "azurerm_virtual_machine" "oracle_vms" { + for_each = { for vm in module.avm-res-compute-virtualmachine : vm.name => vm.virtual_machine } + name = each.value.name + resource_group_name = var.resource_group_name + + depends_on = [module.avm-res-compute-virtualmachine] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/monitoring_settings.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/monitoring_settings.tf new file mode 100644 index 000000000..44ce990ec --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/monitoring_settings.tf @@ -0,0 +1,10 @@ +# Create Data Collection Rule Association for VM created +resource "azurerm_monitor_data_collection_rule_association" "dcra_vm_insights" { + # Create association for each data collection rule + for_each = { for key, val in var.data_collection_rules : key => val if(var.log_analytics_workspace != null && var.is_diagnostic_settings_enabled) } + + name = each.key + target_resource_id = data.azurerm_virtual_machine.oracle_vm_primary.id + data_collection_rule_id = each.value.id +} + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/outputs.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/outputs.tf new file mode 100644 index 000000000..81eb5373c --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/outputs.tf @@ -0,0 +1,32 @@ +output "vm" { + value = data.azurerm_virtual_machine.oracle_vm_primary +} + +output "database_server_count" { + value = var.database_server_count +} + +output "availability_zone" { + value = var.availability_zone != null ? var.availability_zone : null +} + +output "oracle_vms" { + value = data.azurerm_virtual_machine.oracle_vms + sensitive = true +} + +output "vm_map_collection" { + value = { for vm in module.avm-res-compute-virtualmachine : vm.name => { + name = vm.name + id = vm.resource_id + public_ips = vm.public_ips + + } } + sensitive = false +} + + +output "vm_collection" { + value = flatten([for vm in module.avm-res-compute-virtualmachine : vm.name]) + sensitive = false +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/variable_global.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/variable_global.tf new file mode 100644 index 000000000..cc53a8fe4 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/variable_global.tf @@ -0,0 +1,366 @@ +variable "database_server_count" { + description = "The number of database servers" + default = 1 + type = number +} + +variable "vm_name" { + description = "The name of the Oracle VM" + type = string +} + +# variable "resource_group" { +# description = "Details of the resource group" +# default = {} +# } + + +variable "resource_group_name" { + description = "Created resource group name" + type = string +} + +variable "location" { + description = "The location of the resource" + type = string +} + + + +variable "database" { + description = "Details of the database node" + type = object({ + use_DHCP = string + authentication = object({ + type = string + }) + }) + default = { + use_DHCP = true + authentication = { + type = "key" + } + } +} + +variable "nic_locks" { + type = object({ + name = optional(string, "") + type = optional(string, "CanNotDelete") + }) + default = {} + validation { + condition = contains(["CanNotDelete", "ReadOnly"], var.nic_locks.type) + error_message = "Lock type must be one of: CanNotDelete, ReadOnly." + } +} + +variable "aad_system_assigned_identity" { + description = "AAD system assigned identity" + type = bool +} + +variable "skip_service_principal_aad_check" { + type = bool + description = "If the principal_id is a newly provisioned `Service Principal` set this value to true to skip the Azure Active Directory check which may fail due to replication lag." + default = true +} + +variable "storage_account_id" { + description = "Storage account ID used for diagnostics" + type = string + default = null +} + +variable "storage_account_sas_token" { + description = "Storage account SAS token used for diagnostics" + type = string + default = null +} + +variable "log_analytics_workspace" { + type = object({ + id = string + name = string + }) + + description = "Log Analytics workspace" + default = null +} + +variable "eventhub_authorization_rule_id" { + description = "ID of an Event Hub authorization rule" + type = string + default = null +} + +variable "partner_solution_id" { + description = "Value of the partner solution ID" + default = null +} + +variable "is_diagnostic_settings_enabled" { + description = "Whether diagnostic settings are enabled" + default = false +} + +variable "diagnostic_target" { + description = "The destination type of the diagnostic settings" + default = "Log_Analytics_Workspace" + validation { + condition = contains(["Log_Analytics_Workspace", "Storage_Account", "Event_Hubs", "Partner_Solutions"], var.diagnostic_target) + error_message = "Allowed values are Log_Analytics_Workspace, Storage_Account, Event_Hubs, Partner_Solutions" + } +} + +variable "data_collection_rules" { + type = map(object({ + id = string + })) + description = "Data collection rules" + default = {} +} + +# variable "role_assignments" { +# description = "Role assignments" +# default = {} +# } + +variable "role_assignments" { + type = map(object({ + role_definition_id_or_name = string + principal_id = optional(string) + condition = optional(string) + condition_version = optional(string) + description = optional(string) + skip_service_principal_aad_check = optional(bool, true) + delegated_managed_identity_resource_id = optional(string) + } + )) + default = {} +} + +variable "vm_lock" { + type = object({ + name = optional(string, null) + kind = optional(string, "None") + }) + default = {} + description = < { + name = ipconfig.name + private_ip_subnet_resource_id = ipconfig.subnet_id + create_public_ip_address = ipconfig.create_public_ip_address + public_ip_address_resource_id = ipconfig.public_ip_address_resource_id + public_ip_address_name = ipconfig.create_public_ip_address ? "${var.vm_name}-pip" : "" + private_ip_address_allocation = ipconfig.private_ip_address_allocation + is_primary_ipconfiguration = ipconfig.primary + private_ip_address = var.database.use_DHCP ? ipconfig.nic_ips[0] : "" + } + } + + # role_assignments_nic_parameter = {for key, value in var.role_assignments_nic : key => { + # principal_id = value.principal_id + # role_definition_id_or_name = value.role_definition_id_or_name + # assign_to_child_public_ip_addresses = true + # skip_service_principal_aad_check = value.skip_service_principal_aad_check + # } + + + + vm_default_config_data = { + "vm-0" = { + name = var.vm_name + os_type = "Linux" + generate_admin_password_or_ssh_key = false + enable_auth_password = local.enable_auth_password + admin_username = var.sid_username + admin_ssh_keys = { + username = var.sid_username + public_key = var.public_key + } + source_image_reference = var.vm_source_image_reference + virtualmachine_sku_size = var.vm_sku + os_disk = var.vm_os_disk + availability_zone = var.availability_zone + enable_telemetry = var.enable_telemetry + user_assigned_identity_id = var.vm_user_assigned_identity_id + role_assignments = var.role_assignments + skip_service_principal_aad_check = var.skip_service_principal_aad_check + + #Network Interfaces + network_interfaces = { + + network_interface_1 = { + name = "oraclevmnic-${var.vm_name}" + location = var.location + resource_group_name = var.resource_group_name + tags = merge(local.tags, var.tags) + accelerated_networking_enabled = true + + ip_configurations = local.network_interface_ipconfigs + + #ToDo: role_assignments_nic_parameter + # role_assignments = { + # role_assignment_1 = { + # role_definition_id_or_name = "Contributor" + # principal_id = data.azurerm_client_config.current.object_id + # skip_service_principal_aad_check = var.skip_service_principal_aad_check + # } + # } + + + } + } + } + } + + + # Variable with the data to create the Oracle VM + vm_config_data_parameter = merge(var.vm_config_data, local.vm_default_config_data) + + +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/vm.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/vm.tf new file mode 100644 index 000000000..6596fe074 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/compute/vm.tf @@ -0,0 +1,45 @@ +######################################################################################### +# # +# Virtual Machine # +# # +######################################################################################### + + +module "avm-res-compute-virtualmachine" { + source = "Azure/avm-res-compute-virtualmachine/azurerm" + version = "0.17.0" + for_each = local.vm_config_data_parameter + + + name = each.value.name + location = var.location + resource_group_name = var.resource_group_name + os_type = each.value.os_type + + generate_admin_password_or_ssh_key = each.value.generate_admin_password_or_ssh_key + disable_password_authentication = !each.value.enable_auth_password #!local.enable_auth_password #should be true + admin_username = each.value.admin_username + admin_ssh_keys = [each.value.admin_ssh_keys] + source_image_reference = each.value.source_image_reference + sku_size = each.value.virtualmachine_sku_size + os_disk = each.value.os_disk + extensions = var.vm_extensions + network_interfaces = each.value.network_interfaces + + + zone = each.value.availability_zone + availability_set_resource_id = var.availability_zone == null ? data.azurerm_availability_set.oracle_vm[0].id : null + tags = merge(local.tags, var.tags) + + + + managed_identities = { + system_assigned = var.aad_system_assigned_identity + user_assigned_resource_ids = [each.value.user_assigned_identity_id] + } + + role_assignments = each.value.role_assignments +} + + + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/diagnostic_settings.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/diagnostic_settings.tf new file mode 100644 index 000000000..46e6a34d2 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/diagnostic_settings.tf @@ -0,0 +1,145 @@ + +#ToDo: Should be replicated on VM Module +# resource "azurerm_monitor_diagnostic_setting" "nic" { +# count = var.is_diagnostic_settings_enabled ? 1 : 0 +# name = "nic-${count.index}-diag" +# target_resource_id = azurerm_network_interface.oracle_db[count.index].id +# storage_account_id = var.diagnostic_target == "Storage_Account" ? var.storage_account_id : null +# log_analytics_workspace_id = var.diagnostic_target == "Log_Analytics_Workspace" ? var.log_analytics_workspace_id : null +# eventhub_authorization_rule_id = var.diagnostic_target == "Event_Hubs" ? var.eventhub_authorization_rule_id : null +# partner_solution_id = var.diagnostic_target == "Partner_Solutions" ? var.partner_solution_id : null + +# metric { +# category = "AllMetrics" +# retention_policy { +# enabled = false +# } +# } +# } + +resource "azurerm_monitor_diagnostic_setting" "nsg" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + name = "nsg" + target_resource_id = azurerm_network_security_group.blank.id + storage_account_id = var.diagnostic_target == "Storage_Account" ? var.storage_account_id : null + log_analytics_workspace_id = var.diagnostic_target == "Log_Analytics_Workspace" ? var.log_analytics_workspace_id : null + eventhub_authorization_rule_id = var.diagnostic_target == "Event_Hubs" ? var.eventhub_authorization_rule_id : null + partner_solution_id = var.diagnostic_target == "Partner_Solutions" ? var.partner_solution_id : null + + dynamic "enabled_log" { + for_each = toset(data.azurerm_monitor_diagnostic_categories.nsg[count.index].log_category_types) + content { + category = enabled_log.value + retention_policy { + enabled = false + } + } + } +} + +#ToDo: It does not work +# resource "azurerm_monitor_diagnostic_setting" "pip" { +# count = var.is_diagnostic_settings_enabled ? var.is_data_guard ? 2 : 1 : 0 +# name = "pip" +# target_resource_id = azurerm_public_ip.vm_pip[count.index].id +# storage_account_id = var.diagnostic_target == "Storage_Account" ? var.storage_account_id : null +# log_analytics_workspace_id = var.diagnostic_target == "Log_Analytics_Workspace" ? var.log_analytics_workspace_id : null +# eventhub_authorization_rule_id = var.diagnostic_target == "Event_Hubs" ? var.eventhub_authorization_rule_id : null +# partner_solution_id = var.diagnostic_target == "Partner_Solutions" ? var.partner_solution_id : null + +# dynamic "enabled_log" { +# for_each = toset(data.azurerm_monitor_diagnostic_categories.pip[count.index].log_category_types) +# content { +# category = enabled_log.value +# retention_policy { +# enabled = false +# } +# } +# } + +# metric { +# category = "AllMetrics" +# retention_policy { +# enabled = false +# } +# } +# } + +resource "azurerm_monitor_diagnostic_setting" "vnet" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + name = "vnet" + target_resource_id = data.azurerm_virtual_network.vnet_oracle[count.index].id + storage_account_id = var.diagnostic_target == "Storage_Account" ? var.storage_account_id : null + log_analytics_workspace_id = var.diagnostic_target == "Log_Analytics_Workspace" ? var.log_analytics_workspace_id : null + eventhub_authorization_rule_id = var.diagnostic_target == "Event_Hubs" ? var.eventhub_authorization_rule_id : null + partner_solution_id = var.diagnostic_target == "Partner_Solutions" ? var.partner_solution_id : null + + dynamic "enabled_log" { + for_each = toset(data.azurerm_monitor_diagnostic_categories.vnet[count.index].log_category_types) + content { + category = enabled_log.value + retention_policy { + enabled = false + } + } + } + + metric { + category = "AllMetrics" + retention_policy { + enabled = false + } + } +} + +# data "azurerm_monitor_diagnostic_categories" "nic" { +# count = var.is_diagnostic_settings_enabled ? 1 : 0 +# resource_id = data.azurerm_network_interface.nic[count.index].id +# } + +data "azurerm_monitor_diagnostic_categories" "nsg" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + resource_id = data.azurerm_network_security_group.nsg[count.index].id +} + +data "azurerm_monitor_diagnostic_categories" "pip" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + resource_id = data.azurerm_public_ip.pip[count.index].id +} + +data "azurerm_monitor_diagnostic_categories" "vnet" { + count = var.is_diagnostic_settings_enabled ? 1 : 0 + resource_id = data.azurerm_virtual_network.vnet[count.index].id +} + +# data "azurerm_network_interface" "nic" { +# count = var.is_data_guard ? 2 : 1 +# name = "oraclevmnic-${count.index}" +# resource_group_name = var.resource_group.name + +# depends_on = [azurerm_network_interface.oracle_db] +# } + +data "azurerm_network_security_group" "nsg" { + count = 1 + name = "blank" + resource_group_name = var.resource_group.name + + depends_on = [azurerm_network_security_group.blank] +} + +data "azurerm_public_ip" "pip" { + count = var.is_data_guard ? 2 : 1 + name = "vmpip-${count.index}" + resource_group_name = var.resource_group.name + + depends_on = [azurerm_public_ip.vm_pip] +} + +data "azurerm_virtual_network" "vnet" { + count = 1 + name = local.vnet_oracle_name + resource_group_name = var.resource_group.name + + depends_on = [module.vnet] +} \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/nsg.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/nsg.tf new file mode 100644 index 000000000..d1d7dab5b --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/nsg.tf @@ -0,0 +1,26 @@ +######################################################################################### +# # +# Network Security Group # +# # +######################################################################################### +resource "azurerm_network_security_group" "blank" { + name = "blank" + location = var.resource_group.location + resource_group_name = var.resource_group.name + + tags = merge(local.tags, var.tags) +} + +resource "azurerm_subnet_network_security_group_association" "ssh" { + subnet_id = data.azurerm_subnet.subnet_oracle[0].id + network_security_group_id = azurerm_network_security_group.blank.id +} + +data "azurerm_network_security_group" "blank" { + name = "blank" + resource_group_name = var.resource_group.name + + depends_on = [azurerm_network_security_group.blank] +} + + diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/outputs.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/outputs.tf new file mode 100644 index 000000000..49b5ba02a --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/outputs.tf @@ -0,0 +1,20 @@ +############################################################################### +# # +# Network # +# # +############################################################################### +output "network_location" { + value = data.azurerm_virtual_network.vnet_oracle[0].location +} + +output "db_subnet" { + value = data.azurerm_subnet.subnet_oracle[0] +} + +output "db_server_puplic_ip" { + value = azurerm_public_ip.vm_pip[0].ip_address +} + +output "db_server_puplic_ip_resources" { + value = azurerm_public_ip.vm_pip +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/pip.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/pip.tf new file mode 100644 index 000000000..5c9c31d39 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/pip.tf @@ -0,0 +1,24 @@ +######################################################################################### +# # +# Public IPs # +# # +######################################################################################### + +resource "azurerm_public_ip" "vm_pip" { + count = var.is_data_guard ? 2 : 1 + name = "vmpip-${count.index}" + location = var.resource_group.location + resource_group_name = var.resource_group.name + allocation_method = "Static" + sku = "Standard" + + tags = merge(local.tags, var.tags) +} + +data "azurerm_public_ip" "vm_pip" { + count = var.is_data_guard ? 2 : 1 + name = "vmpip-${count.index}" + resource_group_name = var.resource_group.name + + depends_on = [azurerm_public_ip.vm_pip] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/providers.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/providers.tf new file mode 100644 index 000000000..c9561f7e8 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/providers.tf @@ -0,0 +1,24 @@ +terraform { + required_version = ">=1.2" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = ">=3.11.0, <4.0" + } + azapi = { + source = "Azure/azapi" + version = "=1.8.0" + } + } +} + +provider "azurerm" { + features { + resource_group { + prevent_deletion_if_contains_resources = true + } + virtual_machine { + delete_os_disk_on_deletion = true + } + } +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/resource_lock.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/resource_lock.tf new file mode 100644 index 000000000..3e83d1603 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/resource_lock.tf @@ -0,0 +1,27 @@ + +resource "azurerm_management_lock" "nsg" { + count = length(var.nsg_locks) > 1 && length(try(var.nsg_locks.name, "")) > 0 ? 1 : 0 + name = var.nsg_locks.name + scope = data.azurerm_network_security_group.blank.id + lock_level = var.nsg_locks.type + + depends_on = [azurerm_network_security_group.blank] +} + +resource "azurerm_management_lock" "vnet" { + count = length(var.vnet_locks) > 1 && length(try(var.vnet_locks.name, "")) > 0 ? 1 : 0 + name = var.vnet_locks.name + scope = data.azurerm_virtual_network.vnet_oracle[0].id + lock_level = var.vnet_locks.type + + depends_on = [data.azurerm_virtual_network.vnet_oracle] +} + +resource "azurerm_management_lock" "subnet" { + count = length(var.subnet_locks) > 1 && length(try(var.subnet_locks.name, "")) > 0 ? 1 : 0 + name = var.subnet_locks.name + scope = data.azurerm_subnet.subnet_oracle[0].id + lock_level = var.subnet_locks.type + + depends_on = [data.azurerm_subnet.subnet_oracle] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/role_assignments.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/role_assignments.tf new file mode 100644 index 000000000..93654a6ee --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/role_assignments.tf @@ -0,0 +1,82 @@ +data "azurerm_client_config" "current" {} + +# data "azurerm_role_definition" "nic" { +# for_each = var.role_assignments_nic +# name = each.value.name +# } + +data "azurerm_role_definition" "pip" { + for_each = var.role_assignments_pip + name = each.value.name +} + +data "azurerm_role_definition" "nsg" { + for_each = var.role_assignments_nsg + name = each.value.name +} + +data "azurerm_role_definition" "vnet" { + for_each = var.role_assignments_vnet + name = each.value.name +} + +data "azurerm_role_definition" "subnet" { + for_each = var.role_assignments_subnet + name = each.value.name +} + + +# resource "azurerm_role_assignment" "nic" { +# for_each = var.role_assignments_nic +# role_definition_name = data.azurerm_role_definition.nic[each.key].name +# principal_id = data.azurerm_client_config.current.object_id +# scope = try(each.value.scope, data.azurerm_network_interface.oracle_db[0].id) +# skip_service_principal_aad_check = try(each.value.skip_service_principal_aad_check, false) +# description = try(each.value.description, null) +# condition = try(each.value.condition, null) +# condition_version = try(each.value.condition_version, null) +# } + +resource "azurerm_role_assignment" "pip" { + for_each = var.role_assignments_pip + role_definition_name = data.azurerm_role_definition.pip[each.key].name + principal_id = data.azurerm_client_config.current.object_id + scope = try(each.value.scope, data.azurerm_public_ip.vm_pip[0].id) + skip_service_principal_aad_check = try(each.value.skip_service_principal_aad_check, false) + description = try(each.value.description, null) + condition = try(each.value.condition, null) + condition_version = try(each.value.condition_version, null) +} + +resource "azurerm_role_assignment" "nsg" { + for_each = var.role_assignments_nsg + role_definition_name = data.azurerm_role_definition.nsg[each.key].name + principal_id = data.azurerm_client_config.current.object_id + scope = try(each.value.scope, data.azurerm_network_security_group.blank.id) + skip_service_principal_aad_check = try(each.value.skip_service_principal_aad_check, false) + description = try(each.value.description, null) + condition = try(each.value.condition, null) + condition_version = try(each.value.condition_version, null) +} + +resource "azurerm_role_assignment" "vnet" { + for_each = var.role_assignments_vnet + role_definition_name = data.azurerm_role_definition.vnet[each.key].name + principal_id = data.azurerm_client_config.current.object_id + scope = try(each.value.scope, data.azurerm_virtual_network.vnet_oracle[0].id) + skip_service_principal_aad_check = try(each.value.skip_service_principal_aad_check, false) + description = try(each.value.description, null) + condition = try(each.value.condition, null) + condition_version = try(each.value.condition_version, null) +} + +resource "azurerm_role_assignment" "subnet" { + for_each = var.role_assignments_subnet + role_definition_name = data.azurerm_role_definition.subnet[each.key].name + principal_id = data.azurerm_client_config.current.object_id + scope = try(each.value.scope, data.azurerm_subnet.subnet_oracle[0].id) + skip_service_principal_aad_check = try(each.value.skip_service_principal_aad_check, false) + description = try(each.value.description, null) + condition = try(each.value.condition, null) + condition_version = try(each.value.condition_version, null) +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/variables_global.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/variables_global.tf new file mode 100644 index 000000000..12a43dedb --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/variables_global.tf @@ -0,0 +1,128 @@ +variable "resource_group" { + type = object({ + name = string + location = string + id = string + }) + description = "Details of the resource group" + default = null +} + +variable "diagnostic_target" { + type = string + description = "The destination type of the diagnostic settings" + default = "Log_Analytics_Workspace" + validation { + condition = contains(["Log_Analytics_Workspace", "Storage_Account", "Event_Hubs", "Partner_Solutions"], var.diagnostic_target) + error_message = "Allowed values are Log_Analytics_Workspace, Storage_Account, Event_Hubs, Partner_Solutions" + } +} + +variable "storage_account_id" { + description = "Storage account ID used for diagnostics" + type = string + default = null +} + +variable "log_analytics_workspace_id" { + description = "Log Analytics workspace ID" + type = string + default = null +} + +variable "eventhub_authorization_rule_id" { + description = "ID of an Event Hub authorization rule" + type = string + default = null +} + +variable "partner_solution_id" { + type = string + description = "Value of the partner solution ID" + default = null +} + +variable "is_diagnostic_settings_enabled" { + type = bool + description = "Whether diagnostic settings are enabled" + default = false +} + +variable "role_assignments_pip" { + type = map(object({ + name = string + })) + description = "Role assignments scoped to the public IP address" +} + +variable "role_assignments_nsg" { + type = map(object({ + name = string + })) + description = "Role assignments scoped to the network security group" + default = {} +} + +variable "role_assignments_vnet" { + type = map(object({ + name = string + })) + description = "Role assignments scoped to the virtual network" + default = {} +} + +variable "role_assignments_subnet" { + type = map(object({ + name = string + })) + description = "Role assignments scoped to the subnet" + default = {} +} + +variable "nsg_locks" { + type = object({ + name = optional(string, "") + type = optional(string, "CanNotDelete") + }) + default = {} + validation { + condition = contains(["CanNotDelete", "ReadOnly"], var.nsg_locks.type) + error_message = "Lock type must be one of: CanNotDelete, ReadOnly." + } +} + +variable "vnet_locks" { + type = object({ + name = optional(string, "") + type = optional(string, "CanNotDelete") + }) + default = {} + validation { + condition = contains(["CanNotDelete", "ReadOnly"], var.vnet_locks.type) + error_message = "Lock type must be one of: CanNotDelete, ReadOnly." + } +} + +variable "subnet_locks" { + type = object({ + name = optional(string, "") + type = optional(string, "CanNotDelete") + }) + default = {} + validation { + condition = contains(["CanNotDelete", "ReadOnly"], var.subnet_locks.type) + error_message = "Lock type must be one of: CanNotDelete, ReadOnly." + } +} + +variable "is_data_guard" { + type = bool + description = "Whether Data Guard is enabled" + default = false +} + +variable "tags" { + type = map(any) + description = "Tags to be added to the resources" + default = {} +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/variables_local.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/variables_local.tf new file mode 100644 index 000000000..1d32d1016 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/variables_local.tf @@ -0,0 +1,13 @@ +locals { + vnet_oracle_name = "vnet1" + database_subnet_name = "subnet1" + vnet_oracle_addr = "10.0.0.0/16" + database_subnet_prefix = "10.0.0.0/24" + + vnet_oracle_arm_id = try(local.vnet_oracle_name.arm_id, "") + vnet_oracle_exists = length(local.vnet_oracle_arm_id) > 0 + subnet_oracle_arm_id = try(local.database_subnet_name.arm_id, "") + subnet_oracle_exists = length(local.subnet_oracle_arm_id) > 0 + + tags = {} +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/vnet_main.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/vnet_main.tf new file mode 100644 index 000000000..9c7548304 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/network/vnet_main.tf @@ -0,0 +1,37 @@ +module "vnet" { + source = "Azure/avm-res-network-virtualnetwork/azurerm" + version = "0.1.3" + + resource_group_name = var.resource_group.name + vnet_location = var.resource_group.location + vnet_name = local.vnet_oracle_name + virtual_network_address_space = [local.vnet_oracle_addr] + subnets = { + subnet1 = { + address_prefixes = [local.database_subnet_prefix] + azurerm_network_security_group = { + id = azurerm_network_security_group.blank.id + } + } + } + + tags = merge(local.tags, var.tags) +} + + +data "azurerm_virtual_network" "vnet_oracle" { + count = local.vnet_oracle_exists ? 0 : 1 + name = local.vnet_oracle_name + resource_group_name = var.resource_group.name + + depends_on = [module.vnet] +} + +data "azurerm_subnet" "subnet_oracle" { + count = local.subnet_oracle_exists ? 0 : 1 + name = local.database_subnet_name + resource_group_name = var.resource_group.name + virtual_network_name = data.azurerm_virtual_network.vnet_oracle[count.index].name + + depends_on = [module.vnet] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/data_disk.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/data_disk.tf new file mode 100644 index 000000000..18d437046 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/data_disk.tf @@ -0,0 +1,83 @@ +resource "azurerm_managed_disk" "data_disk" { + count = length(local.data_disks) + name = "${var.naming}-data-${count.index}" + location = var.resource_group.location + resource_group_name = var.resource_group.name + storage_account_type = var.disk_type + create_option = local.data_disks[count.index].create_option + disk_size_gb = local.data_disks[count.index].disk_size_gb + zone = var.availability_zone + + tags = merge(local.tags, var.tags) +} + +resource "azurerm_managed_disk" "asm_disk" { + count = length(local.asm_disks) + name = "${var.naming}-asm-${count.index}" + location = var.resource_group.location + resource_group_name = var.resource_group.name + storage_account_type = var.disk_type + create_option = local.asm_disks[count.index].create_option + disk_size_gb = local.asm_disks[count.index].disk_size_gb + zone = var.availability_zone + + tags = merge(local.tags, var.tags) +} + +resource "azurerm_managed_disk" "redo_disk" { + count = length(local.redo_disks) + name = "${var.naming}-redo-${count.index}" + location = var.resource_group.location + resource_group_name = var.resource_group.name + storage_account_type = var.disk_type + create_option = local.redo_disks[count.index].create_option + disk_size_gb = local.redo_disks[count.index].disk_size_gb + zone = var.availability_zone + + tags = merge(local.tags, var.tags) +} + +resource "azurerm_virtual_machine_data_disk_attachment" "data_disk_attachment" { + count = length(local.data_disks) + managed_disk_id = azurerm_managed_disk.data_disk[count.index].id + virtual_machine_id = var.vm.id + caching = local.data_disks[count.index].caching + write_accelerator_enabled = local.data_disks[count.index].write_accelerator_enabled + lun = local.data_disks[count.index].lun +} + +resource "azurerm_virtual_machine_data_disk_attachment" "asm_disk_attachment" { + count = length(local.asm_disks) + managed_disk_id = azurerm_managed_disk.asm_disk[count.index].id + virtual_machine_id = var.vm.id + caching = local.asm_disks[count.index].caching + write_accelerator_enabled = local.asm_disks[count.index].write_accelerator_enabled + lun = local.asm_disks[count.index].lun +} + +resource "azurerm_virtual_machine_data_disk_attachment" "redo_disk_attachment" { + count = length(local.redo_disks) + managed_disk_id = azurerm_managed_disk.redo_disk[count.index].id + virtual_machine_id = var.vm.id + caching = local.redo_disks[count.index].caching + write_accelerator_enabled = local.redo_disks[count.index].write_accelerator_enabled + lun = local.redo_disks[count.index].lun +} + +data "azurerm_managed_disk" "data_disk" { + count = length(local.data_disks) + name = azurerm_managed_disk.data_disk[count.index].name + resource_group_name = var.resource_group.name +} + +data "azurerm_managed_disk" "asm_disk" { + count = length(local.asm_disks) + name = azurerm_managed_disk.asm_disk[count.index].name + resource_group_name = var.resource_group.name +} + +data "azurerm_managed_disk" "redo_disk" { + count = length(local.redo_disks) + name = azurerm_managed_disk.redo_disk[count.index].name + resource_group_name = var.resource_group.name +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/outputs.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/outputs.tf new file mode 100644 index 000000000..5a50b7284 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/outputs.tf @@ -0,0 +1,24 @@ +output "data_disks" { + value = local.data_disks +} + +output "asm_disks" { + value = local.asm_disks +} + +output "redo_disks" { + value = local.redo_disks +} + + +output "data_disks_resource" { + value = data.azurerm_managed_disk.data_disk +} + +output "asm_disks_resource" { + value = data.azurerm_managed_disk.asm_disk +} + +output "redo_disks_resource" { + value = data.azurerm_managed_disk.redo_disk +} \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/providers.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/providers.tf new file mode 100644 index 000000000..c9561f7e8 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/providers.tf @@ -0,0 +1,24 @@ +terraform { + required_version = ">=1.2" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = ">=3.11.0, <4.0" + } + azapi = { + source = "Azure/azapi" + version = "=1.8.0" + } + } +} + +provider "azurerm" { + features { + resource_group { + prevent_deletion_if_contains_resources = true + } + virtual_machine { + delete_os_disk_on_deletion = true + } + } +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/resource_lock.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/resource_lock.tf new file mode 100644 index 000000000..cb4c1be3f --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/resource_lock.tf @@ -0,0 +1,8 @@ +resource "azurerm_management_lock" "data_disk" { + count = length(var.data_disk_locks) > 1 && length(try(var.data_disk_locks.name, "")) > 1 ? 1 : 0 + name = var.data_disk_locks.name + scope = data.azurerm_managed_disk.data_disk[0].id + lock_level = var.data_disk_locks.type + + depends_on = [azurerm_managed_disk.data_disk] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/role_assignments.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/role_assignments.tf new file mode 100644 index 000000000..d7aff7956 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/role_assignments.tf @@ -0,0 +1,17 @@ +data "azurerm_client_config" "current" {} + +data "azurerm_role_definition" "builtin" { + for_each = var.role_assignments + name = each.value.name +} + +resource "azurerm_role_assignment" "assignment" { + for_each = var.role_assignments + role_definition_name = data.azurerm_role_definition.builtin[each.key].name + principal_id = data.azurerm_client_config.current.object_id + scope = try(each.value.scope, data.azurerm_managed_disk.data_disk[0].id) + skip_service_principal_aad_check = try(each.value.skip_service_principal_aad_check, false) + description = try(each.value.description, null) + condition = try(each.value.condition, null) + condition_version = try(each.value.condition_version, null) +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/variables_global.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/variables_global.tf new file mode 100644 index 000000000..69ee40511 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/variables_global.tf @@ -0,0 +1,92 @@ +variable "naming" { + description = "Defines the names for the resources" +} + +variable "vm" { + description = "Virtual machine name" +} + +variable "resource_group" { + description = "Details of the resource group" + default = {} +} + +variable "disk_type" { + description = "The type of the storage account" + default = "Premium_LRS" + validation { + condition = contains(["Standard_LRS", "StandardSSD_ZRS", "Premium_LRS", "PremiumV2_LRS", "Premium_ZRS", "StandardSSD_LRS", "UltraSSD_LRS"], var.disk_type) + error_message = "Allowed values are Standard_LRS, StandardSSD_ZRS, Premium_LRS, PremiumV2_LRS, Premium_ZRS, StandardSSD_LRS, UltraSSD_LRS" + } +} + +variable "database_disks_options" { + description = "Details of the database node" + default = { + data_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 20 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ], + asm_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 10 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + redo_disks = [ + { + count = 1 + caching = "None" + create_option = "Empty" + disk_size_gb = 1024 + lun = 60 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + } +} + +variable "role_assignments" { + description = "Role assignments" + default = {} +} + +variable "data_disk_locks" { + type = object({ + name = optional(string, "") + type = optional(string, "CanNotDelete") + }) + default = {} + validation { + condition = contains(["CanNotDelete", "ReadOnly"], var.data_disk_locks.type) + error_message = "Lock type must be one of: CanNotDelete, ReadOnly." + } +} + +variable "availability_zone" { + description = "The availability zones of the resource" + default = null +} + +variable "is_data_guard" { + description = "Whether Data Guard is enabled" + default = false +} + +variable "tags" { + description = "Tags to be added to the resources" + default = {} +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/variables_local.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/variables_local.tf new file mode 100644 index 000000000..6a03a5998 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/modules/storage/variables_local.tf @@ -0,0 +1,51 @@ +locals { + data_disks = flatten( + [ + for disk in var.database_disks_options.data_disks : [ + for i in range(0, disk.count) : { + name = "${var.vm.name}-datadisk${i}" + caching = disk.caching + create_option = disk.create_option + disk_size_gb = disk.disk_size_gb + lun = disk.lun + i + managed_disk_type = disk.disk_type + storage_account_type = disk.disk_type + write_accelerator_enabled = disk.write_accelerator_enabled + } + ] + ] + ) + asm_disks = flatten( + [ + for disk in var.database_disks_options.asm_disks : [ + for i in range(0, disk.count) : { + name = "${var.vm.name}-asmdisk${i}" + caching = disk.caching + create_option = disk.create_option + disk_size_gb = disk.disk_size_gb + lun = disk.lun + i + managed_disk_type = disk.disk_type + storage_account_type = disk.disk_type + write_accelerator_enabled = disk.write_accelerator_enabled + } + ] + ] + ) + redo_disks = flatten( + [ + for disk in var.database_disks_options.redo_disks : [ + for i in range(0, disk.count) : { + name = "${var.vm.name}-redodisk${i}" + caching = disk.caching + create_option = disk.create_option + disk_size_gb = disk.disk_size_gb + lun = disk.lun + i + managed_disk_type = disk.disk_type + storage_account_type = disk.disk_type + write_accelerator_enabled = disk.write_accelerator_enabled + } + ] + ] + ) + tags = {} +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/outputs.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/outputs.tf new file mode 100644 index 000000000..2c94f297a --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/outputs.tf @@ -0,0 +1,70 @@ +# ############################################################################### +# # # +# # Resource Group # +# # # +# ############################################################################### +output "resource_group" { + value = module.common_infrastructure.resource_group +} + +# output "created_resource_group_id" { +# description = "Created resource group ID" +# value = module.common_infrastructure.resource_group.id +# } + +# output "created_resource_group_name" { +# description = "Created resource group name" +# value = module.common_infrastructure.resource_group.name +# } + +# output "created_resource_group_subscription_id" { +# description = "Created resource group' subscription ID" +# value = module.common_infrastructure.resource_group.id +# } + +# output "created_resource_group_tags" { +# description = "Created resource group tags" +# value = module.common_infrastructure.tags +# } + +# ############################################################################### +# # # +# # Network # +# # # +# ############################################################################### +# output "network_location" { +# value = module.network.network_location +# } + +# output "db_subnet" { +# value = module.network.db_subnet +# } + +# ############################################################################### +# # # +# # Storage # +# # # +# ############################################################################### +# output "database_data_disks_primary" { +# value = module.storage_primary.data_disks +# } + +# output "database_asm_disks_primary" { +# value = module.storage_primary.asm_disks +# } + +# output "database_redo_disks_primary" { +# value = module.storage_primary.redo_disks +# } + +# output "database_data_disks_secondary" { +# value = module.storage_secondary.data_disks +# } + +# output "database_asm_disks_secondary" { +# value = module.storage_secondary.asm_disks +# } + +# output "database_redo_disks_secondary" { +# value = module.storage_secondary.redo_disks +# } diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/providers.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/providers.tf new file mode 100644 index 000000000..a6c69adcb --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/providers.tf @@ -0,0 +1,29 @@ +terraform { + required_version = ">=1.7.0" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = ">=3.11.0, <4.0" + } + azapi = { + source = "Azure/azapi" + version = ">=1.8.0" + } + } +} + +provider "azurerm" { + skip_provider_registration = true + features { + resource_group { + prevent_deletion_if_contains_resources = true + } + virtual_machine { + delete_os_disk_on_deletion = true + } + } +} + +provider "azapi" { + use_oidc = true +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/resources.telemetry.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/resources.telemetry.tf new file mode 100644 index 000000000..0a320c3cc --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/resources.telemetry.tf @@ -0,0 +1,15 @@ +# The following random id is created once per module instantiation and is appended to the teleletry deployment name +resource "random_id" "telem" { + count = local.disable_telemetry ? 0 : 1 + byte_length = 4 +} + +# This is the core module telemetry deployment that is only created if telemetry is enabled. +# It is deployed to the default subscription +resource "azurerm_subscription_template_deployment" "telemetry_core" { + count = local.telem_core_deployment_enabled ? 1 : 0 + provider = azurerm + name = local.telem_core_arm_deployment_name + location = var.location + template_content = local.telem_arm_subscription_template_content +} \ No newline at end of file diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/transform.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/transform.tf new file mode 100644 index 000000000..17780f880 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/transform.tf @@ -0,0 +1,39 @@ +locals { + infrastructure = { + region = coalesce(var.location, try(var.infrastructure.region, "")) + resource_group = { + name = try( + coalesce( + var.resourcegroup_name, + try(var.infrastructure.resource_group.name, "") + ), + "" + ) + } + vnet = { + name = try( + coalesce( + local.vnet_oracle_name, + try(var.infrastructure.vnet.name, "") + ), + "" + ) + } + subnet = { + name = try( + coalesce( + local.database_subnet_name, + try(var.infrastructure.subnet.name, "") + ), + "" + ) + } + tags = try( + coalesce( + var.resourcegroup_tags, + try(var.infrastructure.tags, {}) + ), + {} + ) + } +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables.md b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables.md new file mode 100644 index 000000000..8bc43b1eb --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables.md @@ -0,0 +1,173 @@ +# Terraform Variable Explanations + +1. **[Common Parameters](#common-parameters)** + + - [`location`](#location) + - [`resourcegroup_name`](#resourcegroup_name) + - [`resourcegroup_tags`](#resourcegroup_tags) + - [`is_diagnostic_settings_enabled`](#is_diagnostic_settings_enabled) + - [`diagnostic_target`](#diagnostic_target) + - [`infrastructure`](#infrastructure) + +2. **[Virtual Machine Parameters](#virtual-machine-parameters)** + + - [`ssh_key`](#ssh_key) + - [`vm_sku`](#vm_sku) + - [`vm_source_image_reference`](#vm_source_image_reference) + - [`vm_os_disk`](#vm_os_disk) + +3. **[Database Parameters](#database-parameters)** + - [`database`](#database) + - [`database_disks_options`](#database_disks_options) + - [`database_db_nic_ips`](#database_db_nic_ips) + +### `location` + +- **Description:** Defines the Azure location where the resources will be deployed. +- **Type:** String +- **Default Value:** "eastus" + +### `resourcegroup_name` + +- **Description:** If defined, this variable specifies the name of the resource group into which the resources will be deployed. +- **Default Value:** "" + +### `resourcegroup_tags` + +- **Description:** Tags to be added to the resource group. +- **Default Value:** {} + +### `is_diagnostic_settings_enabled` + +- **Description:** Whether diagnostic settings are enabled. +- **Default Value:** false + +### `diagnostic_target` + +- **Description:** The destination type of the diagnostic settings. Allowed values are "Log_Analytics_Workspace," "Storage_Account," "Event_Hubs," or "Partner_Solutions." +- **Default Value:** "Log_Analytics_Workspace" + +### `infrastructure` + +- **Description:** Details of the Azure infrastructure to deploy the SAP landscape into. +- **Default Value:** {} + +## Virtual Machine Parameters + +### `ssh_key` + +- **Description:** Value of the SSH public key to be used for the virtual machines. + +### `vm_sku` + +- **Description:** The SKU of the virtual machine. +- **Default Value:** "Standard_D4s_v3" + +### `vm_source_image_reference` + +- **Description:** The source image reference of the virtual machine. +- **Default Value:** + ```hcl + { + publisher = "Oracle" + offer = "Oracle-Linux" + sku = "79-gen2" + version = "7.9.36" + } + ``` + +### `vm_os_disk` + +- **Description:** Details of the OS disk, including name, caching, storage account type, disk encryption set, and disk size. +- **Default Value:** + ```hcl + { + name = "osdisk" + caching = "ReadWrite" + storage_account_type = "Premium_LRS" + disk_encryption_set_id = null + disk_size_gb = 128 + } + ``` + +## Database Parameters + +### `database` + +- **Description:** Details of the database node, including options such as DHCP, authentication type, and data disks. +- **Default Value:** + ```hcl + { + use_DHCP = true + authentication = { + type = "key" + } + data_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 0 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + }, + { + count = 1 + caching = "None" + create_option = "Empty" + disk_size_gb = 1024 + lun = 1 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + } + ``` + +### `database_disks_options` + +- **Description:** Details of the database node's disk options, including data disks, ASM disks, and redo disks. +- **Default Value:** + ```hcl + { + data_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 20 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ], + asm_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 10 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + redo_disks = [ + { + count = 1 + caching = "None" + create_option = "Empty" + disk_size_gb = 1024 + lun = 60 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + } + ``` + +### `database_db_nic_ips` + +- **Description:** If provided, the database tier virtual machines will be configured using the specified IPs. +- **Default Value:** [""] diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables_global.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables_global.tf new file mode 100644 index 000000000..0843270a1 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables_global.tf @@ -0,0 +1,184 @@ +######################################################################################### +# Common parameters # +######################################################################################### +variable "location" { + description = "Defines the Azure location where the resources will be deployed" + type = string + default = "germanywestcentral" +} + +variable "resourcegroup_name" { + description = "If defined, the name of the resource group into which the resources will be deployed" + default = "rg-mh-oracle4" +} + +variable "resourcegroup_tags" { + description = "tags to be added to the resource group" + default = {} +} + +variable "is_diagnostic_settings_enabled" { + description = "Whether diagnostic settings are enabled" + default = false +} + +variable "diagnostic_target" { + description = "The destination type of the diagnostic settings" + default = "Log_Analytics_Workspace" + validation { + condition = contains(["Log_Analytics_Workspace", "Storage_Account", "Event_Hubs", "Partner_Solutions"], var.diagnostic_target) + error_message = "Allowed values are Log_Analytics_Workspace, Storage_Account, Event_Hubs, Partner_Solutions" + } +} + +variable "infrastructure" { + description = "Details of the Azure infrastructure to deploy the SAP landscape into" + default = {} +} + +variable "disable_telemetry" { + type = bool + description = "If set to true, will disable telemetry for the module. See https://aka.ms/alz-terraform-module-telemetry." + default = false +} +######################################################################################### +# Virtual Machine parameters # +######################################################################################### +variable "ssh_key" { + description = "value of the ssh public key to be used for the virtual machines" +} + +variable "vm_sku" { + description = "The SKU of the virtual machine" + default = "Standard_D4s_v5" +} + +variable "vm_source_image_reference" { + description = "The source image reference of the virtual machine" + default = { + publisher = "Oracle" + offer = "oracle-database-19-3" + sku = "oracle-database-19-0904" + version = "latest" + } +} + +variable "vm_os_disk" { + description = "Details of the OS disk" + default = { + name = "osdisk" + caching = "ReadWrite" + storage_account_type = "Premium_LRS" + disk_encryption_set_id = null + disk_size_gb = 128 + } +} + +variable "vm_user_assigned_identity_id" { + description = "The ID of the user assigned identity to be used for the virtual machine" +} + +variable "jit_wait_for_vm_creation" { + description = "The duration to wait for the virtual machine to be created before creating the JIT policy" + default = "60s" +} + +variable "vm_extensions" { + description = "The extensions to be added to the virtual machine" + type = map(object({ + name = string + publisher = string + type = string + type_handler_version = string + auto_upgrade_minor_version = optional(bool) + automatic_upgrade_enabled = optional(bool) + failure_suppression_enabled = optional(bool, false) + settings = optional(string) + protected_settings = optional(string) + provision_after_extensions = optional(list(string), []) + tags = optional(map(any)) + protected_settings_from_key_vault = optional(object({ + secret_url = string + source_vault_id = string + })) + })) + default = {} +} + + +######################################################################################### +# Database parameters # +######################################################################################### +variable "database" { + description = "Details of the database node" + default = { + use_DHCP = true + authentication = { + type = "key" + } + data_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 0 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + }, + { + count = 1 + caching = "None" + create_option = "Empty" + disk_size_gb = 1024 + lun = 1 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + } +} + +variable "database_disks_options" { + description = "Details of the database node" + default = { + data_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 1 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ], + asm_disks = [ + { + count = 1 + caching = "ReadOnly" + create_option = "Empty" + disk_size_gb = 1024 + lun = 0 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + redo_disks = [ + { + count = 1 + caching = "None" + create_option = "Empty" + disk_size_gb = 1024 + lun = 2 + disk_type = "Premium_LRS" + write_accelerator_enabled = false + } + ] + } +} + +variable "database_db_nic_ips" { + description = "If provided, the database tier virtual machines will be configured using the specified IPs" + default = [""] +} diff --git a/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables_local.tf b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables_local.tf new file mode 100644 index 000000000..124d5e8e0 --- /dev/null +++ b/03-Azure/01-03-Infrastructure/10_Oracle_on_Azure/resources/environment_setup/terraform/data_guard/variables_local.tf @@ -0,0 +1,46 @@ +locals { + vnet_oracle_name = "vnet1" + database_subnet_name = "subnet1" + disable_telemetry = var.disable_telemetry + telem_core_puid = "440d81eb-6657-4a7d-ad93-c7e9cc09e5da" + empty_string = "" + telem_random_hex = can(random_id.telem[0].hex) ? random_id.telem[0].hex : local.empty_string +} + + +# This constructs the ARM deployment name that is used for the telemetry. +# We shouldn't ever hit the 64 character limit but use substr just in case +locals { + telem_core_arm_deployment_name = substr( + format( + "pid-%s_%s", + local.telem_core_puid, + local.telem_random_hex, + ), + 0, + 64 + ) +} + +locals { + telem_arm_subscription_template_content = <
{{ seat.name }}
For reservation choose one or more seats.