diff --git a/027-FHIRPoweredHealthcare/Coach/Lectures.pptx b/027-FHIRPoweredHealthcare/Coach/Lectures.pptx index 5a1987dcb8..bab296f370 100644 Binary files a/027-FHIRPoweredHealthcare/Coach/Lectures.pptx and b/027-FHIRPoweredHealthcare/Coach/Lectures.pptx differ diff --git a/027-FHIRPoweredHealthcare/Coach/README.md b/027-FHIRPoweredHealthcare/Coach/README.md new file mode 100644 index 0000000000..485d2de05b --- /dev/null +++ b/027-FHIRPoweredHealthcare/Coach/README.md @@ -0,0 +1,80 @@ +# What The Hack - FHIR Powered Healthcare - Coach Guide + +## Introduction + +Welcome to the coach's guide for the FHIR Powered Healthcare What The Hack. Here you will find links to specific guidance for coaches for each of the challenges. + +This hack includes an optional [lecture presentation](Lectures.pptx?raw=true) that features short presentations to introduce key topics associated with each challenge. It is recommended that the host present each short presentation before attendees kick off that challenge. + +**NOTE:** If you are a Hackathon participant, this is the answer guide. Don't cheat yourself by looking at these during the hack! Go learn something. :) + +## Coach's Guides + +**These challenges must be completed in order:** +- Challenge 0: **[Pre-requisites - Ready, Set, GO!](./Solution00.md)** + - Required tools needed to implement the hack challenges +- Challenge 1: **[Extract and Load FHIR EHR Data](./Solution01.md)** + - Deploy FHIR service in Azure Health Data Services platform + - Generate and load synthetic Electronic Health Record (EHR) data into FHIR Service. + +**These challenges can be completed in any order:** +- Challenge 2: **[Extract and Load HL7v2 and C-CDA EHR Data](./Solution02.md)** + - Convert and Load HL7v2 and C-CDA clinical data into FHIR Service. +- Challenge 3: **[Search FHIR EHR Data](./Solution03.md)** + - Develop Single Page App (SPA) to search and view FHIR EHR data. +- Challenge 4: **[Explore and Analyze FHIR EHR Data](./Solution04.md)** + - Transform and explore FHIR data for secondary use analytics. +- Challenge 5: **[Export and Anonymize FHIR EHR Data](./Solution05.md)** + - Export, anonymize and store FHIR EHR data in data lake for secondary use. +- Challenge 6: **[Ingest and Persist IoT Medical Device Data](./Solution06.md)** + - Ingest, transform and load medical IoT device data into FHIR using MedTech service. +- Challenge 7: **[Load DICOM Imaging Data](./Solution07.md)** + - Ingest, search and retrieve imaging data persisted in the DICOM service. + +## Coach Prerequisites + +This hack has pre-reqs that a coach is responsible for understanding and/or setting up BEFORE hosting an event. Please review the [What The Hack Hosting Guide](https://aka.ms/wthhost) for information on how to host a hack event. + +The guide covers the common preparation steps a coach needs to do before any What The Hack event, including how to properly configure Microsoft Teams. + +### Student Resources + +Before the hack, it is the Coach's responsibility to download and package up the contents of the `/Student/Resources` folder of this hack into a "Resources.zip" file. The coach should then provide a copy of the Resources.zip file to all students at the start of the hack. + +Always refer students to the [What The Hack website](https://aka.ms/wth) for the student guide: [https://aka.ms/wth](https://aka.ms/wth) + +**NOTE:** Students should **not** be given a link to the What The Hack repo before or during a hack. The student guide does **NOT** have any links to the Coach's guide or the What The Hack repo on GitHub. + +## Azure Requirements + +This hack requires students to have access to an Azure subscription where they can create and consume Azure resources. These Azure requirements should be shared with a stakeholder in the organization that will be providing the Azure subscription(s) that will be used by the students. + +This hack will deploy the following Azure resources and OSS components to implement the hack's challenges: +- Azure Health Data Services workspace (managed PaaS in various challenges) +- FHIR service (managed FHIR server in challenge 1) +- DICOM service (managed DICOM server in challenge 7) +- MedTech service (managed PaaS to ingest and convert IoT medical device data into FHIR in challenge 6) +- FHIR Loader (OSS) Function App based event-driven pipeline (for ingesting FHIR data in Challenge 1) +- Azure Function (managed Serverless solution to host FHIR Loader app in challenge 1) +- FHIR Analytics Pipeline - FHIR to Synapse sync agent (OSS pipeline to move FHIR data in FHIR service to Azure Data Lake for analytics with Synapse in challenge 4) +- Tool for Health Data Anonymization pipeline (ADF pipeline to export and anonymize FHIR data in challenge 5) +- Serverless SQL pool in Azure Synapse Analytics (Query service over the data in your data lake in challenge 4) +- Azure Data Factory (Cloud ETL pipeline used in challege 5) +- Azure Batch (Perform the deidentification in Tools for Health Data Anonymization in challenge 4)) +- App Service Plan (Shared by FHIR Loader function apps) +- Storage account (Data Lake/Blob storage for various challenges) +- Key Vault (Stores secrets and configuration settings in various challenges) +- Log Analytics Workspace (Logs the activity of deployed components in various challenges) +- Application Insights (Monitors FHIR Loader application in various challenges) +- Event Grid System Topic (Triggers processing of FHIR bundles placed in the FHIR Loader storage account) +- Azure Data Factory (Export/Anonymize pipeline in challenge 5) +- Event Hub (managed event ingesting service in challenge 6) + +## Repository Contents + +- `.Coach` + - Coach's Guide and related files +- `.Student` + - Student's Challenge Guide +- `.Student/Resources` + - Resource files, sample code, scripts, etc meant to be provided to students. (Must be packaged up by the coach and provided to students at start of event) diff --git a/027-FHIRPoweredHealthcare/Coach/Solution00.md b/027-FHIRPoweredHealthcare/Coach/Solution00.md index c1a9bfa1ac..6e81601b7b 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution00.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution00.md @@ -1,6 +1,6 @@ # Coach's Guide: Challenge 0 - Pre-requisites - Ready, Set, GO! -**[Home](./readme.md)** - [Next Challenge>](./Solution01.md) +**[Home](./README.md)** - [Next Challenge>](./Solution01.md) ## Notes & Guidance diff --git a/027-FHIRPoweredHealthcare/Coach/Solution01.md b/027-FHIRPoweredHealthcare/Coach/Solution01.md index 59ed80953b..35bbf4bfa2 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution01.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution01.md @@ -1,40 +1,69 @@ -# Coach's Guide: Challenge 1 - Extract and load FHIR synthetic medical data +# Coach's Guide: Challenge 1 - Extract and Load FHIR EHR Data -[< Previous Challenge](./Solution00.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution02.md) +[< Previous Challenge](./Solution00.md) - **[Home](./README.md)** - [Next Challenge>](./Solution02.md) ## Notes & Guidance -In this challenge, you will implement the FHIR Server Samples reference architecture to ingest and load patient data in FHIR. You will generate synthetic FHIR patient data for bulk load into FHIR Server. To generate synthetic patient data, you will use **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient records in FHIR format. +In this challenge, you will implement the **[FHIR Bulk Loader](https://github.com/microsoft/fhir-loader)** function app based event-driven architecture to ingest and load patient data in FHIR. You will generate synthetic FHIR patient data for bulk data load into the FHIR service. To generate synthetic patient data, you will use **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient records in FHIR format. -**FHIR bulk load scenario** +### FHIR bulk load scenario +In this scenario, you will deploy a storage account with a BLOB container and copy Synthea generated FHIR patient data files (JSON Bundles) into it. These FHIR Bundles will be automatically ingested into the FHIR service. -In this scenario, you will deploy a storage account with a BLOB container called `fhirimport`. Synthea generated FHIR patient data files (JSON) are copied into this storage container, and automatically ingested into FHIR Server. This bulk ingestion is performed by a BLOB triggered function app. +**First you will deploy **[Azure Health Data Services workspace](https://docs.microsoft.com/en-us/azure/healthcare-apis/workspace-overview)** and then **[deploy a FHIR service](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/fhir-portal-quickstart)** instance within the workspace.** -**Deploy FHIR Server Samples reference architecture for Bulk Load scenario** -- To deploy **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples)** PaaS scenario (above): - - First, clone the **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples)** git repo to your local project repo, i.e. c:/projects and find the deployment scripts folder +Hint: +- You can deploy separate AHDS workspace to enable data segregation for each project/customer. +- You can deploy 1 or more instance(s) of FHIR service in the ADHS workspace based on your requirements/use cases. + +**You will then implement the **[FHIR Bulk Loader](https://github.com/microsoft/fhir-loader)** Function App solution to ingest and load Synthea generated FHIR patient data into the FHIR service in near real-time.** + +Hint: These scripts will gather (and export) information necessary for the proper deployment and configuration of FHIR Bulk Loader. Credentials and other secure information will be stored in the existing Key Vault attached to your FHIR Service deployment. + +- Install and configure FHIR Bulk Loader with the deploy **[script](https://github.com/microsoft/fhir-loader/blob/main/scripts/Readme.md#getting-started)**. + - Launch Azure Cloud Shell (Bash Environment) in your Azure Portal + - Clone the repo to your Bash Shell (CLI) environment ```bash - git clone https://github.com/Microsoft/fhir-server-samples - cd fhir-server-samples/deploy/scripts + git clone https://github.com/microsoft/fhir-loader ``` - - Before running the **[FHIR Server Samples deployment script](https://github.com/microsoft/fhir-server-samples/blob/master/deploy/scripts/Create-FhirServerSamplesEnvironment.ps1)**, you MUST login to your Azure subscription and connect to Azure AD with your primary/secondary tenant that has directory admin role access required for this setup. + - Change working directory to the repo `scripts` directory ```bash - Login-AzAccount - Connect-AzureAd -TenantDomain + cd $HOME/fhir-loader/scripts ``` - **Note:** - - If you have full Administrator access to a AD tenant where you can create App Registrations, Role Assignments, Azure Resources, then Primary AD tenant is same as Secondary AD tenant and use the same AD tenant for both. - - If you don't have Administrator access: - - Primary (Resource) AD tenant: This tenant is Resource Control Plane where all your Azure Resources will be deployed to. - - Secondary (Data) AD tenant: This tenant is Data Control Plane where all your App Registrations will be deployed to. - - - Deploy **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples#deployment)** with the managed Azure API for FHIR (PaaS) scenario: - - Run `Create-FhirServerSamplesEnvironment.ps1` from the cloned `./deploy/scripts` folder. - - To Validate your deployment, - - Check Azure resources created in `{ENVIRONMENTNAME}` and `{ENVIRONMENTNAME}-sof` Resource Groups - - Check `App Registration` in secondary AAD tenat that all three different **[client application types](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-app-registration)** are registered for Azure API for FHIR. - - Check `Azure API for FHIR` > `Authentication` > `Allowed object IDs` configuration in Azure Portal to ensure that the Azure AD object IDs of the 3 registered client applications have been added. This will allow these client apps to access this Azure API for FHIR. - + - Make the Bash Shell script used for deployment and setup executable + ```bash + chmod +x *.bash + ``` + - Run `deployFHIRBulk.bash` script + ```bash + cd $HOME/fhir-loader/scripts + ./deployFhirBulk.bash + ``` + Hint: + 1) This deployment script prompts users for Azure parameters and FHIR Service Client Application connection information (if not found in Key Vault): + - Subscription ID (Accept default value if correct) + - Resource Group Name (This script will look for an existing resource group, otherwise a new one will be created) + - Resource Group Location, i.e. eastus (If creating a *new* resource group, you need to set a location) + - Deployment prefix (Enter your deploy prefix - bulk components begin with this prefix) + - Function App Name (Enter the bulk loader function app name - this is the name of the function app) + - Operation Mode (Enter `fhir` to set FHIR Bulk Loader to the FHIR Service for this challege) + - Key Vault Name (Script searches for FHIR Service values in the Key Vault, and if found, loads them; otherwise script prompts for the FHIR Service configuration values) + - FHIR Service URL (FS-URL), + - Resource ID (FS-URL), + - Tenant Name (FS-TENANT-NAME), + - Client ID (FS-CLIENT-ID), + - Client Secret (FS-SECRET), + - Audience (FS-Resource) + 2) The deployment script connects the Event Grid System Topics with the respective function app + - Optionally the deployment script can be used with command line options + ```bash + ./deployFhirBulk.bash -i -g -l -n -k -o + ``` +- Validate your deployment, check Azure components installed: + - Function App with App Insights and Storage + - Function App Service plan + - EventGrid + - Storage Account (with containers) + - Key Vault (if none exist) **Generate FHIR patient data using **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** tool** @@ -71,8 +100,8 @@ In this scenario, you will deploy a storage account with a BLOB container called ``` - For this configuration, Synthea will output 1000 patient records in FHIR formats in `./output/fhir` folder. -**Bulk Load Synthea generated patient FHIR Bundles to FHIR Server** -- Copy Synthea generated patient data to `fhirimport` BLOB, which will automatically trigger a function app to persist them to FHIR Server +**Bulk Load Synthea generated patient FHIR Bundles to FHIR service** +- Copy Synthea generated patient data to `bundles` BLOB, which will automatically trigger a function app to persist them to FHIR Server - To copy data to Azure Storage using **[AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)** commandline tool - **[Download AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-azcopy)** - **[Run AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#run-azcopy)** @@ -97,7 +126,9 @@ In this scenario, you will deploy a storage account with a BLOB container called Executed 'FhirBundleBlobTrigger' (Succeeded, ...) ``` **Use Postman to retrieve Patients data via FHIR Patients API** -- Open Postman and **[import Postman data](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/)**: +- You need to first register your **[public client application](https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application)** to connect Postman desktop app to FHIR service in Azure Health Data Services. +- Then **[Configure RBAC roles](https://learn.microsoft.com/en-us/azure/healthcare-apis/configure-azure-rbac)** to assign access to the Azure Health Data Services data plane. +- To **[access FHIR service using Postman](https://learn.microsoft.com/en-us/azure/healthcare-apis/fhir/use-postman)**, open Postman and **[import Postman data](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/)**: - In Postman, click Import. - In your **[Student Resources folder for Postman](../Student/Resources/Postman)**, select **[Environment](../Student/Resources/Postman/WTHFHIR.postman_environment.json)** and **[Collection](../Student/Resources/Postman/WTHFHIR.postman_collection.json)** JSON files. - Confirm the name, format, and import as, then click Import to bring your data into your Postman. diff --git a/027-FHIRPoweredHealthcare/Coach/Solution02.md b/027-FHIRPoweredHealthcare/Coach/Solution02.md index ad5f757683..87b415a5d3 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution02.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution02.md @@ -1,101 +1,23 @@ -# Coach's Guide: Challenge 2 - Extract, transform and load HL7 medical data +# Coach's Guide: Challenge 2 - Extract and Load HL7v2 & C-CDA EHR Data -[< Previous Challenge](./Solution01.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution03.md) +[< Previous Challenge](./Solution01.md) - **[Home](./README.md)** - [Next Challenge>](./Solution03.md) ## Notes & Guidance -In this challenge, you will deploy a Health Architecture **[HL7toFHIR Conversion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** serverless solution that provides the following services within **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** and FHIR Proxy: -- Import and process valid HL7 bundles and persist them to a FHIR Compliant store -- FHIR Server Proxy connection to FHIR Server without exposing credentials -- Publish successful FHIR CUD events referencing FHIR Resources to an event hub to support pre-processing and/or post-processing for event driven workflow and orchestration scenarios. This can be done by enabling the PublishFHIREventPostProcess module of the FHIR Proxy. +In this challenge, you will use the **[\$convert-data](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#use-the-convert-data-endpoint)** operation, which is a service integrated into the FHIR service within Azure Health Data platform, to convert HL7v2 message and C-CDA XML legacy formats for persistance in FHIR. The $convert-data endpoint in FHIR service uses the Liquid template engine and default templates from the **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** OSS project to perform data mapping between these legacy formats to FHIR. -**NOTE**: This function is deployed and configured as a part of the HL72FHIR Workflow Platform. +**Prepare API Request to convert legacy health data into FHIR** +- Setup API request **[using the $convert-data endpoint](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#using-the-convert-data-endpoint)** in the FHIR service and configure **[Parameter Resource](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#parameters-resource)** in the request body. -**[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** is an open source project that runs as a REST web service for converting health data from legacy formats to FHIR bundles. Microsoft FHIR Converter currently supports HL7v2 and C-CDA to FHIR conversion. It uses pre-installed **[Handlebars templates](https://handlebarsjs.com/)** to define data mapping for HL7v2 to FHIR and C-CDA to FHIR conversion. It can be deploy separately or as part of the **[HL7 to FHIR Conversion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** pipeline. +**Convert data using the $convert-data endpoint** +- Test send **[sample HL7v2](https://github.com/microsoft/FHIR-Converter/tree/main/data/SampleData/Hl7v2)** and **[sample C-CDA](https://github.com/microsoft/FHIR-Converter/tree/main/data/SampleData/Ccda)** requests in the request body payload and make the appropriate $convert-data API calls to receive FHIR Bundle response. -**[HL7 Ingest Platform](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#deploying-your-own-hl7-ingest-platform)** reference architeture is deployed to ingest HL7 messages and produce a consumable event in a Service Bus queue for processing by FHIR Event Processor function app. It provides a sample `samplemsg.hl7` for testing the `hl7overhttps` ingest service. +**Use Postman to retrieve Patients clinical data via FHIR Patients API** +- Open Postman and import Postman collection and environment variables for FHIR API (if you have not imported them). +- Run FHIR API HTTP Requests to validate imported clinical data. -**[HL7 to FHIR Conversion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** reference architecture deployment will create a Logic App based workflow that is triggered whenever new HL7 message is added to the queue of `hl7ingest` Service Bus. This conversion workflow performs the following tasks: -- Orderly conversion from HL7 to FHIR via the **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** -- Persists converted HL7v2 message into FHIR Server through secure proxied FHIR Server connection (FHIR Server Proxy). -- Publishes FHIR change events referencing FHIR Resources to an Event Hub. +**Note:** See **[challenge 1 solution file](./Solution01.md)** for detailed guide on using Postman to access FHIR Server APIs. -**NOTE**: After successful deployment, the converter pipeline is integrated with HL7 Ingest platform. -**[Deploy HL7 Ingest, Conversion Samples](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7-ingest-conversion-samples)** reference architectures below: - -**Deploy HL7 Ingest Platform** -- Download or Clone the **[Microsoft Health Archtectures](https://github.com/microsoft/health-architectures)** GitHub repo -- Open a bash shell into the Azure CLI 2.0 environment -- Switch to `HL7Conversion` subdirectory in your local repo -- Run the `./deployhl7ingest.bash` script and follow the prompts - - Enter your subscription ID - - Enter a Resource Group name (new or existing) - - Enter Resource Group location - - Enter deployment prefix (environment name) - - **NOTE:** You should receive the following acknowledgement at the end of deployment. - ```bash - HL7 Ingest Platform has successfully been deployed to group wth-fhir on Sat, Oct 31, 2020 11:26:59 PM - Please note the following reference information for future use: - Your ingest host is: https://hl7ingest#####.azurewebsites.net - Your ingest host key is: a7P4X9F...X1w== - Your hl7 ingest service bus namespace is: hlsb#### - Your hl7 ingest service bus destination queue is: hl7ingest - Your hl7 storage account name is: [ENVIRONMENTNAME]fhirstore#### - Your hl7 storage account container is: hl7 - ``` - -- Validate resources created in the deployment - - Storage account: `XXXstore#####` and container: `hl7` - - Service Bus Namespace: `hlsb####` and queue: `hl7ingest` - - Function App (HTTP Trigger): `hl7ingest#####` - - Application Insights: `hl7ingest#####` - -**Deploy HL7 to FHIR Conversion Workflow** -- In bash shell, run the `./deployhl72fhir.bash` script and follow the prompts - - Enter your subscription ID - - Enter a Resource Group name (new or existing) - - Enter Resource Group location - - Enter deployment prefix (environment name) - - Enter a resource group name to deploy the converter to: `[EVIRONMENTNAME]hl7conv` - - Enter the name of the HL7 Ingest Resource Group (from above `hl7ingest` deployment) - - Enter the name of the HL7 Ingest storage account (from above `hl7ingest` deployment) - - Enter the name of the HL7 ServiceBus namespace (from above `hl7ingest` deployment) - - Enter the name of the HL7 ServiceBus destination queue (from above `hl7ingest` deployment) - - Enter the destination FHIR Server URL - - Enter the FHIR Server Service Client Application ID - - Enter the FHIR Server Service Client Secret - - Enter the FHIR Server/Service Client Audience/Resource (`https://azurehealthcareapis.com`) - - Enter the FHIR Server/Service Client Tenant ID - - **NOTE**: You should receive the following acknowledgement at the end of deployment. - ```bash - HL72FHIR Workflow Platform has successfully been deployed to group [ENVIRONMENTNAME] on Sun, Nov 1, 2020 2:37:59 PM - Please note the following reference information for future use: - Your HL7 FHIR Converter Host is: XXXfhirhl7conv#### - Your HL7 FHIR Converter Key is: - Your HL7 FHIR Converter Resource Group is: XXXfhirhl7conv - ``` -- Validate resources created in the deployment - - Storage account: `[ENVIRONMENTNAME]store#####` - - FHIR Event Hub Namespace: `fehub###` - - FHIR Event Hub: `fhirevents` - - FHIREventProcessor Function App: `fhirevt####` - - Application Insights: `fhirevt####` - - Logic App: `HL7toFHIR`. Workflow steps are: - - When a message is received in a `hl7ingest` queue (`HL7ServiceBus`) - - Get blob content (`hl7blobstorage`) - - Connections - Custom Logic App connection (`HL7FHIRConverter`) - - Import Bundle to FHIR Server (Connected thru FHIR Server Proxy) -- Test send a sample hl7 message via HL7 over HTTPS - - Locate the sample message `samplemsg.hl7` in the root directory of the cloned GitHub repo - - Use a text editor to see contents - - From the Linux command shell run the following command to test the `hl7overhttps` ingest - ```bash - curl --trace-ascii - -H "Content-Type:text/plain" --data-binary @samplemsg.hl7 /api/hl7ingest?code= - ``` - - You should receive back an HL7 ACK message to validate that the sample hl7 message was accepted securely stored into blob storage and queued for HL7 to FHIR Conversion processing on the deployed service bus queue - - You can also see execution from the `HL7toFHIR` Logic App Run History in the `HL7toFHIR` resource group. This will also provide you with detailed steps to see the transform process diff --git a/027-FHIRPoweredHealthcare/Coach/Solution03.md b/027-FHIRPoweredHealthcare/Coach/Solution03.md index cf3971c289..6920ac3174 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution03.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution03.md @@ -1,98 +1,148 @@ -# Coach's Guide: Challenge 3 - Extract, transform and load C-CDA synthetic medical data +# Coach's Guide: Challenge 3 - Search FHIR EHR Data -[< Previous Challenge](./Solution02.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution04.md) +[< Previous Challenge](./Solution02.md) - **[Home](./README.md)** - [Next Challenge>](./Solution04.md) ## Notes & Guidance -In this challenge, you will use the **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** reference architecture in **[Microsoft Health Architectures](https://github.com/microsoft/health-architectures)**, deployed in **[challenge 2](./Solution02.md)**, to ingest, transform, and load clinical healthcare data into FHIR Server. You will generate synthetic patient clinical data (C-CDA), convert them into FHIR Bundle and ingest them into FHIR Server. To generate synthetic patient data, you will use **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient clinical data in HL7 C-CDA format. - -**Clinical data ingest and convert Scenario** - -In this scenario, you will develop a logic app based workflow to perform the C-CDA-to-FHIR conversion using **[FHIR Converter API](https://github.com/microsoft/FHIR-Converter/blob/master/docs/api-summary.md)** and import the resulting FHIR Bundle into FHIR Server. - -**Deploy **[Microsoft Health Architectures](https://github.com/microsoft/health-architectures)** samples for C-CDA-to-FHIR ingest and convert scenarios** - -- Use **[HL7toFHIR converion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** pipeline infrastructure (deployed in **[challenge 2](./Solution02.md)**) to expose the C-CDA Conversion service endpoint: - - `https://.azurewebsites.net/api/convert/cda/ccd.hbs` - -- Deploy a new logic app based workflow to perform the C-CDA-to-FHIR conversion and import the resulting FHIR bundle into FHIR Server. Your BLOB triggered logic app needs to perform the following steps in the workflow: - - Step 1: Trigger workflow when a BLOB is added or modified in `cda` container - - Step 2: Get BLOB content from C-CDA XML file in `cda` BLOB container. - - Step 3: Compose BLOB content as Input object. - - Step 4: HTTP - Call FHIR Converter API - - Method: POST - - URI: `https://.azurewebsites.net/api/convert/cda/ccd.hbs` - - Body: Compose object output (file content) - - Step 5: Import Response Body (FHIR bundle) to FHIR Server - - Connected to FHIR Server through **[FHIR Server Proxy](https://github.com/microsoft/health-architectures/blob/master/FHIR/FHIRProxy/readme.md)** - - Set message object to retuned FHIR resource - -**Generate patient clinical data using **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** tool** - -**[SyntheaTM](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** is a Synthetic Patient Population Simulator. The goal is to output synthetic, realistic (but not real), patient data and associated health records in a variety of formats. Read **[Synthea wiki](https://github.com/synthetichealth/synthea/wiki)** for more information. -- **[Developer Quick Start](https://github.com/synthetichealth/synthea#developer-quick-start)** - - **[Installation](https://github.com/synthetichealth/synthea#installation)** - - System Requirements: SyntheaTM requires Java 1.8 or above. - - Clone the SyntheaTM repo, then build and run the test suite: - ```bash - $ git clone https://github.com/synthetichealth/synthea.git - $ cd synthea - $ ./gradlew build check test - ``` - Note: This step may have been done in **[Challenge 1](./Solution01.md)**. +In this challenge, you will create a new Single Page App (SPA) integrated with Microsoft Authentication Library (MSAL) to connect, read and search for FHIR patient data. + +![JavaScript SPA App - Implicit Flow](../images/JavaScriptSPA-ImplicitFlow.jpg) + +- Make sure the following Node.js prerequistes have been completed + - To see if you already have Node.js and npm installed and check the installed version, run: + ```bash + node -v + npm -v + ``` + + - Download and install **[Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)** + - Download latest **[Node.js pre-built installer](https://nodejs.org/en/download/)** for your platform + - Run the installer downloaded to install node.js + - Post installation, a cmdline window will popup to install additional tools for Node.js. In the cmdline window, + ```Command + Press any key to continue... + ``` +- Create a new JavaScript SPA patient search app + - **Option 1: Create a Node.js SPA AAD MSAL Patient Search app** + - This step-by-step guide will create a vanilla JavaScript SPA to query protected web API, i.e. Microsoft Graph API, but you will modify it to access FHIR Server web API that accepts tokens from the Microsoft identity platform endpoint. + - In this scenario, after a user signs in, an access token is requested and added to HTTP requests through the authorization header. This token will be used to acquire patient data via FHIR Server API. + - Setup you web server or project, download **[project files](https://github.com/Azure-Samples/active-directory-javascript-graphapi-v2/archive/quickstart.zip)** + - Create and initialize your project + - Initialize your SPA, run `npm init` at your project root folder + - Install required dependencies, run + ```bash + npm install express --save + npm install morgan --save + ``` - - Update the **[default properties](https://github.com/synthetichealth/synthea#changing-the-default-properties)** for CDA output - ```propoerties - exporter.baseDirectory = ./output/cda - ... - exporter.ccda.export = true - exporter.fhir.export = false - ... - # the number of patients to generate, by default - # this can be overridden by passing a different value to the Generator constructor - generate.default_population = 1000 + - Create a simple server to serve your SPA in `server.js` file. + - Setup front-end source folder, i.e. `JavaScriptSPA` + - Setup route for `index.html` + - Start the server + - Create the SPA UI in `index.html` file that handles the following: + - Implements UI built with Bootstrap 4 Framework + - Imports script files for + - configuration, + - authentication, + - API call + - Access and update DOM elements in `ui.js` file + - User authentication interface (SignIn/SignOut) + - Display patient search results interface + - **[Register your app](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** + - Set a redirect URL to your JavaScrip Web App URL (Azure and Local) in the `Public Client` `Web Platform Configuration` of your App Registration tenant. + - Note: These URIs will accept as destinations when returning authentication responses (tokens) after successfully authenticating users. + - Configure your JavaScript SPA parameters for authentication, in `authConfig.js` file, where: + - `clientId`: is the Application (client) ID for the application you registered. + - `authority`: is the Authority value from FHIR Server Authentication setting. + - `redirectUri`: is your JavaScrip Web App URL from App Service. + - `Scope`: + - Process MSAL authentication and acquire token to call FHIR Server API in `authPopup.js` file + - Store REST endpoint for FHIR server in `graphConfig.js` file + - Make REST call to FHIR Server in `graph.js` file + - Create helper function `callMSGraph()` to make the HTTP GET request against the protected FHIR API resource that requires a token. + - This method appends the acquired token in the HTTP Authorization header. + - The request then uses `fetch` method to call the API and returns the response to the caller. + - Add search components in `index.html` to implement patient lookup. + - Add a search input textbox to enter search criteria + - Add a submit button to perform the patient search + + - **Option 2: Create React AAD MSAL Patient Search SPA** + - Build a new SPA in React using **[Create React App](https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)** toolchain. It sets up your development environment with latest JavaScript features and optimizes your app for production. + + - You’ll need to have Node >= 8.10 and npm >= 5.6 on your machine. To create a project, run: + ```bash + npx create-react-app react-patient-search + cd react-patient-search + npm start ``` - **Note:** The default properties file values can be found at src/main/resources/synthea.properties. By default, synthea does not generate CCDA, CPCDA, CSV, or Bulk FHIR (ndjson). You'll need to adjust this file to activate these features. See the **[wiki](https://github.com/synthetichealth/synthea/wiki)** for more details. - - Generate Synthetic Patients - Generating the population 1000 at a time... + **Note:** `npx` on the first line above refers to a package runner tool that comes with npm 5.2+. + + - Use **[Microsoft Authentication Library for JavaScript (MSAL.js) 2.0](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/README.md#microsoft-authentication-library-for-javascript-msaljs-20-for-browser-based-single-page-applications)** for Browser-Based Single-Page Applications + -Install **[MSAL React package](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/README.md#installation)**, run: ```bash - ./run_synthea -p 1000 + npm install react react-dom + npm install @azure/msal-react @azure/msal-browser ``` - - For this configuration, Synthea will output 1000 patient records in FHIR formats in `./output/cda` folder. - -**Bulk Load Synthea generated patient FHIR Bundles to FHIR Server** -- Copy the Synthea generated C-CDA patient data (XML) in `./output/cda` folder to `cda` BLOB container in `{ENVIRONMENTNAME}store` Storage Account created for FHIR Converter. This will automatically trigger the new logic app C-CDA to FHIR conversion workflow created above to convert and persist resulted FHIR bundle into FHIR Server. - - To Copy data to Azure Storage using **[AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)** commandline tool - - **[Download AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-azcopy)** - - **[Run AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#run-azcopy)** - - Add directory location of AzCopy executable to your system path - - Type `azcopy` or `./azcopy` in Windows PowerShell command prompts to get started - - Use a SAS token to copy Synthea generated patient clinical data XML file(s) to hl7ingest Azure Blob storage - - Sample AzCopy command: - ```bash - azcopy copy "" "" - ``` - - Alternatively, copy data to Azure Storage using **[Azure Storage Explorer](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-storage-explorer#upload-blobs-to-the-container)** user interface - - Navigate to Storage Account blade in Azure Portal, expand BLOB CONTAINERS and click on `cda` to list container content - - Click `Upload`, and in `Upload blob` window, browse to Synthea `./result/cda` folder and select C-CDA XML files to upload - - Monitor Log Stream in function app `cdafhirconvert.BlobTrigger1` - - Verify in log that `FhirBundleBlobTrigger` function auto runs when new blob detected - Sample log output: - ```bash - Executing 'hl7ingestBlobTrigger' (Reason='New blob detected...)... - ... - Uploaded /... - ... - Executed 'hl7ingestBlobTrigger' (Succeeded, ...) - ``` -**Use Postman to retrieve Patients clinical data via FHIR Patients API** -- Open Postman and import Postman collection and environment variables for FHIR API (if you have not imported them). -- Run FHIR API HTTP Requests to validate imported clinical data. - -**Note:** See **[challenge 1 solution file](./Solution01.md)** for detailed guide on using Postman to access FHIR Server APIs. - - - - + - Setup `index.js` in root project folder to handle the app startup and basic HTTP web server functionality similar what's done in traditional Apache. + - Import `react-dom` package to provide DOM-specific methods to be used in the app. + ```DotNet + import ReactDOM from "react-dom"; + ``` + - Setup **[React Redux store](https://react-redux.js.org/introduction/basic-tutorial)** to make it available to the app. + ```DotNet + import { Provider } from "react-redux"; + import { basicReduxStore } from "./reduxStore"; + ``` + - Setup `react-dom` `render` method to render React app to the web page. + - **[Providing the Redux store](https://react-redux.js.org/introduction/basic-tutorial#providing-the-store)** by wrapping the app with the `` API provided by React Redux in the `ReactDOM.render()` function. + ```DotNet + ReactDOM.render( + + + , + document.getElementById("root") + ); + ``` + - Create React SPA UI in `App.js` to handle MS Identity Platorm authentication services and patient search UI functionalities. + - Import authentication provider and instantiate it only once as a singleton service. + - Implement patient search UI built with Bootstrap 4 Framework. + - **[Include React Bootstrap package in your app](https://react-bootstrap.github.io/getting-started/introduction/)** + - **[Create a simple search app in your React app](https://medium.com/developer-circle-kampala/how-to-create-a-simple-search-app-in-react-df3cf55927f5)** + - Create a search component + - Add a search input textbox and submit button to perform the search + - Create helper functions to handle search events in JavaScript + - Setup MSAL authentication services in `authService.js`: + - MSAL configuration + - Initialize **[MSAL (@azure/msal-react)](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md#initialization-of-msal)** in React app + - Configure **[Authority and Redirect URL](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md#optional-configure-redirect-uri)** properties in `authProvider.js` + - MSAL client authentication, + - **[Single-page application: Sign-in and Sign-out](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-sign-in?tabs=javascript2)** + - Create patient search function `callPatientSearch.js` to setup and call FHIR API using `fetch` method + - Single-page application: **[Call a web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-call-api?tabs=javascript#call-a-web-api)** + - use the `acquireTokenSilent` method to acquire or renew an access token before you call a web API + - Access and update DOM elements in `updateUI.js` to render patient search results + +- (Optional) Include any other modern UI features to improve the user experience. +- **[Register your app](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** + - Set a redirect URL to your local and Azure JavaScript Web App URL in the `Public Client` `Web Platform Configuration` of your App Registration tenant with directory admin access. + + **Note:** These URIs will accept as destinations when returning authentication responses (tokens) after successfully authenticating users. + +- Test and run your code locally + - Set redirectUri to `https://localhost:3000` in `authConfig.js` file + - Run at cmdline: + ```bash + npm install + nmp start + ``` +- **[Deploy your React web app](https://docs.microsoft.com/en-us/azure/app-service/quickstart-nodejs?pivots=platform-linux#deploy-to-azure)** to Azure from VS Code + - Set `redirectUri` to `https://[react-patient-search-app-name].azurewebsites.net` in `authConfig.js` file + - Deploy your React web app using VS Code and the Azure App Service extension +- Test updated sample JavaScript app with patient Lookup feature + - Browse to App Service website URL in In-private / Incognito window + - Sign in with your secondary tenant (or tenant where App Registration is configured) used in deploying FHIR Server Samples reference architecture + - You should see a list of patients that were loaded into FHIR Server + - Enter full or partial name (Given or Family) in the Search box and click Search button + - This will call the FHIR API interface that filters patient data that contains the specified Given name or Family name configured and return the patient search results to browser + \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solution04.md b/027-FHIRPoweredHealthcare/Coach/Solution04.md index 9b68e9c8c3..8893e9632f 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution04.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution04.md @@ -1,47 +1,88 @@ -# Coach's Guide: Challenge 4 - Connect to FHIR Server and read FHIR data through a JavaScript app - -[< Previous Challenge](./Solution03.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution05.md) - -## Notes & Guidance - -In this challenge, you will deploy a **[FHIR sample JavaScript app](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-write-web-app)** to connect and read FHIR patient data. You will configure **[public client application registration](https://docs.microsoft.com/en-us/azure/healthcare-apis/register-public-azure-ad-client-app)** to allow JavaScript app to access FHIR Server. - -**[Public Client Application registrations](https://docs.microsoft.com/en-us/azure/healthcare-apis/register-public-azure-ad-client-app)** are Azure AD representations of apps that can authenticate and authorize for API permissions on behalf of a user. Public clients are mobile and SPA JavaScript apps that can't be trusted to hold an application secret, so you don't need to add one. For a SPA, you can enable implicit flow for app user sign-in with ID tokens and/or call a protected web API with Access tokens. - -**You will deploy a FHIR sample JavaScript app in Azure to read patient data from the FHIR service.** -- **[Create a new Azure Web App](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-write-web-app#create-web-application)** in Azure Portal to host the FHIR sample JavaScript app. -- Check in secondary Azure AD tenant (can be primary tenant if you already have directory admin privilege) that a **[Resource Application](https://docs.microsoft.com/en-us/azure/healthcare-apis/register-resource-azure-ad-client-app)** has been registered for the FHIR Server resource. - - **Note:** - - If you are using the Azure API for FHIR, a Resource Application is automatically created when you deploy the service in same AAD tenant as your application. - - In the FHIR Server Sample environment deployment, a Resource Application is automatically created for the FHIR Server resource. - -- **[Register a public client application](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-public-app-reg)** in secondary Azure AD tenant (can be primary tenant if you already have directory admin privilege) to allow the deployed Web App to authenticate and authorize for FHIR Server API access. - - Go to Azure AD and switch to your secondary Azure AD tenant (can be primary tenant if you already have directory admin privilege) - - Click `App Registration` and add a new Public client/native (mobile & desktop) registration or open existing one if already exist (from FHIR Server Samples deployment). - - Capture `client ID` and `tenant ID` from `Overview` blade for use in later step. - - Connect with web app - - Select `Authentication` blade, click `Add a new platform` and select `Web` - - Add `https://[WEB-APP-NAME].azurewebsites.net` to `redirect URI` list. - - Select `Access tokens` and `ID tokens` check boxes and click `Configure`. - - Add `API Permissions` - - Select `API permissions` blade and click `Add a new permission` - - Select `APIs my organization uses`, search for `Azure Healthcare APIs` and select it. - - Select `user_impersonation` and click `add permissions`. -- Update the sample JavaScript app to connect and read FHIR patient data from your FHIR Serer. - - Start with the sample code from the **[FHIR patient JavaScript app](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-write-web-app)** site or **[index.html](../Student/Resources/JavaScript-Sample/index.html)** file in the Student Resources folder. - - Open App Service resource for sample web app in Azure Portal. - - Select App Service Editor and select `index.html` file to open it in the editor. - - Paste the sample code into the editor to replace the content. - - Initialize **[MSAL ((Mirosoft Authentication Library) provider](https://docs.microsoft.com/en-us/graph/toolkit/providers/msal)** configuration object for your FHIR environment: - - `clientId` - Update with your client application ID of public client app registered earlier - - `authority` - Update with Authority from your FHIR Server (under Authentication) - - `FHIRendpoint` - Update the FHIRendpoint to have your FHIR service name - - `Scopes` - Update with Audience from your FHIR Server (under Authentication) - - **Note:** App Services Editor automatically saves changes. -- Test sample JavaScript app - - Browse to App Service website URL in a new In-private / InCognito window - - Sign in with your secondary tenant (can be primary tenant if you already have directory admin privilege) used in deploying FHIR Server Samples reference architecture - - You should see a list of patients that were loaded into FHIR Server. - +# Coach's Guide: Challenge 4 - Explore and Analyze FHIR EHR Data + +[< Previous Challenge](./Solution03.md) - **[Home](../README.md)** - [Next Challenge>](./Solution05.md) + +## Introduction + +In this challenge, you will deploy the OSS **[FHIR-to-Synapse Analytics Pipeline](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/docs/Deployment.md)** to move FHIR data from Azure FHIR service to a Azure Data Lake storage in near real time and making it available to a Synapse workspace, which will enable you to query against the entire FHIR dataset with tools such as Synapse Studio, SSMS, and/or Power BI. + +This pipeline is an Azure Function solution that extracts data from the FHIR server using FHIR Resource APIs, converts them to hierarchical Parquet files, and writes them to Azure Data Lake storage in near real time. It contains a script to create External Tables and Views in Synapse Serverless SQL pool pointing to the Parquet files. You can also access the Parquet files directly from a Synapse Spark Pool to perform custom transformation to downstream systems, i.e. USCDI datamart, etc. + +**First, you need to deploy an instance of FHIR service (done in challenge 1) and a **[Synapse Workspace](https://docs.microsoft.com/en-us/azure/synapse-analytics/quickstart-create-workspace)**.** +- First, create ADLSGEN2 storage account in Azure Portal for use by Synapse workspace + - Search for Data Lake Storage Gen 2 + - Select Data Lake Storage Gen 2 + - Create new ADLSGEN2 storage account + - Select File System and name it `users` +- Create Synapse workspace + - Search for Synapse in Azure Portal + - Select Azure Synapse Analytics + - Select Add to create workspace + +**Deploy the FHIR-to-Synapse Analytics Pipeline** +- To **[deploy the pipeline](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/docs/Deployment.md#1-deploy-the-pipeline)**, run this **[ARM template](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FMicrosoft%2FFHIR-Analytics-Pipelines%2Fmain%2FFhirToDataLake%2Fdeploy%2Ftemplates%2FFhirSynapsePipelineTemplate.json)** for pipeline deployment through the Azure Portal. You will need to provide the following Azure and script parameters (at minimum): + - Subscription + - Resource Group (Name of the resource group where you want the pipeline related resources to be created) + - Region + - App Name (A name for the Azure Function) + - Fhir server Url (The URL of the FHIR server) + - Authentication (Whether to access the FHIR server with managed identity authentication. Set it to false if you are using an instance of the FHIR server for Azure with public access) + - Fhir Version (defaults to `R4`) + - Container name (A name for the Storage Account container to which Parquet files will be written - defaults to `fhir`) + - Filter Scope (For data filtering use. The export scope can be System or Group. Defaults to `System`) + - Customized Schema (If enabled, pipeline Generate customized data based on given schema - defaults to `false`) + - Package url(The build package of the agent. You need not change this) + - Storage Account Type (Defaults to `Standard_LRS`) + - Location (Location for all resources - Defaults to Resource group location) + - Deploy App Insights (Whether to deploy the Application Insights - Defaults to `true`) + - App Insight Location (The location to deploy the App Insight) + +Hint: Ensure to make note of the names of the Storage Account and the Azure Function App created during the deployment. + +**Provide Access of the FHIR server to the Azure Function** +- Assign the FHIR Data Reader role to the Azure Function created from the deployment above + +**Verify the data movement** +- Azure Function app deployed runs automatically. +- Time taken to write the FHIR dataset to the storage account depends on the amount of data stored in the FHIR server. +- After the Azure Function execution is completed, you should have Parquet files stored in the Storage Account. +- Browse to the results folder inside the container. You should see folders corresponding to different FHIR resources. + +Hint: you will see folders for only those Resources that are present in your FHIR server. Running the PowerShell **[script](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/scripts/Set-SynapseEnvironment.ps1)** will create folders for other Resources. + +**Provide privilege to your account** +- You must provide the following roles to your account to run the PowerShell script in the next step. You may revoke these roles after the installation is complete. + - Assign Synapse Administrator role in your Synapse Workspace + - Select Synapse Studio> Manage > Access Control + - Provide `Synapse Administrator` role to your account + - Assign the Storage Blob Data Contributor role in your Storage Account + - Select Access Control (IAM) + - Assign `Storage Blob Data Contributor` role to your account + +**Provide access of the Storage Account to the Synapse Workspace** +- Assign the Storage Blob Data Contributor role to your Synapse Workspace. + - Select Managed identify while adding members to `Storage Blob Data Contributor` role. + - Select your Synapse workspace instance from the list of managed identities shown on the portal. + +**Run the PowerShell script** +- Run the PowerShell **[script](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/scripts/Set-SynapseEnvironment.ps1)** to create External Tables and Views in Synapse Serverless SQL Pool pointing to the Parquet files in the Storage Account. + - Clone the **[FHIR-Analytics Pipeline](https://github.com/microsoft/FHIR-Analytics-Pipelines)** GitHub repo. + - Open PowerShell console (ensure you have the latest version of PowerShell) + - Install `Az` and `Az.Synapse` (if not exist) + ```PowerShell + Install-Module -Name Az + Install-Module -Name Az.Synapse + ``` + - Log into Azure subscription where Synapse exists + ```PowerShell + Connect-AzAccount -SubscriptionId 'yyyy-yyyy-yyyy-yyyy' + ``` + - Run PowerShell script under the scripts folder (..\FhirToDataLake\scripts) + ```PowerShell + ./Set-SynapseEnvironment.ps1 -SynapseWorkspaceName "{Name of your Synapse workspace instance}" -StorageName "{Name of your storage account where Parquet files are written}". + ``` + - Query data from Synapse Studio + - Go to your Synapse workspace serverless SQL pool + - Select `fhirdb` database + - Expand External Tables and Views + - Query FHIR data in the entities diff --git a/027-FHIRPoweredHealthcare/Coach/Solution05.md b/027-FHIRPoweredHealthcare/Coach/Solution05.md index faab5f6b4b..4ae39b7db7 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution05.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution05.md @@ -1,27 +1,63 @@ -# Coach's Guide: Challenge 5 - Explore FHIR medical records through FHIR Dashboard and SMART on FHIR apps apps +# Coach's Guide: Challenge 5 - : Export and Anonymize FHIR EHR Data -[< Previous Challenge](./Solution04.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution06.md) +[< Previous Challenge](./Solution04.md) - **[Home](../README.md)** - [Next Challenge>](./Solution06.md) ## Notes & Guidance -In this challenge, you will explore patient medical records and SMART on FHIR apps through the FHIR Dashboard app. +In this challenge, you will use Azure Health Data Services platform to export and de-identify FHIR data according to a set of data redaction/transformation rules specified in a **[configuration file](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#configuration-file-format)**. The goal of the of this challege is to apply the **[HIPAA Safe Harbor Method](https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html#safeharborguidance)** de-id requirements against FHIR data to create a research datasets. -**[What is SMART on FHIR?](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-faq#what-is-smart-on-fhir)** -SMART ((Substitutable Medical Applications and Reusable Technology) on FHIR is a set of open specifications to integrate partner apps with FHIR Servers and other Health IT systems, i.e. Electronic Health Records and Health Information Exchanges. By creating a SMART on FHIR application, you can ensure that your application can be accessed and leveraged by different systems. +**[FHIR Tool for Anonymization](https://github.com/microsoft/FHIR-Tools-for-Anonymization)** provides tooling to anonymize healthcare FHIR data, on-premises or cloud, for secondary usage such as research, public health, etc. in the following methods: +- Command line tool, +- Azure Data Factory (ADF) pipeline +- De-ID $export FHIR service operation -Azure API for FHIR has a built-in **[Azure AD SMART on FHIR proxy](https://docs.microsoft.com/en-us/azure/healthcare-apis/use-smart-on-fhir-proxy)** to integrate partner apps with FHIR Servers and EMR systems through FHIR interfaces. This set of open specifications describes how an app should discover authentication endpoints for FHIR Server and start an authentication sequence. Specifically, the proxy enables the **[EHR launch sequence](https://hl7.org/fhir/smart-app-launch/#ehr-launch-sequence)**. +**You will deploy a **[FHIR Anonymization ADF pipeline](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#anonymize-fhir-data-using-azure-data-factory)** to de-identify FHIR data.** -**Explore patient medical records and SMART on FHIR apps** -- Open `{ENVIRONMENTNAME}dash` App Service and copy `URL` from `Overview` blade -- Open browser in In-private/Incognito mode and navigate to FHIR Dashboard app URL (above) -- Use the dashboard user credentials to sign in (captured during FHIR Server Samples deployment in **[challenge 1](./Solution01.md)**) - - In popup Consent dialog box, accept consent to permissions requested by the Confidential Client app to get access to FHIR Server. -- After a successful login, explore patient medical records through FHIR Dashboard app, including: - - Patient and its FHIR bundle details - - Patient medical details: - - `Conditions` - - `Encounters` - - `Observations` -- Explore SMART on FHIR Apps through FHIR Dashboard app, including: - - `Growth Chart` - - `Medications` \ No newline at end of file +- **Setup ADF pipeline configuration for anonymization** + - Download or Clone the **[Tools-for-Health-Data-Anonymization](https://github.com/microsoft/Tools-for-Health-Data-Anonymization)** GitHub repo + - Navigate to the project subfolder at: `FHIR-Tools-for-Anonymization\FHIR\src\Microsoft.Health.Fhir.Anonymizer.R4.AzureDataFactoryPipeline` folder and configure `AzureDataFactorySettings.json` file as follows: + ``` + { + "dataFactoryName": "[Custom Data Factory Name]", + "resourceLocation": "[Region for Data Factory]", + "sourceStorageAccountName": "[Storage Account Name for source files]", + "sourceStorageAccountKey": "[Storage Account Key for source files]", + "destinationStorageAccountName": "[Storage Account Name for destination files]", + "destinationStorageAccountKey": "[Storage Account Key for destination files]", + "sourceStorageContainerName": "[Storage Container Name for source files]", + "sourceContainerFolderPath": "[Optional: Directory for source resource file path]", + "destinationStorageContainerName": "[Storage Container Name for destination files]", + "destinationContainerFolderPath": "[Optional: Directory for destination resource file path]", + "activityContainerName": "[Container name for anonymizer tool binraries]" + } + ``` + - In PowerShell command window, execute the following commands to define variables needed during the script execution to create and configure the Anonymization Batch service: + ```powershell + $SubscriptionId = "SubscriptionId" + $BatchAccountName = "BatchAccountName. New batch account would be created if account name is null or empty." + $BatchAccountPoolName = "BatchAccountPoolName" + $BatchComputeNodeSize = "Node size for batch node. Default value is 'Standard_d1'" + $ResourceGroupName = "Resource group name for Data Factory. Default value is $dataFactoryName + 'resourcegroup'" + ``` +- **Deploy ADF pipeline for FHIR data anonymization** + - Run the following PowerShell commands to create the Data Factory anonymization pipeline: + - First, log into Azure using PowerShell + ```powershell + Connect-AzAccount + Get-AzSubscription + Select-AzSubscription -SubscriptionId "" + ``` + - Navigate to the project subfolder at: `FHIR-Tools-for-Anonymization\FHIR\src\Microsoft.Health.Fhir.Anonymizer.R4.AzureDataFactoryPipeline` and run the script with parameters as follows: + ```powershell + .\DeployAzureDataFactoryPipeline.ps1 -SubscriptionId $SubscriptionId -BatchAccountName $BatchAccountName -BatchAccountPoolName $BatchAccountPoolName -BatchComputeNodeSize $BatchComputeNodeSize -ResourceGroupName $ResourceGroupName ``` +- **Upload test FHIR patient data for anonymization** + - **[Configure](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/configure-export-data)** and **[perform](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/export-data)** the builk FHIR export using the $export operation in the FHIR service via Postman. + - Or you can simply upload Synthea generated FHIR patient data to the source container configured in the linked service of ADF pipeline for testing the Anonymization pipeline. +- **Trigger and monitor pipeline run to anonymize the uploaded test FHIR patient data** + - Run in PowerShell: + ```powershell + .\DeployAzureDataFactoryPipeline.ps1 -SubscriptionId $SubscriptionId -BatchAccountName $BatchAccountName -BatchAccountPoolName $BatchAccountPoolName -BatchComputeNodeSize $BatchComputeNodeSize -ResourceGroupName $ResourceGroupName + ``` + Hint: If you get **Azure Batch error**, either Azure Batch is not enabled in your subscription or Azure Batch already deployed the max number of time in your subscription. +- **Validate export and anonymization** + - Compare pre de-identified data in the 'source' container and post de-identified data in the 'destination' container. diff --git a/027-FHIRPoweredHealthcare/Coach/Solution06.md b/027-FHIRPoweredHealthcare/Coach/Solution06.md index 789d83ebcd..23ab29be8a 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution06.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution06.md @@ -1,148 +1,136 @@ -# Coach's Guide: Challenge 6 - Create a new Single Page App (SPA) for patient search +# Coach's Guide: Challenge 6 - : Ingest and Persist IoT Medical Device Data -[< Previous Challenge](./Solution05.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution07.md) +[< Previous Challenge](./Solution05.md) - **[Home](../README.md)** - [Next Challenge>](./Solution07.md) ## Notes & Guidance -In this challenge, you will create a new Single Page App (SPA) integrated with Microsoft Authentication Library (MSAL) to connect, read and search for FHIR patient data. - -![JavaScript SPA App - Implicit Flow](../images/JavaScriptSPA-ImplicitFlow.jpg) - -- Make sure the following Node.js prerequistes have been completed - - To see if you already have Node.js and npm installed and check the installed version, run: - ```bash - node -v - npm -v - ``` - - - Download and install **[Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)** - - Download latest **[Node.js pre-built installer](https://nodejs.org/en/download/)** for your platform - - Run downloaded `node-v14.15.1-x64.msi` executable to install node.js - - Post installation, a cmdline window will popup to install additional tools for Node.js. In the cmdline window, - ```Command - Press any key to continue... - ``` -- Create a new JavaScript SPA patient search app - - **Option 1: Create a Node.js SPA AAD MSAL Patient Search app** - - This step-by-step guide will create a vanilla JavaScript SPA to query protected web API, i.e. Microsoft Graph API, but you will modify it to access FHIR Server web API that accepts tokens from the Microsoft identity platform endpoint. - - In this scenario, after a user signs in, an access token is requested and added to HTTP requests through the authorization header. This token will be used to acquire patient data via FHIR Server API. - - Setup you web server or project, download **[project files](https://github.com/Azure-Samples/active-directory-javascript-graphapi-v2/archive/quickstart.zip)** - - Create and initialize your project - - Initialize your SPA, run `npm init` at your project root folder - - Install required dependencies, run - ```bash - npm install express --save - npm install morgan --save - ``` - - - Create a simple server to serve your SPA in `server.js` file. - - Setup front-end source folder, i.e. `JavaScriptSPA` - - Setup route for `index.html` - - Start the server - - Create the SPA UI in `index.html` file that handles the following: - - Implements UI built with Bootstrap 4 Framework - - Imports script files for - - configuration, - - authentication, - - API call - - Access and update DOM elements in `ui.js` file - - User authentication interface (SignIn/SignOut) - - Display patient search results interface - - **[Register your app](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** - - Set a redirect URL to your JavaScrip Web App URL (Azure and Local) in the `Public Client` `Web Platform Configuration` of your App Registration tenant. - - Note: These URIs will accept as destinations when returning authentication responses (tokens) after successfully authenticating users. - - Configure your JavaScript SPA parameters for authentication, in `authConfig.js` file, where: - - `clientId`: is the Application (client) ID for the application you registered. - - `authority`: is the Authority value from FHIR Server Authentication setting. - - `redirectUri`: is your JavaScrip Web App URL from App Service. - - `Scope`: - - Process MSAL authentication and acquire token to call FHIR Server API in `authPopup.js` file - - Store REST endpoint for FHIR server in `graphConfig.js` file - - Make REST call to FHIR Server in `graph.js` file - - Create helper function `callMSGraph()` to make the HTTP GET request against the protected FHIR API resource that requires a token. - - This method appends the acquired token in the HTTP Authorization header. - - The request then uses `fetch` method to call the API and returns the response to the caller. - - Add search components in `index.html` to implement patient lookup. - - Add a search input textbox to enter search criteria - - Add a submit button to perform the patient search - - - **Option 2: Create React AAD MSAL Patient Search SPA** - - Build a new SPA in React using **[Create React App](https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)** toolchain. It sets up your development environment with latest JavaScript features and optimizes your app for production. +In this challenge, you will work with IoT medical device data using the **[MedTech service](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/get-started-with-iot)** in Azure Health Data Services. You will use **[MedTech service toolkit](https://github.com/microsoft/iomt-fhir/tree/main/tools/data-mapper)** to transform IoT medical device data into Fast Healthcare Interoperability Resources (FHIR®)-based Observation resources. You will deploy a **[MedTech service data pipeline](microsoft.com/en-us/azure/healthcare-apis/iot/iot-data-flow)** to ingest medical IoT data, normalize and group these messages,transform the grouped-normalized messages into FHIR-based Observation resources, and then persist the transformed messages into the FHIR service (previously deployed in challenge 1). + +The **[MedTech service](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/get-started-with-iot)** in Azure Health Data Services uses an event hub to ingests streaming event data from IoT medical devices, transforms them into FHIR-based Observation resources, retrieves associated Patient resource from FHIR service, adds them as reference to the Observation resource created, and then persists the transformed messages to the FHIR service. + +**[Azure IoMT Connector Data Mapper](https://github.com/microsoft/iomt-fhir/tree/main/tools/data-mapper)** is the MedTech toolkit to visualize and configure normalize mapping between the medical Iot data and FHIR. Once you completed the FHIR mapping, you can export it and upload the mapping files to your **[MedTech service Device Mapping](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/how-to-use-device-mappings)** configuration in Azure Portal. + +### IoMT MedTech service scenario +You will deploy an instance of MedTech service in your Azure Health Data Service workspace, and configure it to receive and transform medical IoT data for persitence in your FHIR service (deployed in challenge 1) as Observation resources. + +**Deploy and configure **[Azure Event Hubs](https://docs.microsoft.com/en-us/azure/event-hubs/)** for MedTech service to **[ingest](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/iot-data-flow#ingest)** medical IoT device data** +- Create **[Event Hubs namespace](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-create#create-an-event-hubs-namespace)** using Azure Portal + - Search and select Event Hubs in Azure Portal + - Click +Add in Event Hubs + - Enter a unique name and other Azure parameters on the Create namespace page + - Review and create Event Hubs Namespace + + Hint: An Event Hubs namespace provides a unique scoping container, in which you create one or more event hubs. + +- Create an **[Event Hub](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-create#create-an-event-hub)** within the namespace + - Click +Event Hub on the Event Hub blade of the Event Hubs Namespace page + - Enter name and create your event hub (i.e. `devicedata`) + + Hint: + - The partition count setting allows you to parallelize consumption across many consumers. + - The message retention setting specifies how long the Event Hubs service keeps data. + +**Deploy **[MedTech Service manually](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/deploy-iot-connector-in-azure#deploy-the-medtech-service-manually)** in your AHDS workspace and configure it to use FHIR service deployed in challenge 1** +- Open your AHDS worksapce +- Select Deploy MedTech service button +- Select `+Add` MedTech service +- Configure it to ingest IoT data from the newly created Event Hubs instance in this challenge + - Enter MedTech service name (a friendly, unique name for your MedTech service) + - Enter Event Hubs Namespace (name of the Event Hubs Namespace that you've previously deployed) + - Enter Event Hubs name (the event hub that you previously deployed within the Event Hubs Namespace, i.e. `devicedata`) + - Enter Consumer group (Defaults to `$Default`) + - Under Device Mapping, + - Enter the Device mapping JSON code for use with your MedTech service + - Under Destination, + - Enter the destination properties associated with your MedTech service. + - Enter the FHIR Service name (previously deployed in challenge 1) + - Enter Destination Name (a friendly name for the destination) + - Select `Create` or `Lookup` for Resolution Type + Hint: If device and patient resource doesn't exist in FHIR service, `Create` option will enable new resources will be created; otherwise an error will occur for `Lookup` option. - - You’ll need to have Node >= 8.10 and npm >= 5.6 on your machine. To create a project, run: - ```bash - npx create-react-app react-patient-search - cd react-patient-search - npm start - ``` + Hint: The custom Device Mapping and Destination (FHIR) Mapping will be configured and generated using the IoT mapper tool later on in this challenge. + +**Deploy the **[IoT mapper tool](https://github.com/microsoft/iomt-fhir/tree/main/tools/data-mapper)**** + - Import **[sample IoT messages](https://github.com/microsoft/azure-health-data-services-workshop/tree/main/Challenge-09%20-%20MedTech%20service/SampleData/Answers)** into tool to customize device mapping to FHIR + - Export customized mapping in tool to generate the new Device Mapping and FHIR Mapping files + +**Import the newly generated FHIR mapping into your MedTech service** + - Configure and save the **[Device mapping](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/deploy-iot-connector-in-azure#configure-device-mapping-properties)** JSON in the MedTech service (Device Mapping setting) + - Configure and save the Destination (FHIR) mapping JSON to in the MedTech service (Destination setting) + +**Send sample device data to persist in the FHIR service using Postman via **[MedTech service Event Hub service](https://docs.microsoft.com/en-us/rest/api/eventhub/get-azure-active-directory-token)**** +- Get an Azure Active Directory (Azure AD) token to send events to an event hub + - **[Register your app with AAD](https://docs.microsoft.com/en-us/rest/api/eventhub/get-azure-active-directory-token#register-your-app-with-azure-ad)** + - In Azure Portal, go to AAD -> App registrations -> select `+ New registration` + - Enter name for the client app/service principle and select `Register` + - Go to `Overview` page for the client app service registered, save the following values for use in Postman configuration to get AAD token later. + - Application (client) ID + - Directory (tenant) ID + - Go to `Certificates & secrets` page and select `+New client secret` + - Enter description and when certificate will expire, then select `Add` + - Copy the client secret value for use in Postman configuration to get AAD token later. + - **[Add application to the Event Hubs Data Sender role](https://docs.microsoft.com/en-us/rest/api/eventhub/get-azure-active-directory-token#add-application-to-the-event-hubs-data-sender-role)** + - In `Event Hubs Namespace`, select `Access Control (IAM)` page + - Select `+Add` to add Role Assignment + - Select Azure Event Hubs Data Sender for `Role` dropdown + - Select `Azure AD user, group or principla` for `Assign access to` dropdown + - Select your application for the service principal (name of client app/service principle created above). + - Select `Save` to add the new role assignment +- Send events to an event hub via Postman + - Open Postman and **[import Postman data](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/)**: + - In Postman, click Import. + - In your **[Student Resources folder for Postman](../Student/Resources/Postman)**, select **[Environment](../Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_environment.json)** and **[Collection](../Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_collection.json)** JSON files. + - Confirm the name, format, and import as, then click Import to bring your data into your Postman. + - You will get confirmation that `WTH FHIR-IoT-MedTech` Collection and Environment were imported and see in Postman a new `WTH FHIR-IoT-MedTech` in `Collections` (left) blade and top right `Manage Environments` drop-down list. + - Select `WTH FHIR-IoT-MedTech_event hub namespace` environment and click `Environment Quick Look` button to see a list of env vars: + - Click `Edit` to open `Management Environments` window and input the corresponding FHIR environment values: + - `adtenantId`: This is the tenant Id of the AD tenant + - `clientId`: This is the client Id that is stored in Secret. + - `clientSecret`: This is the client Secret that is stored in Secret. + - `bearerToken`: The value will be set when `AuthorizeGetToken SetBearer` request below is sent. + - `fhirurl`: This is the FHIR URL `https://{ENVIRONMENTNAME}.azurehealthcareapis.com` from FHIR service you created in challenge 1. + - `resource`: `https://eventhubs.azure.net` + - `eventhubnamespaceurl`: event hub namespace url created for MedTech service + - Click the Update button and close the `MANAGE ENVIRONMENTS` window. - **Note:** `npx` on the first line above refers to a package runner tool that comes with npm 5.2+. - - - Use **[Microsoft Authentication Library for JavaScript (MSAL.js) 2.0](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/README.md#microsoft-authentication-library-for-javascript-msaljs-20-for-browser-based-single-page-applications)** for Browser-Based Single-Page Applications - -Install **[MSAL React package](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/README.md#installation)**, run: - ```bash - npm install react react-dom - npm install @azure/msal-react @azure/msal-browser - ``` - - Setup `index.js` in root project folder to handle the app startup and basic HTTP web server functionality similar what's done in traditional Apache. - - Import `react-dom` package to provide DOM-specific methods to be used in the app. - ```DotNet - import ReactDOM from "react-dom"; - ``` - - Setup **[React Redux store](https://react-redux.js.org/introduction/basic-tutorial)** to make it available to the app. - ```DotNet - import { Provider } from "react-redux"; - import { basicReduxStore } from "./reduxStore"; - ``` - - Setup `react-dom` `render` method to render React app to the web page. - - **[Providing the Redux store](https://react-redux.js.org/introduction/basic-tutorial#providing-the-store)** by wrapping the app with the `` API provided by React Redux in the `ReactDOM.render()` function. - ```DotNet - ReactDOM.render( - - - , - document.getElementById("root") - ); - ``` - - Create React SPA UI in `App.js` to handle MS Identity Platorm authentication services and patient search UI functionalities. - - Import authentication provider and instantiate it only once as a singleton service. - - Implement patient search UI built with Bootstrap 4 Framework. - - **[Include React Bootstrap package in your app](https://react-bootstrap.github.io/getting-started/introduction/)** - - **[Create a simple search app in your React app](https://medium.com/developer-circle-kampala/how-to-create-a-simple-search-app-in-react-df3cf55927f5)** - - Create a search component - - Add a search input textbox and submit button to perform the search - - Create helper functions to handle search events in JavaScript - - Setup MSAL authentication services in `authService.js`: - - MSAL configuration - - Initialize **[MSAL (@azure/msal-react)](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md#initialization-of-msal)** in React app - - Configure **[Authority and Redirect URL](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md#optional-configure-redirect-uri)** properties in `authProvider.js` - - MSAL client authentication, - - **[Single-page application: Sign-in and Sign-out](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-sign-in?tabs=javascript2)** - - Create patient search function `callPatientSearch.js` to setup and call FHIR API using `fetch` method - - Single-page application: **[Call a web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-call-api?tabs=javascript#call-a-web-api)** - - use the `acquireTokenSilent` method to acquire or renew an access token before you call a web API - - Access and update DOM elements in `updateUI.js` to render patient search results - -- (Optional) Include any other modern UI features to improve the user experience. -- **[Register your app](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** - - Set a redirect URL to your local and Azure JavaScript Web App URL in the `Public Client` `Web Platform Configuration` of your App Registration tenant with directory admin access. - - **Note:** These URIs will accept as destinations when returning authentication responses (tokens) after successfully authenticating users. - -- Test and run your code locally - - Set redirectUri to `https://localhost:3000` in `authConfig.js` file - - Run at cmdline: - ```bash - npm install - nmp start - ``` -- **[Deploy your React web app](https://docs.microsoft.com/en-us/azure/app-service/quickstart-nodejs?pivots=platform-linux#deploy-to-azure)** to Azure from VS Code - - Set `redirectUri` to `https://[react-patient-search-app-name].azurewebsites.net` in `authConfig.js` file - - Deploy your React web app using VS Code and the Azure App Service extension -- Test updated sample JavaScript app with patient Lookup feature - - Browse to App Service website URL in In-private / Incognito window - - Sign in with your secondary tenant (or tenant where App Registration is configured) used in deploying FHIR Server Samples reference architecture - - You should see a list of patients that were loaded into FHIR Server - - Enter full or partial name (Given or Family) in the Search box and click Search button - - This will call the FHIR API interface that filters patient data that contains the specified Given name or Family name configured and return the patient search results to browser - \ No newline at end of file + - Run `Send message to devicedata` API HTTP Request in the `WTH FHIR-IoT-MedTech` Postman collection: + - First, open `AuthorizeGetToken SetBearer` and confirm `WTH FHIR-IoT-MedTech_event hub namespace` environment is selected in the top-right `Environment` drop-down. + - Click the Send button to pass the values in the Body to AD Tenant, get the bearer token back and assign it to variable bearerToken. + - Open `Send message to devicedata` + - On the `Body` tab, + - Select `raw` for the data type + - Enter the test device data as the message for the body + - Select `Send` to send the message to the Event Hub queue for processing by the MedTech service + - If successful, you'll see the status as Created with the code 201 as shown in the following image. + - On the `Event Hub Namespace` Overview page in the Azure portal, you'll' see that the messages are posted to the queue in the `Incoming Messages` section. + **Note:** `bearerToken` has expiration, so if you get Authentication errors in any requests, re-run `AuthorizeGetToken SetBearer` to get a new `bearerToken`. + + - **Alternatively, you can configure Postman collection and environment manually as follows:** + - **[Use Postman to get the AAD token](https://docs.microsoft.com/en-us/rest/api/eventhub/get-azure-active-directory-token#use-postman-to-get-the-azure-ad-token)** + - **[Send messages to a queue](https://docs.microsoft.com/en-us/rest/api/eventhub/get-azure-active-directory-token#send-messages-to-a-queue)** + - Configure a new Postman opertation + - Select `Post` for method + - Enter URI: `https://.servicebus.windows.net//messages. Replace ` + - Replace with the name of the Event Hubs namespace + - Replace with the name of the queue + - on `Header` tab, add the following + - Add `Authorization` key and value: `Bearer ` + Hint: Don't copy the enclosing double quotes in the token value + - Add `Content-Type` key and `application/atom+xml;type=entry;charset=utf-8` as the value for it. + - On the `Body` tab, + - Select `raw` for the data type + - Enter the test device data as the message for the body + - Select `Send` to send the message to the Event Hub queue for processing by the MedTech service + - If successful, you'll see the status as Created with the code 201 as shown in the following image. + - On the `Event Hub Namespace` Overview page in the Azure portal, you'll' see that the messages are posted to the queue in the `Incoming Messages` section. +- Verify device data is saved in the FHIR service as Observation resource(s) using Postman + - Open Postman collection: `WTH FHIR` (imported in challenge 1) + - First, run `AuthorizeGetToken SetBearer` API request and confirm `WTH FHIR` environment is selected in the top-right `Environment` drop-down. + - Click the Send button to pass the values in the Body to AD Tenant, get the bearer token back and assign it to variable `bearerToken`. + - Run `Get Observation` API request and click the `Send` button. This will return all patients' Observation resources in the Response body. + - Search for the test device data persisted in the FHIR service as Observation resource, i.e. sample Vital Signs data for Heart Rate. + + **Hint:** `bearerToken` has expiration, so if you get Authentication errors in any requests, re-run `AuthorizeGetToken SetBearer` to get a new `bearerToken`. + + + diff --git a/027-FHIRPoweredHealthcare/Coach/Solution07.md b/027-FHIRPoweredHealthcare/Coach/Solution07.md index d13274c517..4fe6e93585 100644 --- a/027-FHIRPoweredHealthcare/Coach/Solution07.md +++ b/027-FHIRPoweredHealthcare/Coach/Solution07.md @@ -1,16 +1,62 @@ -# Coach's Guide: Challenge 7: Bulk export, anonymize and store FHIR data into Data Lake +# Coach's Guide: Challenge 7 - Load DICOM Imaging Data -[< Previous Challenge](./Solution06.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution08.md) +[< Previous Challenge](./Solution06.md) - **[Home](../README.md)** ## Notes & Guidance -- **Complete [Challenge 0](./Solution00.md) and [Challenge 1](./Solution01.md)**. +In this challenge, you will deploy, configure and use **[DICOM service](https://docs.microsoft.com/azure/healthcare-apis/dicom/)** in **[Azure Health Data Services](https://docs.microsoft.com/azure/healthcare-apis/healthcare-apis-overview)** to work with medical images. DICOM service facilitates transmission of imaging data with any DICOMweb™ enabled system or application through standard transactions including Store (STOW-RS), Search (QIDO-RS), and Retrieve (WADO-RS). It persists imaging data in a *DICOMweb™-compliant server, and injects DICOM metadata into a FHIR server to create a holistic view of patient data. You can upload PHI (Protected Health Information) data to the HIPAA/HITRUST compliant DICOM service, and the data will remain safely segregated within the compliant boundary in the Azure Health Data Services workspace. + +- **Deploy a DICOM service instance within your Azure Health Data Services workspace (deployed in challenge 1).** + - Go to your `Azure Health Data Service` workspace (deployed in challenge 1) + - Select `Deploy DICOM service` in `Overview` page + - Select `+ Add DICOM service` in `DICOM service` page + - Enter DICOM service name and then select `Review + Create` +- **[Configure Azure roles for access to DICOM data](https://docs.microsoft.com/azure/healthcare-apis/configure-azure-rbac#assign-roles-for-the-dicom-service)** + + Hint: You will need to add the `DICOM Data Owner` role for yourself and the Postman service client (Service Principal created in challenge 1). + + - Grant user (yourself) and service principal (created in challenge 1) access to the DICOM access plane + - Go to DICOM service page and select `Access Control (IAM)` blade + - Select `Role assignment` tab and select `+ Add` in `Access Control (IAM)` page + - Search and select `DICOM Data Owner` role in the Role selection + - Search for user (yourself) and service principle (created in challenge 1) to assign the `DICOM Data Owner` role to in the `Select` box +- **Import and configure Postman environment and collection files to connect to DICOM service.** + - You can find these Postman template files (`WTHFHIR.Conformance-as-Postman.postman_collection.json` and `WTHFHIR.dicom-service.postman_environment.json`) in the `/Postman` folder of the Resources.zip file provided by your coach. + - Import the environment and collection template files into Postman + - In Postman `Environment` tab, click the `Import` button + - Add `dicom-service.postman_environment.json` file to Postman using the `Upload Files` button + - Add `Conformance-as-Postman.postman_collection.json` file to Postman using the `Upload Files` button + - Configure Postman environment variables specific to your DICOM service instance + + Hint: + + From your existing fhir-service Postman environment: + - tenantId - AAD tenant ID (you also can find it in AAD -> Overview -> Tenant ID). + - clientId - Application (client) ID for Postman service client app. + - clientSecret - Client secret for your Postman app. + + New values you need to input: + - resource - https://dicom.healthcareapis.azure.com + - baseUrl - Service URL appended with /v1. Go to Portal -> Resource Group -> DICOM service -> Service URL. Copy and add /v1 on the end: https://-.dicom.azurehealthcareapis.com/v1 + +- **Use DICOM service to load imaging files** + - Obtain access token to connect with your DICOM service + - Call `POST AuthorizeGetToken` API call in `Conformance-as-Postman` collection to obtian the access token needed to access DICOM data + - Store DICOM instance with sample DICOM files + - Select corresponding POST `Store-single-instance (xxx.dcm)` in `Conformance-as-Postman` collection for each sample DICOM files (red-triangle.dcm, green-square.dcm and blue-circle.dcm) + - Select the appropriate .dcm file (downloaded previously) for each API call in the `Body` tab. + - For each sample .dcm file, Send appropriate `POST Store-single-instance...` call to populate your DICOM service with the three .dcm single instance files. + - Call `Search-for-xxx` API calls in `Conformance-as-Postman` collection to Search for DICOM studies + - Call `Retrieve-xxx` API calls in `Conformance-as-Postman` collection to Retrieve DICOM studies + - Check logs for changes in DICOM service via Change Feed + - Call `GET /changefeed` API call to retreive logs of all the changes that occur in DICOM service + - Call `GET /changefeed/latest` API call to retrieve log of latest changes that ocrrur in DICOM service + - Call `xxx-extended-query tags` API calls in `Conformance-as-Postman` collection to manage extended query tags in DICOM studies + - Add extended query tags + - List extended query tags + - Get extended query tags + - Update extended query tags + - Delete extended query tags -- If you get **Azure Batch error**, either Azure Batch is not enabled in your subscription or Azure Batch already deployed the max number of time in your subscription. -- If you would like to **adjust the start time or run interval**, open the Logic App in the deployed resource group. The first step called 'Recurrence' is where the timer is stored. - -- If **Logic App fails on Get Token**, create a new token for `{ENVIRONMENTNAME}-service-client` for Azure API for FHIR, and save that as new secret in `{ENVIRONMENTNAME}-clientsecret Secrets` created in this challenge. - -- Logic App succeeded, but **no output was found in Storage Account `{ENVIRONMENTNAME}dlg2`**, check if blobstorageacctstring secret in `{ENVIRONMENTNAME}kv` KeyVault has the connection string of Export Storage Account. diff --git a/027-FHIRPoweredHealthcare/Coach/Solution08.md b/027-FHIRPoweredHealthcare/Coach/Solution08.md deleted file mode 100644 index b185e347b4..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solution08.md +++ /dev/null @@ -1,12 +0,0 @@ -# Coach's Guide: Challenge 8: Stream IoMT Device data into FHIR from IoT Central - -[< Previous Challenge](./Solution07.md) - **[Home](./readme.md)** - [Next Challenge>](./Solution09.md) - -## Notes & Guidance - -- **Complete [Challenge 0](./Solution00.md) and [Challenge 1](./Solution01.md)**. - -- Data from IoT Central sometimes takes longer to load into Azure API for FHIR. - -- If the data takes much longer, check if the mapping templates match the output format of the data in IoT Central. - diff --git a/027-FHIRPoweredHealthcare/Coach/Solution09.md b/027-FHIRPoweredHealthcare/Coach/Solution09.md deleted file mode 100644 index 5a167e92ff..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solution09.md +++ /dev/null @@ -1,12 +0,0 @@ -# Coach's Guide: Challenge 9: Analyze and Visualize FHIR data using PowerBI - -[< Previous Challenge](./Solution08.md) - **[Home](./readme.md)** - -## Notes & Guidance - -- **Complete [Challenge 0](./Solution00.md) and [Challenge 1](./Solution01.md)**. - -- Use the pre-built [PowerBI - PowerQuery Connector for FHIR](./PowerBI%20-%20PowerQuery%20Connector%20for%20FHIR.pbit). - -- Use [SQL Tables using Scripts](./SQL%20DDL%20Script.txt). Use [Databricks Notebook](./fhirhackdatabrickstemplate.dbc). Use the pre-built [PowerBI - SQL Connector](./PowerBI%20-%20SQL%20Connector.pbit). - diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge04/JavaScript/index.html b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge04/JavaScript/index.html deleted file mode 100644 index 5296045b06..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge04/JavaScript/index.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - FHIR Patient browser sample app - - - - -
-

Welcome to the FHIR Patient browsing sample Application

- -
- -
-
- - - - - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/.deployment b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/.deployment deleted file mode 100644 index 6278331818..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/.deployment +++ /dev/null @@ -1,2 +0,0 @@ -[config] -SCM_DO_BUILD_DURING_DEPLOYMENT=true \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/.gitignore b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/.gitignore deleted file mode 100644 index b545699d58..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -package-lock.json -/AppCreationScripts/Steps.md -/AppCreationScripts/createdApps.html -/AppCreationScripts/Quickstart.json diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/AppCreationScripts.md b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/AppCreationScripts.md deleted file mode 100644 index c09d60ccdd..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/AppCreationScripts.md +++ /dev/null @@ -1,186 +0,0 @@ -# Registering the sample apps with the Microsoft identity platform and updating the configuration files using PowerShell - -## Overview - -### Quick summary - -1. On Windows run PowerShell and navigate to the root of the cloned directory -1. In PowerShell run: - - ```PowerShell - Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force - ``` - -1. Run the script to create your Azure AD application and configure the code of the sample application accordingly. (Other ways of running the scripts are described below) - - ```PowerShell - cd .\AppCreationScripts\ - .\Configure.ps1 - ``` - -1. Open the Visual Studio solution and click start - -### More details - -The following paragraphs: - -- [Registering the sample apps with the Microsoft identity platform and updating the configuration files using PowerShell](#Registering-the-sample-apps-with-the-Microsoft-identity-platform-and-updating-the-configuration-files-using-PowerShell) - - [Overview](#Overview) - - [Quick summary](#Quick-summary) - - [More details](#More-details) - - [Goal of the provided scripts](#Goal-of-the-provided-scripts) - - [Presentation of the scripts](#Presentation-of-the-scripts) - - [Usage pattern for tests and DevOps scenarios](#Usage-pattern-for-tests-and-DevOps-scenarios) - - [How to use the app creation scripts?](#How-to-use-the-app-creation-scripts) - - [Pre-requisites](#Pre-requisites) - - [Run the script and start running](#Run-the-script-and-start-running) - - [Four ways to run the script](#Four-ways-to-run-the-script) - - [Option 1 (interactive)](#Option-1-interactive) - - [Option 2 (non-interactive)](#Option-2-non-interactive) - - [Option 3 (Interactive, but create apps in a specified tenant)](#Option-3-Interactive-but-create-apps-in-a-specified-tenant) - - [Option 4 (non-interactive, and create apps in a specified tenant)](#Option-4-non-interactive-and-create-apps-in-a-specified-tenant) - - [Running the script on Azure Sovereign clouds](#Running-the-script-on-Azure-Sovereign-clouds) - -## Goal of the provided scripts - -### Presentation of the scripts - -This sample comes with two PowerShell scripts, which automate the creation of the Azure Active Directory applications, and the configuration of the code for this sample. Once you run them, you will only need to build the solution and you are good to test. - -These scripts are: - -- `Configure.ps1` which: - - creates Azure AD applications and their related objects (permissions, dependencies, secrets), - - changes the configuration files in the C# and JavaScript projects. - - creates a summary file named `createdApps.html` in the folder from which you ran the script, and containing, for each Azure AD application it created: - - the identifier of the application - - the AppId of the application - - the url of its registration in the [Azure portal](https://portal.azure.com). - -- `Cleanup.ps1` which cleans-up the Azure AD objects created by `Configure.ps1`. Note that this script does not revert the changes done in the configuration files, though. You will need to undo the change from source control (from Visual Studio, or from the command line using, for instance, git reset). - -### Usage pattern for tests and DevOps scenarios - -The `Configure.ps1` will stop if it tries to create an Azure AD application which already exists in the tenant. For this, if you are using the script to try/test the sample, or in DevOps scenarios, you might want to run `Cleanup.ps1` just before `Configure.ps1`. This is what is shown in the steps below. - -## How to use the app creation scripts? - -### Pre-requisites - -1. Open PowerShell (On Windows, press `Windows-R` and type `PowerShell` in the search window) -1. Navigate to the root directory of the project. -1. Until you change it, the default [Execution Policy](https:/go.microsoft.com/fwlink/?LinkID=135170) for scripts is usually `Restricted`. In order to run the PowerShell script you need to set the Execution Policy to `RemoteSigned`. You can set this just for the current PowerShell process by running the command: - - ```PowerShell - Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process - ``` - -1. ### (Optionally) install AzureAD PowerShell modules -2. -The scripts install the required PowerShell module (AzureAD) for the current user if needed. However, if you want to install if for all users on the machine, you can follow the following steps: - -1. If you have never done it already, in the PowerShell window, install the AzureAD PowerShell modules. For this: - - 1. Open PowerShell as admin (On Windows, Search Powershell in the search bar, right click on it and select Run as administrator). - 2. Type: - - ```PowerShell - Install-Module AzureAD - ``` - - or if you cannot be administrator on your machine, run: - - ```PowerShell - Install-Module AzureAD -Scope CurrentUser - ``` - -### Run the script and start running - -1. Go to the `AppCreationScripts` sub-folder. From the folder where you cloned the repo, - - ```PowerShell - cd AppCreationScripts - ``` - -1. Run the scripts. See below for the [four options](#four-ways-to-run-the-script) to do that. -1. Open the Visual Studio solution, and in the solution's context menu, choose **Set Startup Projects**. -1. select **Start** for the projects - -You're done. this just works! - -### Four ways to run the script - -We advise four ways of running the script: - -- Interactive: you will be prompted for credentials, and the scripts decide in which tenant to create the objects, -- non-interactive: you will provide credentials, and the scripts decide in which tenant to create the objects, -- Interactive in specific tenant: you will provide the tenant in which you want to create the objects and then you will be prompted for credentials, and the scripts will create the objects, -- non-interactive in specific tenant: you will provide tenant in which you want to create the objects and credentials, and the scripts will create the objects. - -Here are the details on how to do this. - -#### Option 1 (interactive) - -- Just run ``. .\Configure.ps1``, and you will be prompted to sign-in (email address, password, and if needed MFA). -- The script will be run as the signed-in user and will use the tenant in which the user is defined. - -Note that the script will choose the tenant in which to create the applications, based on the user. Also to run the `Cleanup.ps1` script, you will need to re-sign-in. - -#### Option 2 (non-interactive) - -When you know the identity and credentials of the user in the name of whom you want to create the applications, you can use the non-interactive approach. It's more adapted to DevOps. Here is an example of script you'd want to run in a PowerShell Window - -```PowerShell -$secpasswd = ConvertTo-SecureString "[Password here]" -AsPlainText -Force -$mycreds = New-Object System.Management.Automation.PSCredential ("[login@tenantName here]", $secpasswd) -. .\Cleanup.ps1 -Credential $mycreds -. .\Configure.ps1 -Credential $mycreds -``` - -Of course, in real life, you might already get the password as a `SecureString`. You might also want to get the password from KeyVault. - -#### Option 3 (Interactive, but create apps in a specified tenant) - - if you want to create the apps in a particular tenant, you can use the following option: - -- open the [Azure portal](https://portal.azure.com) -- Select the Azure Active directory you are interested in (in the combo-box below your name on the top right of the browser window) -- Find the "Active Directory" object in this tenant -- Go to **Properties** and copy the content of the **Directory Id** property -- Then use the full syntax to run the scripts: - -```PowerShell -$tenantId = "yourTenantIdGuid" -. .\Cleanup.ps1 -TenantId $tenantId -. .\Configure.ps1 -TenantId $tenantId -``` - -#### Option 4 (non-interactive, and create apps in a specified tenant) - -This option combines option 2 and option 3: it creates the application in a specific tenant. See option 3 for the way to get the tenant Id. Then run: - -```PowerShell -$secpasswd = ConvertTo-SecureString "[Password here]" -AsPlainText -Force -$mycreds = New-Object System.Management.Automation.PSCredential ("[login@tenantName here]", $secpasswd) -$tenantId = "yourTenantIdGuid" -. .\Cleanup.ps1 -Credential $mycreds -TenantId $tenantId -. .\Configure.ps1 -Credential $mycreds -TenantId $tenantId -``` - -### Running the script on Azure Sovereign clouds - -All the four options listed above, can be used on any Azure Sovereign clouds. By default, the script targets `AzureCloud`, but it can be changed using the parameter `-AzureEnvironmentName`. - -The acceptable values for this parameter are: - -- AzureCloud -- AzureChinaCloud -- AzureUSGovernment -- AzureGermanyCloud - -Example: - - ```PowerShell - . .\Cleanup.ps1 -AzureEnvironmentName "AzureGermanyCloud" - . .\Configure.ps1 -AzureEnvironmentName "AzureGermanyCloud" - ``` diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/Cleanup.ps1 b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/Cleanup.ps1 deleted file mode 100644 index c89762b20b..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/Cleanup.ps1 +++ /dev/null @@ -1,80 +0,0 @@ -[CmdletBinding()] -param( - [PSCredential] $Credential, - [Parameter(Mandatory=$False, HelpMessage='Tenant ID (This is a GUID which represents the "Directory ID" of the AzureAD tenant into which you want to create the apps')] - [string] $tenantId, - [Parameter(Mandatory=$False, HelpMessage='Azure environment to use while running the script (it defaults to AzureCloud)')] - [string] $azureEnvironmentName -) - -#Requires -Modules AzureAD - - -if ($null -eq (Get-Module -ListAvailable -Name "AzureAD")) { - Install-Module "AzureAD" -Scope CurrentUser -} -Import-Module AzureAD -$ErrorActionPreference = "Stop" - -Function Cleanup -{ - if (!$azureEnvironmentName) - { - $azureEnvironmentName = "AzureCloud" - } - - <# - .Description - This function removes the Azure AD applications for the sample. These applications were created by the Configure.ps1 script - #> - - # $tenantId is the Active Directory Tenant. This is a GUID which represents the "Directory ID" of the AzureAD tenant - # into which you want to create the apps. Look it up in the Azure portal in the "Properties" of the Azure AD. - - # Login to Azure PowerShell (interactive if credentials are not already provided: - # you'll need to sign-in with creds enabling your to create apps in the tenant) - if (!$Credential -and $TenantId) - { - $creds = Connect-AzureAD -TenantId $tenantId -AzureEnvironmentName $azureEnvironmentName - } - else - { - if (!$TenantId) - { - $creds = Connect-AzureAD -Credential $Credential -AzureEnvironmentName $azureEnvironmentName - } - else - { - $creds = Connect-AzureAD -TenantId $tenantId -Credential $Credential -AzureEnvironmentName $azureEnvironmentName - } - } - - if (!$tenantId) - { - $tenantId = $creds.Tenant.Id - } - $tenant = Get-AzureADTenantDetail - $tenantName = ($tenant.VerifiedDomains | Where-Object { $_._Default -eq $True }).Name - - # Removes the applications - Write-Host "Cleaning-up applications from tenant '$tenantName'" - - Write-Host "Removing 'spa' (active-directory-javascript-graphapi-v2) if needed" - Get-AzureADApplication -Filter "DisplayName eq 'active-directory-javascript-graphapi-v2'" | ForEach-Object {Remove-AzureADApplication -ObjectId $_.ObjectId } - $apps = Get-AzureADApplication -Filter "DisplayName eq 'active-directory-javascript-graphapi-v2'" - if ($apps) - { - Remove-AzureADApplication -ObjectId $apps.ObjectId - } - - foreach ($app in $apps) - { - Remove-AzureADApplication -ObjectId $app.ObjectId - Write-Host "Removed active-directory-javascript-graphapi-v2.." - } - # also remove service principals of this app - Get-AzureADServicePrincipal -filter "DisplayName eq 'active-directory-javascript-graphapi-v2'" | ForEach-Object {Remove-AzureADServicePrincipal -ObjectId $_.Id -Confirm:$false} - -} - -Cleanup -Credential $Credential -tenantId $TenantId \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/Configure.ps1 b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/Configure.ps1 deleted file mode 100644 index 6982514d1b..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/Configure.ps1 +++ /dev/null @@ -1,266 +0,0 @@ -[CmdletBinding()] -param( - [PSCredential] $Credential, - [Parameter(Mandatory=$False, HelpMessage='Tenant ID (This is a GUID which represents the "Directory ID" of the AzureAD tenant into which you want to create the apps')] - [string] $tenantId, - [Parameter(Mandatory=$False, HelpMessage='Azure environment to use while running the script (it defaults to AzureCloud)')] - [string] $azureEnvironmentName -) - -#Requires -Modules AzureAD - -<# - This script creates the Azure AD applications needed for this sample and updates the configuration files - for the visual Studio projects from the data in the Azure AD applications. - - Before running this script you need to install the AzureAD cmdlets as an administrator. - For this: - 1) Run Powershell as an administrator - 2) in the PowerShell window, type: Install-Module AzureAD - - There are four ways to run this script. For more information, read the AppCreationScripts.md file in the same folder as this script. -#> - -# Adds the requiredAccesses (expressed as a pipe separated string) to the requiredAccess structure -# The exposed permissions are in the $exposedPermissions collection, and the type of permission (Scope | Role) is -# described in $permissionType -Function AddResourcePermission($requiredAccess, ` - $exposedPermissions, [string]$requiredAccesses, [string]$permissionType) -{ - foreach($permission in $requiredAccesses.Trim().Split("|")) - { - foreach($exposedPermission in $exposedPermissions) - { - if ($exposedPermission.Value -eq $permission) - { - $resourceAccess = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess - $resourceAccess.Type = $permissionType # Scope = Delegated permissions | Role = Application permissions - $resourceAccess.Id = $exposedPermission.Id # Read directory data - $requiredAccess.ResourceAccess.Add($resourceAccess) - } - } - } -} - -# -# Example: GetRequiredPermissions "Microsoft Graph" "Graph.Read|User.Read" -# See also: http://stackoverflow.com/questions/42164581/how-to-configure-a-new-azure-ad-application-through-powershell -Function GetRequiredPermissions([string] $applicationDisplayName, [string] $requiredDelegatedPermissions, [string]$requiredApplicationPermissions, $servicePrincipal) -{ - # If we are passed the service principal we use it directly, otherwise we find it from the display name (which might not be unique) - if ($servicePrincipal) - { - $sp = $servicePrincipal - } - else - { - $sp = Get-AzureADServicePrincipal -Filter "DisplayName eq '$applicationDisplayName'" - } - $appid = $sp.AppId - $requiredAccess = New-Object Microsoft.Open.AzureAD.Model.RequiredResourceAccess - $requiredAccess.ResourceAppId = $appid - $requiredAccess.ResourceAccess = New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.ResourceAccess] - - # $sp.Oauth2Permissions | Select Id,AdminConsentDisplayName,Value: To see the list of all the Delegated permissions for the application: - if ($requiredDelegatedPermissions) - { - AddResourcePermission $requiredAccess -exposedPermissions $sp.Oauth2Permissions -requiredAccesses $requiredDelegatedPermissions -permissionType "Scope" - } - - # $sp.AppRoles | Select Id,AdminConsentDisplayName,Value: To see the list of all the Application permissions for the application - if ($requiredApplicationPermissions) - { - AddResourcePermission $requiredAccess -exposedPermissions $sp.AppRoles -requiredAccesses $requiredApplicationPermissions -permissionType "Role" - } - return $requiredAccess -} - - -Function UpdateLine([string] $line, [string] $value) -{ - $index = $line.IndexOf('=') - $delimiter = ';' - if ($index -eq -1) - { - $index = $line.IndexOf(':') - $delimiter = ',' - } - if ($index -ige 0) - { - $line = $line.Substring(0, $index+1) + " "+'"'+$value+'"'+$delimiter - } - return $line -} - -Function UpdateTextFile([string] $configFilePath, [System.Collections.HashTable] $dictionary) -{ - $lines = Get-Content $configFilePath - $index = 0 - while($index -lt $lines.Length) - { - $line = $lines[$index] - foreach($key in $dictionary.Keys) - { - if ($line.Contains($key)) - { - $lines[$index] = UpdateLine $line $dictionary[$key] - } - } - $index++ - } - - Set-Content -Path $configFilePath -Value $lines -Force -} - -Function ReplaceInLine([string] $line, [string] $key, [string] $value) -{ - $index = $line.IndexOf($key) - if ($index -ige 0) - { - $index2 = $index+$key.Length - $line = $line.Substring(0, $index) + $value + $line.Substring($index2) - } - return $line -} - -Function ReplaceInTextFile([string] $configFilePath, [System.Collections.HashTable] $dictionary) -{ - $lines = Get-Content $configFilePath - $index = 0 - while($index -lt $lines.Length) - { - $line = $lines[$index] - foreach($key in $dictionary.Keys) - { - if ($line.Contains($key)) - { - $lines[$index] = ReplaceInLine $line $key $dictionary[$key] - } - } - $index++ - } - - Set-Content -Path $configFilePath -Value $lines -Force -} - -Set-Content -Value "" -Path createdApps.html -Add-Content -Value "" -Path createdApps.html - -$ErrorActionPreference = "Stop" - -Function ConfigureApplications -{ -<#.Description - This function creates the Azure AD applications for the sample in the provided Azure AD tenant and updates the - configuration files in the client and service project of the visual studio solution (App.Config and Web.Config) - so that they are consistent with the Applications parameters -#> - $commonendpoint = "common" - - if (!$azureEnvironmentName) - { - $azureEnvironmentName = "AzureCloud" - } - - # $tenantId is the Active Directory Tenant. This is a GUID which represents the "Directory ID" of the AzureAD tenant - # into which you want to create the apps. Look it up in the Azure portal in the "Properties" of the Azure AD. - - # Login to Azure PowerShell (interactive if credentials are not already provided: - # you'll need to sign-in with creds enabling your to create apps in the tenant) - if (!$Credential -and $TenantId) - { - $creds = Connect-AzureAD -TenantId $tenantId -AzureEnvironmentName $azureEnvironmentName - } - else - { - if (!$TenantId) - { - $creds = Connect-AzureAD -Credential $Credential -AzureEnvironmentName $azureEnvironmentName - } - else - { - $creds = Connect-AzureAD -TenantId $tenantId -Credential $Credential -AzureEnvironmentName $azureEnvironmentName - } - } - - if (!$tenantId) - { - $tenantId = $creds.Tenant.Id - } - - - - $tenant = Get-AzureADTenantDetail - $tenantName = ($tenant.VerifiedDomains | Where { $_._Default -eq $True }).Name - - # Get the user running the script to add the user as the app owner - $user = Get-AzureADUser -ObjectId $creds.Account.Id - - # Create the spa AAD application - Write-Host "Creating the AAD application (active-directory-javascript-graphapi-v2)" - # create the application - $spaAadApplication = New-AzureADApplication -DisplayName "active-directory-javascript-graphapi-v2" ` - -HomePage "http://localhost:3000/" ` - -ReplyUrls "http://localhost:3000/" ` - -IdentifierUris "https://$tenantName/active-directory-javascript-graphapi-v2" ` - -AvailableToOtherTenants $True ` - -Oauth2AllowImplicitFlow $true ` - -PublicClient $False - - # create the service principal of the newly created application - $currentAppId = $spaAadApplication.AppId - $spaServicePrincipal = New-AzureADServicePrincipal -AppId $currentAppId -Tags {WindowsAzureActiveDirectoryIntegratedApp} - - # add the user running the script as an app owner if needed - $owner = Get-AzureADApplicationOwner -ObjectId $spaAadApplication.ObjectId - if ($owner -eq $null) - { - Add-AzureADApplicationOwner -ObjectId $spaAadApplication.ObjectId -RefObjectId $user.ObjectId - Write-Host "'$($user.UserPrincipalName)' added as an application owner to app '$($spaServicePrincipal.DisplayName)'" - } - - - Write-Host "Done creating the spa application (active-directory-javascript-graphapi-v2)" - - # URL of the AAD application in the Azure portal - # Future? $spaPortalUrl = "https://portal.azure.com/#@"+$tenantName+"/blade/Microsoft_AAD_RegisteredApps/ApplicationMenuBlade/Overview/appId/"+$spaAadApplication.AppId+"/objectId/"+$spaAadApplication.ObjectId+"/isMSAApp/" - $spaPortalUrl = "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationMenuBlade/CallAnAPI/appId/"+$spaAadApplication.AppId+"/objectId/"+$spaAadApplication.ObjectId+"/isMSAApp/" - Add-Content -Value "" -Path createdApps.html - - $requiredResourcesAccess = New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.RequiredResourceAccess] - - # Add Required Resources Access (from 'spa' to 'Microsoft Graph') - Write-Host "Getting access from 'spa' to 'Microsoft Graph'" - $requiredPermissions = GetRequiredPermissions -applicationDisplayName "Microsoft Graph" ` - -requiredDelegatedPermissions "User.Read" ` - - $requiredResourcesAccess.Add($requiredPermissions) - - - Set-AzureADApplication -ObjectId $spaAadApplication.ObjectId -RequiredResourceAccess $requiredResourcesAccess - Write-Host "Granted permissions." - - # Update config file for 'spa' - $configFile = $pwd.Path + "\..\JavaScriptSPA\authConfig.js" - Write-Host "Updating the sample code ($configFile)" - $dictionary = @{ "Enter_the_Application_Id_Here" = $spaAadApplication.AppId;"Enter_the_Cloud_Instance_Id_HereEnter_the_Tenant_Info_Here" = "https://login.microsoftonline.com/"+$tenantName;"Enter_the_Redirect_Uri_Here" = $spaAadApplication.HomePage }; - ReplaceInTextFile -configFilePath $configFile -dictionary $dictionary - - # Update config file for 'spa' - $configFile = $pwd.Path + "\..\JavaScriptSPA\graphConfig.js" - Write-Host "Updating the sample code ($configFile)" - $dictionary = @{ "graphMeEndpoint" = 'https://graph.microsoft.com/v1.0/me/';"graphMailEndpoint" = 'https://graph.microsoft.com/v1.0/me/messages/' }; - UpdateTextFile -configFilePath $configFile -dictionary $dictionary - - Add-Content -Value "
ApplicationAppIdUrl in the Azure portal
spa$currentAppIdactive-directory-javascript-graphapi-v2
" -Path createdApps.html -} - -# Pre-requisites -if ((Get-Module -ListAvailable -Name "AzureAD") -eq $null) { - Install-Module "AzureAD" -Scope CurrentUser -} - -Import-Module AzureAD - -# Run interactively (will ask you for the tenant ID) -ConfigureApplications -Credential $Credential -tenantId $TenantId \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/apps.json b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/apps.json deleted file mode 100644 index c529e2cfe2..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/apps.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Sample": { - "Title": "A simple JavaScript single-page application calling Microsoft Graph API using msal.js (w/ AAD v2 endpoint)", - "Level": 100, - "Client": "SinglePageApplication" - }, - "AppRegistrations": [ - { - "x-ms-id": "JavaScriptSpa", - "x-ms-name": "active-directory-javascript-graphapi-v2", - "x-ms-version": "2.0", - "replyUrlsWithType": [ - { - "url": "http://localhost:3000/", - "type": "Web" - } - ], - "oauth2AllowImplicitFlow": true, - "oauth2AllowIdTokenImplicitFlow": true, - "requiredResourceAccess": [ - { - "x-ms-resourceAppName": "Microsoft Graph", - "resourceAppId": "00000003-0000-0000-c000-000000000000", - "resourceAccess": [ - { - "id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d", - "type": "Scope", - "x-ms-name": "user.read" - } - ] - } - ], - "codeConfigurations": [ - { - "settingFile": "/JavaScriptSPA/authConfig.js", - "replaceTokens": - { - "appId": "Enter_the_Application_Id_Here", - "tenantId": "Enter_the_Tenant_Info_Here", - "authorityEndpointHost": "Enter_the_Cloud_Instance_Id_Here", - "redirectUri": "Enter_the_Redirect_Uri_Here" - } - }, - { - "settingFile": "/JavaScriptSPA/graphConfig.js", - "replaceTokens": - { - "msgraphEndpointHost": "Enter_the_Graph_Endpoint_Here" - } - } - ] - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/sample.json b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/sample.json deleted file mode 100644 index 75058baa19..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/AppCreationScripts/sample.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "Sample": { - "Title": "A simple JavaScript single-page application calling Microsoft Graph API using msal.js (w/ AAD v2 endpoint)", - "Level": 100, - "Client": "SinglePageApplication", - "Service": "Microsoft Graph", - "RepositoryUrl": "active-directory-javascript-graphapi-v2", - "Endpoint": "AAD v2.0" - }, - - "AADApps": [ - { - "Id": "spa", - "Name": "active-directory-javascript-graphapi-v2", - "Kind" : "SinglePageApplication", - "HomePage": "http://localhost:3000/", - "ReplyUrls":"http://localhost:3000/", - "AllowImplicitFlow": true, - "RequiredResourcesAccess": [ - { - "Resource": "Microsoft Graph", - "DelegatedPermissions": [ "User.Read" ] - } - ] - } - ], - - "CodeConfiguration": [ - { - "App": "spa", - "SettingKind": "Replace", - "SettingFile": "\\..\\JavaScriptSPA\\authConfig.js", - "Mappings": [ - { - "key": "Enter_the_Application_Id_Here", - "value": ".AppId" - }, - { - "key": "Enter_the_Cloud_Instance_Id_HereEnter_the_Tenant_Info_Here", - "value": "\"https://login.microsoftonline.com/\"+$tenantName" - }, - { - "key": "Enter_the_Redirect_Uri_Here", - "value": ".HomePage" - } - ] - }, - { - "App": "spa", - "SettingKind": "Text", - "SettingFile": "\\..\\JavaScriptSPA\\graphConfig.js", - "Mappings": [ - { - "key": "graphMeEndpoint", - "value": "'https://graph.microsoft.com/v1.0/me/'" - }, - { - "key": "graphMailEndpoint", - "value": "'https://graph.microsoft.com/v1.0/me/messages/'" - } - ] - } - ] - } \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CHANGELOG.md b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CHANGELOG.md deleted file mode 100644 index 8c55ef4d41..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CHANGELOG.md +++ /dev/null @@ -1,50 +0,0 @@ -# CHANGELOG - -## 11/28/2020 - -* Updated msal.js to 1.4.4 -* Removed UI update code from authentication. - -## 08/27/2020 - -* Updated msal.js to 1.4.0. -* Added link to docs in authConfig.js. -* Updated sample.json to resolve the implicit flow check issue. -* Minor README.md enhancements. - -## 08/05/2020 - -* Updated msal.js 1.3.4. -* Added issue & PR templates. - -## 06/12/2020 - -* Updated to msal.js 1.3.2. - -## 05/19/2020 - -* Updated to msal.js 1.3.1. -* Removed 'path' package from dependencies. - -## 04/28/2020 - -* Updated to msal.js 1.3.0. -* Improved the redirect flow. - -## 03/30/2020 - -* Updated to msal.js 1.2.2. - -## 03/09/2020 - -* Separated authentication with popup vs. redirect flows into different files. -* Further refactoring changes. - -## 02/13/2020 - -* Updated to msal.js 1.2.1 and added SRI hash. -* Source code refactored. Resource access decoupled from login process. -* Added new feature for reading user mails through MS Graph API. -* UI redesigned with Bootstrap 4 framework. -* Added AppCreationScripts for Powershell users. -* Added tokenization for for sovereign clouds and graph endpoints. diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CODE_OF_CONDUCT.md b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CODE_OF_CONDUCT.md deleted file mode 100644 index 6257f2e76f..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,9 +0,0 @@ -# Microsoft Open Source Code of Conduct - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). - -Resources: - -- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) -- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CONTRIBUTING.md b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CONTRIBUTING.md deleted file mode 100644 index 0efe3642ad..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -This project welcomes contributions and suggestions. Most contributions require you to agree to a -Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. - -When you submit a pull request, a CLA bot will automatically determine whether you need to provide -a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions -provided by the bot. You will only need to do this once across all repos using our CLA. - -## Instructions - -Follow these instructions to download and run the sample locally. - -1. Install [Node](https://nodejs.org/). -2. Clone and download this repository. -3. Navigate to the root of this repository, and install the dependencies: `npm install` -4. Start the application: `npm start` diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authConfig.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authConfig.js deleted file mode 100644 index 15760210c9..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authConfig.js +++ /dev/null @@ -1,26 +0,0 @@ - -// Config object to be passed to Msal on creation. -// For a full list of msal.js configuration parameters, -// visit https://azuread.github.io/microsoft-authentication-library-for-js/docs/msal/modules/_authenticationparameters_.html -const msalConfig = { - auth: { - clientId: "", - authority: "", - redirectUri: "", - }, - cache: { - cacheLocation: "sessionStorage", // This configures where your cache will be stored - storeAuthStateInCookie: false, // Set this to "true" if you are having issues on IE11 or Edge - } -}; - -// Add here the scopes to request when obtaining an access token for FHIR Server API -// for more, visit https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-core/docs/scopes.md -const loginRequest = { - scopes: ["/.default"] -}; - -// Add here scopes for access token to be used at FHIR Sercver API endpoints. -const tokenRequest = { - scopes: ["/.default"] -}; \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authPopup.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authPopup.js deleted file mode 100644 index 0927652492..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authPopup.js +++ /dev/null @@ -1,61 +0,0 @@ -// Create the main myMSALObj instance -// configuration parameters are located at authConfig.js -const myMSALObj = new Msal.UserAgentApplication(msalConfig); - -function signIn() { - myMSALObj.loginPopup(loginRequest) - .then(loginResponse => { - console.log("id_token acquired at: " + new Date().toString()); - console.log(loginResponse); - - if (myMSALObj.getAccount()) { - showWelcomeMessage(myMSALObj.getAccount()); - } - }).catch(error => { - console.log(error); - }); -} - -function signOut() { - myMSALObj.logout(); -} - -function getTokenPopup(request) { - return myMSALObj.acquireTokenSilent(request) - .catch(error => { - console.log(error); - console.log("silent token acquisition fails. acquiring token using popup"); - - // fallback to interaction when silent call fails - return myMSALObj.acquireTokenPopup(request) - .then(tokenResponse => { - return tokenResponse; - }).catch(error => { - console.log(error); - }); - }); -} - -function seeAllPatients() { - if (myMSALObj.getAccount()) { - getTokenPopup(loginRequest) - .then(response => { - callFHIRServer(fhirConfig.fhirEndpoint, response.accessToken, updateUI); - }).catch(error => { - console.log(error); - }); - } -} - - -function searchPatient(searchTxt) { - //endpoint = graphConfig.graphMeEndpoint + "/Patient?given:contains=" + searchTxt; - if (myMSALObj.getAccount()) { - getTokenPopup(loginRequest) - .then(response => { - callPatientSearch(graphConfig.graphMeEndpoint, response.accessToken, searchTxt, updateUI); - }).catch(error => { - console.log(error); - }); - } -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authRedirect.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authRedirect.js deleted file mode 100644 index e8757c9b14..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/authRedirect.js +++ /dev/null @@ -1,76 +0,0 @@ -// Create the main myMSALObj instance -// configuration parameters are located at authConfig.js -const myMSALObj = new Msal.UserAgentApplication(msalConfig); - -let accessToken; - -// Register Callbacks for Redirect flow -myMSALObj.handleRedirectCallback(authRedirectCallBack); - -function authRedirectCallBack(error, response) { - if (error) { - console.log(error); - } else { - if (response.tokenType === "id_token") { - console.log("id_token acquired at: " + new Date().toString()); - - if (myMSALObj.getAccount()) { - showWelcomeMessage(myMSALObj.getAccount()); - } - - } else if (response.tokenType === "access_token") { - console.log("access_token acquired at: " + new Date().toString()); - accessToken = response.accessToken; - - try { - callFHIRServer(fhirConfig.fhirEndpoint, accessToken, updateUI); - } catch(err) { - console.log(err) - } - } else { - console.log("token type is:" + response.tokenType); - } - } -} - -if (myMSALObj.getAccount()) { - showWelcomeMessage(myMSALObj.getAccount()); -} - -function signIn() { - myMSALObj.loginRedirect(loginRequest); -} - -function signOut() { - myMSALObj.logout(); -} - -// This function can be removed if you do not need to support IE -function getTokenRedirect(request, endpoint) { - return myMSALObj.acquireTokenSilent(request) - .then((response) => { - console.log(response); - if (response.accessToken) { - console.log("access_token acquired at: " + new Date().toString()); - accessToken = response.accessToken; - - if (accessToken) { - try { - callFHIRServer(endpoint, accessToken, updateUI); - } catch(err) { - console.log(err) - } - } - } - }) - .catch(error => { - console.log("silent token acquisition fails. acquiring token using redirect"); - // fallback to interaction when silent call fails - return myMSALObj.acquireTokenRedirect(request); - }); -} - -function seePatients() { - getTokenRedirect(loginRequest, fhirConfig.fhirEndpoint); -} - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/fhirConfig.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/fhirConfig.js deleted file mode 100644 index 3ce04182f9..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/fhirConfig.js +++ /dev/null @@ -1,4 +0,0 @@ -// Add here the endpoints for FHIR Server API services you would like to use. -const fhirConfig = { - fhirEndpoint: " //" -}; \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/fhirServer.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/fhirServer.js deleted file mode 100644 index 4e0fbed015..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/fhirServer.js +++ /dev/null @@ -1,20 +0,0 @@ -// Helper function to call MS FHIR API endpoint -// using authorization bearer token scheme -function callFHIRServer(endpoint, token, callback) { - const headers = new Headers(); - const bearer = `Bearer ${token}`; - - headers.append("Authorization", bearer); - - const options = { - method: "GET", - headers: headers - }; - - console.log('request made to FHIR Server API at: ' + new Date().toString()); - - fetch(endpoint, options) - .then(response => response.json()) - .then(response => callback(response, endpoint)) - .catch(error => console.log(error)) -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/graph.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/graph.js deleted file mode 100644 index 566c642037..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/graph.js +++ /dev/null @@ -1,39 +0,0 @@ -// Helper function to call FHIR API endpoint -// using authorization bearer token scheme -function callMSGraph(endpoint, token, callback) { - const headers = new Headers(); - const bearer = `Bearer ${token}`; - - headers.append("Authorization", bearer); - - const options = { - method: "GET", - headers: headers - }; - - console.log('request made to FHIR API at: ' + new Date().toString()); - - fetch(endpoint+"/Patient", options) - .then(response => response.json()) - .then(response => callback(response, endpoint)) - .catch(error => console.log(error)) -} - -function callPatientSearch(endpoint, token, searchTxt, callback) { - const headers = new Headers(); - const bearer = `Bearer ${token}`; - - headers.append("Authorization", bearer); - - const options = { - method: "GET", - headers: headers - }; - - console.log('request made to Graph API at: ' + new Date().toString()); - - fetch(endpoint+"/Patient?given:contains="+searchTxt, options) - .then(response => response.json()) - .then(response => callback(response, endpoint)) - .catch(error => console.log(error)) -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/graphConfig.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/graphConfig.js deleted file mode 100644 index 280faa1f79..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/graphConfig.js +++ /dev/null @@ -1,4 +0,0 @@ -// Add here the endpoints for the protected API services you would like to use. -const graphConfig = { - graphMeEndpoint: "" -}; \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/index.html b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/index.html deleted file mode 100644 index 257b631f8b..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - Quickstart | MSAL.JS Vanilla JavaScript SPA - - - - - - - - - - - - - -
-
Vanilla JavaScript SPA calling FHIR Server API with MSAL.JS
-
-
-
-
-
-
Please sign-in to search for patients
-
- - Enter Given Name: - -
-
- -
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/ui.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/ui.js deleted file mode 100644 index 48345e746b..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/JavaScriptSPA/ui.js +++ /dev/null @@ -1,43 +0,0 @@ -// Select DOM elements to work with -const welcomeDiv = document.getElementById("welcomeMessage"); -const signInButton = document.getElementById("signIn"); -const signOutButton = document.getElementById('signOut'); -const cardDiv = document.getElementById("card-div"); -const mailButton = document.getElementById("readMail"); -const profileButton = document.getElementById("seeProfile"); -const profileDiv = document.getElementById("profile-div"); - - -function showWelcomeMessage(account) { - - // Reconfiguring DOM elements - cardDiv.classList.remove('d-none'); - welcomeDiv.innerHTML = `Welcome ${account.name} to the patient search app`; - signInButton.classList.add('d-none'); - signOutButton.classList.remove('d-none'); -} - -function updateUI(data, endpoint) { - console.log('FHIR Server API responded at: ' + new Date().toString()); - console.log(data); - - if (endpoint === fhirConfig.fhirEndpoint) { - - profileDiv.innerHTML = ''; - - const nameFamily = document.createElement('p'); - const nameGiven = document.createElement('p'); - const resourceId = document.createElement('p'); - const gender = document.createElement('p'); - const patient = document.createElement('p'); - var patientListHtml = '
    '; - - data.entry.forEach(function(e) { - patientListHtml += '
  1. ' + e.resource.name[0].family + ', ' + e.resource.name[0].given + ' (' + e.resource.id + ')' + ', ' + e.resource.gender; - }); - - patient.innerHTML = patientListHtml; - profileDiv.appendChild(patient); - - } -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/LICENSE b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/LICENSE deleted file mode 100644 index 21071075c2..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - 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/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/README.md b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/README.md deleted file mode 100644 index 3957e19769..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/README.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -page_type: sample -languages: -- javascript -- html -products: -- microsoft-identity-platform -- azure-active-directory-v2 -- ms-graph -description: "A simple JavaScript single-page application calling Microsoft Graph API using msal.js (w/ AAD v2 endpoint)" -urlFragment: "active-directory-javascript-graphapi-v2" ---- - -# MSAL JavaScript Single-page Application using Implicit Flow - -A simple vanilla JavaScript single-page application which demonstrates how to configure [MSAL.JS Core](https://www.npmjs.com/package/msal) to login, logout, protect a route, and acquire an access token for a protected resource such as [Microsoft Graph API](https://docs.microsoft.com/en-us/graph/overview). - -**Note:** A quickstart guide covering this sample can be found [here](https://docs.microsoft.com/azure/active-directory/develop/quickstart-v2-javascript). - -**Note:** A more detailed tutorial covering this sample can be found [here](https://docs.microsoft.com/azure/active-directory/develop/tutorial-v2-javascript-spa). - -> :information_source: This sample is using MSAL.js 1.x. See [this](https://github.com/Azure-Samples/ms-identity-javascript-v2) for a sample using MSAL.js 2.x with authorization code grant (w/ PKCE) - -## Contents - -| File/folder | Description | -|-------------------|--------------------------------------------| -| `AppCreationScripts` | Contains automation scripts for Powershell users (can be safely removed if desired). | -| `JavaScriptSPA` | Contains sample source files. | -| `authPopup.js` | Main authentication logic resides here (using Popup flow). | -| `authRedirect.js` | Use this instead of `authPopup.js` for authentication with redirect flow. | -| `authConfig.js` | Contains configuration parameters for the sample. | -| `graph.js` | Provides a helper function for calling MS Graph API. | -| `graphConfig.js` | Contains API endpoints for MS Graph. | -| `ui.js` | Contains UI logic. | -| `index.html` | Contains the UI of the sample. | -| `.gitignore` | Defines what to ignore at commit time. | -| `CHANGELOG.md` | List of changes to the sample. | -| `CODE_OF_CONDUCT.md` | Code of Conduct information. | -| `CONTRIBUTING.md` | Guidelines for contributing to the sample. | -| `LICENSE` | The license for the sample. | -| `package.json` | Package manifest for npm. | -| `README.md` | This README file. | -| `SECURITY.md` | Security disclosures. | -| `server.js` | Implements a simple Node server to serve index.html. | - -## Prerequisites - -- [Node](https://nodejs.org/en/) must be installed to run this sample. -- A modern web browser. This sample uses **ES6** conventions and will not run on **Internet Explorer**. See [here](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-core-samples/VanillaJSTestApp/app/ie11-sample) for an IE11-compatibility. - -## Setup - -1. [Register a new application](https://docs.microsoft.com/azure/active-directory/develop/scenario-spa-app-registration) in the [Azure Portal](https://portal.azure.com). Ensure that the application is enabled for the [implicit flow](https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-implicit-grant-flow). -2. Open the [/JavaScriptSPA/authConfig.js](./JavaScriptSPA/authConfig.js) file and provide the required configuration values. -3. On the command line, navigate to the root of the repository, and run `npm install` to install the project dependencies via npm. - -## Running the sample - -1. Configure authentication and authorization parameters: - 1. Open `authConfig.js` - 2. Replace the string `"Enter_the_Application_Id_Here"` with your app/client ID on AAD Portal. - 3. Replace the string `"Enter_the_Cloud_Instance_Id_HereEnter_the_Tenant_Info_Here"` with `"https://login.microsoftonline.com/common/"` (*note*: This is for multi-tenant applications located on the global Azure cloud. For more information, see the [documentation](https://docs.microsoft.com/azure/active-directory/develop/quickstart-v2-javascript)). - 4. Replace the string `"Enter_the_Redirect_Uri_Here"` with the redirect uri you setup on AAD Portal. -2. Configure the parameters for calling MS Graph API: - 1. Open `graphConfig.js`. - 2. Replace the string `"Enter_the_Graph_Endpoint_Herev1.0/me"` with `"https://graph.microsoft.com/v1.0/me"`. - 3. Replace the string `"Enter_the_Graph_Endpoint_Herev1.0/me/messages"` with `"https://graph.microsoft.com/v1.0/me/messages"`. -3. To start the sample application, run `npm start`. -4. Finally, open a browser to [http://localhost:3000](http://localhost:3000). - -> How did we do? Consider [sharing your experience with us](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR73pcsbpbxNJuZCMKN0lURpUQktGUlJTSjdEWkYzWjRKTlRTUFNYUDlFViQlQCN0PWcu). - -## Key points - -This sample demonstrates the following MSAL workflows: - -* How to configure application parameters. -* How to sign-in with popup and redirect methods. -* How to sign-out. -* How to get user consent incrementally. -* How to acquire an access token. -* How to make an API call with the access token. - -## Contributing - -If you'd like to contribute to this sample, see [CONTRIBUTING.MD](./CONTRIBUTING.md). - -## Code of Conduct - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or -contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/SECURITY.md b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/SECURITY.md deleted file mode 100644 index fe516dcc42..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/SECURITY.md +++ /dev/null @@ -1,37 +0,0 @@ -## Security - -Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). - -If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below. - -## Reporting Security Issues - -**Please do not report security vulnerabilities through public GitHub issues.** - -Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). - -If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). - -You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). - -Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: - - * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) - * Full paths of source file(s) related to the manifestation of the issue - * The location of the affected source code (tag/branch/commit or direct URL) - * Any special configuration required to reproduce the issue - * Step-by-step instructions to reproduce the issue - * Proof-of-concept or exploit code (if possible) - * Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. - -## Preferred Languages - -We prefer all communications to be in English. - -## Policy - -Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/package.json b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/package.json deleted file mode 100644 index f8da4f4241..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "active-directory-javascript-graphapi-v2", - "license": "MIT", - "main": "server.js", - "dependencies": { - "express": "^4.17.1", - "morgan": "^1.10.0" - }, - "devDependencies": { - "nodemon": "^2.0.4" - }, - "scripts": { - "start": "node server.js", - "dev": "nodemon server.js" - }, - "description": "---\r page_type: sample\r languages:\r - javascript\r products:\r - ms-identity\r description: \"A simple vanilla JavaScript single-page application which demonstrates how to configure [msal.js core](https://www.npmjs.com/package/msal) to login, logout, protect a route, and acquire an access token for a protected resource such as Microsoft Graph API.\"\r urlFragment: active-directory-javascript-graphapi-v2\r ---", - "version": "1.0.0", - "repository": { - "type": "git", - "url": "git+https://github.com/Azure-Samples/active-directory-javascript-graphapi-v2.git" - }, - "keywords": [ - "ms-identity", - "azure-ad", - "javascript", - "spa", - "node.js", - "msal.js" - ], - "author": "rilian", - "bugs": { - "url": "https://github.com/Azure-Samples/active-directory-javascript-graphapi-v2/issues" - }, - "homepage": "https://github.com/Azure-Samples/active-directory-javascript-graphapi-v2#readme" -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/server.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/server.js deleted file mode 100644 index db20905a40..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/node-patient-search-app/server.js +++ /dev/null @@ -1,29 +0,0 @@ -/* -* Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. -* See LICENSE in the source repository root for complete license information. -*/ - -const express = require('express'); -const morgan = require('morgan'); -const path = require('path'); - -//initialize express. -const app = express(); - -// Initialize variables. -const port = process.env.PORT || 3000; - -// Configure morgan module to log all requests. -app.use(morgan('dev')); - -// Set the front-end folder to serve public assets. -app.use(express.static('JavaScriptSPA')) - -// Set up a route for index.html. -app.get('*', function (req, res) { - res.sendFile(path.join(__dirname + '/index.html')); -}); - -// Start the server. -app.listen(port); -console.log('Listening on port ' + port + '...'); diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/package-lock.json b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/package-lock.json deleted file mode 100644 index d5a9e3c772..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/package-lock.json +++ /dev/null @@ -1,17461 +0,0 @@ -{ - "name": "react-javascript-sample", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==" - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "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==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", - "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.11.tgz", - "integrity": "sha512-4oGVOekPI8dh9JphkPXC68iIuP6qp/RPbaPmorRmEFbRAHZjSqxPjqHudn18GVDPgCuFM/KdFXc63C17Ygfa9w==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.10", - "@babel/helper-module-imports": "^7.12.5", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", - "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.14.5", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", - "requires": { - "@babel/types": "^7.12.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "@babel/helper-validator-option": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", - "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==" - }, - "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz", - "integrity": "sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", - "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", - "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.11.tgz", - "integrity": "sha512-atR1Rxc3hM+VPg/NvNvfYw0npQEAcHuJ+MGZnFn6h3bo+1U3BWXMdFMlvVRApBTWKQMX7SOwRJZA5FBF/JQbvA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", - "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz", - "integrity": "sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", - "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.11.tgz", - "integrity": "sha512-5nWOw6mTylaFU72BdZfa0dP1HsGdY3IMExpxn8LBE8dNmkQjB+W+sR+JwIdtbzkPvVuFviT3zyNbSUkuVTVxbw==", - "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.12.11", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.12.1" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.11.tgz", - "integrity": "sha512-5MvsGschXeXJsbzQGR/BH89ATMzCsM7rx95n+R7/852cGoK2JgMbacDw/A9Pmrfex4tArdMab0L5SBV4SB/Nxg==", - "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.12.11", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.12.1" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", - "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", - "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", - "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", - "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", - "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.12.1" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", - "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", - "requires": { - "@babel/compat-data": "^7.12.7", - "@babel/helper-compilation-targets": "^7.12.5", - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.11", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.11", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.7", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.10", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.11", - "core-js-compat": "^3.8.0", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.10.tgz", - "integrity": "sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.10", - "@babel/plugin-transform-react-jsx-development": "^7.12.7", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" - } - }, - "@babel/preset-typescript": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", - "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.9.0" - } - }, - "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz", - "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "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==" - } - } - }, - "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" - }, - "@evocateur/libnpmaccess": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", - "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - } - } - }, - "@evocateur/libnpmpublish": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", - "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@evocateur/npm-registry-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", - "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.1.2" - } - }, - "@evocateur/pacote": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", - "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "bluebird": "^3.5.3", - "cacache": "^12.0.3", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.5.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.4.4", - "npm-pick-manifest": "^3.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.3", - "safe-buffer": "^5.2.0", - "semver": "^5.7.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@lerna/add": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", - "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", - "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/bootstrap": "3.21.0", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "npm-package-arg": "^6.1.0", - "p-map": "^2.1.0", - "semver": "^6.2.0" - } - }, - "@lerna/bootstrap": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", - "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/has-npm-version": "3.16.5", - "@lerna/npm-install": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/symlink-binary": "3.17.0", - "@lerna/symlink-dependencies": "3.17.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "get-port": "^4.2.0", - "multimatch": "^3.0.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0", - "read-package-tree": "^5.1.6", - "semver": "^6.2.0" - } - }, - "@lerna/changed": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", - "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", - "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" - } - }, - "@lerna/check-working-tree": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", - "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", - "requires": { - "@lerna/collect-uncommitted": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "@lerna/validation-error": "3.13.0" - } - }, - "@lerna/child-process": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", - "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", - "requires": { - "chalk": "^2.3.1", - "execa": "^1.0.0", - "strong-log-transformer": "^2.0.0" - } - }, - "@lerna/clean": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", - "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0" - } - }, - "@lerna/cli": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", - "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", - "requires": { - "@lerna/global-options": "3.13.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^14.2.2" - } - }, - "@lerna/collect-uncommitted": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", - "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", - "requires": { - "@lerna/child-process": "3.16.5", - "chalk": "^2.3.1", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/collect-updates": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", - "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^2.0.0" - } - }, - "@lerna/command": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", - "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/project": "3.21.0", - "@lerna/validation-error": "3.13.0", - "@lerna/write-log-file": "3.13.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^1.0.0", - "is-ci": "^2.0.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/conventional-commits": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", - "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", - "requires": { - "@lerna/validation-error": "3.13.0", - "conventional-changelog-angular": "^5.0.3", - "conventional-changelog-core": "^3.1.6", - "conventional-recommended-bump": "^5.0.0", - "fs-extra": "^8.1.0", - "get-stream": "^4.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "semver": "^6.2.0" - } - }, - "@lerna/create": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", - "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", - "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "camelcase": "^5.0.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "globby": "^9.2.0", - "init-package-json": "^1.10.3", - "npm-package-arg": "^6.1.0", - "p-reduce": "^1.0.0", - "pify": "^4.0.1", - "semver": "^6.2.0", - "slash": "^2.0.0", - "validate-npm-package-license": "^3.0.3", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^7.0.0" - } - }, - "@lerna/create-symlink": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", - "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", - "requires": { - "@zkochan/cmd-shim": "^3.1.0", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/describe-ref": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", - "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", - "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2" - } - }, - "@lerna/diff": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", - "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/validation-error": "3.13.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/exec": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", - "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - } - }, - "@lerna/filter-options": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", - "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", - "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/filter-packages": "3.18.0", - "dedent": "^0.7.0", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/filter-packages": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", - "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", - "requires": { - "@lerna/validation-error": "3.13.0", - "multimatch": "^3.0.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/get-npm-exec-opts": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", - "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/get-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", - "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", - "requires": { - "fs-extra": "^8.1.0", - "ssri": "^6.0.1", - "tar": "^4.4.8" - } - }, - "@lerna/github-client": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", - "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", - "requires": { - "@lerna/child-process": "3.16.5", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^16.28.4", - "git-url-parse": "^11.1.2", - "npmlog": "^4.1.2" - } - }, - "@lerna/gitlab-client": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", - "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", - "requires": { - "node-fetch": "^2.5.0", - "npmlog": "^4.1.2", - "whatwg-url": "^7.0.0" - } - }, - "@lerna/global-options": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", - "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==" - }, - "@lerna/has-npm-version": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", - "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", - "requires": { - "@lerna/child-process": "3.16.5", - "semver": "^6.2.0" - } - }, - "@lerna/import": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", - "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "p-map-series": "^1.0.0" - } - }, - "@lerna/info": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", - "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", - "requires": { - "@lerna/command": "3.21.0", - "@lerna/output": "3.13.0", - "envinfo": "^7.3.1" - } - }, - "@lerna/init": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", - "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0", - "write-json-file": "^3.2.0" - } - }, - "@lerna/link": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", - "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", - "requires": { - "@lerna/command": "3.21.0", - "@lerna/package-graph": "3.18.5", - "@lerna/symlink-dependencies": "3.17.0", - "p-map": "^2.1.0", - "slash": "^2.0.0" - } - }, - "@lerna/list": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", - "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" - } - }, - "@lerna/listable": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", - "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", - "requires": { - "@lerna/query-graph": "3.18.5", - "chalk": "^2.3.1", - "columnify": "^1.5.4" - } - }, - "@lerna/log-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", - "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", - "requires": { - "byte-size": "^5.0.1", - "columnify": "^1.5.4", - "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/npm-conf": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", - "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", - "requires": { - "config-chain": "^1.1.11", - "pify": "^4.0.1" - } - }, - "@lerna/npm-dist-tag": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", - "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "@lerna/otplease": "3.18.5", - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/npm-install": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", - "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "signal-exit": "^3.0.2", - "write-pkg": "^3.1.0" - } - }, - "@lerna/npm-publish": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", - "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", - "requires": { - "@evocateur/libnpmpublish": "^1.2.2", - "@lerna/otplease": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "read-package-json": "^2.0.13" - } - }, - "@lerna/npm-run-script": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", - "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/otplease": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", - "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", - "requires": { - "@lerna/prompt": "3.18.5", - "figgy-pudding": "^3.5.1" - } - }, - "@lerna/output": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", - "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/pack-directory": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", - "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", - "requires": { - "@lerna/get-packed": "3.16.0", - "@lerna/package": "3.16.0", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "npm-packlist": "^1.4.4", - "npmlog": "^4.1.2", - "tar": "^4.4.10", - "temp-write": "^3.4.0" - } - }, - "@lerna/package": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", - "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", - "requires": { - "load-json-file": "^5.3.0", - "npm-package-arg": "^6.1.0", - "write-pkg": "^3.1.0" - } - }, - "@lerna/package-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", - "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", - "requires": { - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/validation-error": "3.13.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "semver": "^6.2.0" - } - }, - "@lerna/prerelease-id-from-version": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", - "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", - "requires": { - "semver": "^6.2.0" - } - }, - "@lerna/profiler": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", - "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", - "requires": { - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "upath": "^1.2.0" - } - }, - "@lerna/project": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", - "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", - "requires": { - "@lerna/package": "3.16.0", - "@lerna/validation-error": "3.13.0", - "cosmiconfig": "^5.1.0", - "dedent": "^0.7.0", - "dot-prop": "^4.2.0", - "glob-parent": "^5.0.0", - "globby": "^9.2.0", - "load-json-file": "^5.3.0", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "resolve-from": "^4.0.0", - "write-json-file": "^3.2.0" - } - }, - "@lerna/prompt": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", - "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", - "requires": { - "inquirer": "^6.2.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/publish": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", - "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", - "requires": { - "@evocateur/libnpmaccess": "^3.1.2", - "@evocateur/npm-registry-fetch": "^4.0.0", - "@evocateur/pacote": "^9.6.3", - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/describe-ref": "3.16.5", - "@lerna/log-packed": "3.16.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/npm-dist-tag": "3.18.5", - "@lerna/npm-publish": "3.18.5", - "@lerna/otplease": "3.18.5", - "@lerna/output": "3.13.0", - "@lerna/pack-directory": "3.16.4", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "@lerna/version": "3.22.1", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "semver": "^6.2.0" - } - }, - "@lerna/pulse-till-done": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", - "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/query-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", - "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", - "requires": { - "@lerna/package-graph": "3.18.5", - "figgy-pudding": "^3.5.1" - } - }, - "@lerna/resolve-symlink": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", - "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", - "requires": { - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^1.0.1" - } - }, - "@lerna/rimraf-dir": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", - "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", - "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2", - "path-exists": "^3.0.0", - "rimraf": "^2.6.2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@lerna/run": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", - "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-run-script": "3.16.5", - "@lerna/output": "3.13.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/timer": "3.13.0", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - } - }, - "@lerna/run-lifecycle": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", - "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", - "requires": { - "@lerna/npm-conf": "3.16.0", - "figgy-pudding": "^3.5.1", - "npm-lifecycle": "^3.1.2", - "npmlog": "^4.1.2" - } - }, - "@lerna/run-topologically": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", - "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", - "requires": { - "@lerna/query-graph": "3.18.5", - "figgy-pudding": "^3.5.1", - "p-queue": "^4.0.0" - } - }, - "@lerna/symlink-binary": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", - "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", - "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/package": "3.16.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0" - } - }, - "@lerna/symlink-dependencies": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", - "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", - "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/resolve-symlink": "3.16.0", - "@lerna/symlink-binary": "3.17.0", - "fs-extra": "^8.1.0", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0" - } - }, - "@lerna/timer": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", - "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==" - }, - "@lerna/validation-error": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", - "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/version": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", - "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", - "requires": { - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/conventional-commits": "3.22.0", - "@lerna/github-client": "3.22.0", - "@lerna/gitlab-client": "3.15.0", - "@lerna/output": "3.13.0", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "chalk": "^2.3.1", - "dedent": "^0.7.0", - "load-json-file": "^5.3.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "p-reduce": "^1.0.0", - "p-waterfall": "^1.0.0", - "semver": "^6.2.0", - "slash": "^2.0.0", - "temp-write": "^3.4.0", - "write-json-file": "^3.2.0" - } - }, - "@lerna/write-log-file": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", - "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", - "requires": { - "npmlog": "^4.1.2", - "write-file-atomic": "^2.3.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "@octokit/auth-token": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.4.tgz", - "integrity": "sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q==", - "requires": { - "@octokit/types": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.10.tgz", - "integrity": "sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q==", - "requires": { - "@octokit/types": "^6.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - } - } - }, - "@octokit/openapi-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-2.0.0.tgz", - "integrity": "sha512-J4bfM7lf8oZvEAdpS71oTvC1ofKxfEZgU5vKVwzZKi4QPiL82udjpseJwxPid9Pu2FNmyRQOX4iEj6W1iOSnPw==" - }, - "@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==" - }, - "@octokit/plugin-paginate-rest": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", - "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", - "requires": { - "@octokit/types": "^2.0.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz", - "integrity": "sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg==" - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", - "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", - "requires": { - "@octokit/types": "^2.0.1", - "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/request": { - "version": "5.4.12", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.12.tgz", - "integrity": "sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg==", - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "once": "^1.4.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/request-error": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.4.tgz", - "integrity": "sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA==", - "requires": { - "@octokit/types": "^6.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - } - } - }, - "@octokit/request-error": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", - "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", - "requires": { - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/rest": { - "version": "16.43.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz", - "integrity": "sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==", - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/plugin-paginate-rest": "^1.1.1", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "2.4.0", - "@octokit/request": "^5.2.0", - "@octokit/request-error": "^1.0.2", - "atob-lite": "^2.0.0", - "before-after-hook": "^2.0.0", - "btoa-lite": "^1.0.0", - "deprecation": "^2.0.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "octokit-pagination-methods": "^1.1.0", - "once": "^1.4.0", - "universal-user-agent": "^4.0.0" - } - }, - "@octokit/types": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.1.1.tgz", - "integrity": "sha512-btm3D6S7VkRrgyYF31etUtVY/eQ1KzrNRqhFt25KSe2mKlXuLXJilglRC6eDA2P6ou94BUnk/Kz5MPEolXgoiw==", - "requires": { - "@octokit/openapi-types": "^2.0.0", - "@types/node": ">= 8" - } - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", - "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - } - }, - "@testing-library/dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz", - "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==", - "requires": { - "@babel/runtime": "^7.8.4", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.12.1", - "aria-query": "^4.0.2", - "dom-accessibility-api": "^0.3.0", - "pretty-format": "^25.1.0", - "wait-for-expect": "^3.0.2" - }, - "dependencies": { - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz", - "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==", - "requires": { - "@babel/runtime": "^7.5.1", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - } - }, - "@testing-library/react": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz", - "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==", - "requires": { - "@babel/runtime": "^7.8.4", - "@testing-library/dom": "^6.15.0", - "@types/testing-library__react": "^9.1.2" - } - }, - "@testing-library/user-event": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz", - "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" - }, - "@types/babel__core": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", - "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", - "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==" - }, - "@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" - }, - "@types/react": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.0.tgz", - "integrity": "sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw==", - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.0.tgz", - "integrity": "sha512-lUqY7OlkF/RbNtD5nIq7ot8NquXrdFrjSOR6+w9a9RFQevGi1oZO1dcJbXMeONAPKtZ2UrZOEJ5UOCVsxbLk/g==", - "requires": { - "@types/react": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/testing-library__dom": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz", - "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==", - "requires": { - "pretty-format": "^24.3.0" - } - }, - "@types/testing-library__react": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz", - "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==", - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "@zkochan/cmd-shim": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", - "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", - "requires": { - "is-windows": "^1.0.0", - "mkdirp-promise": "^5.0.1", - "mz": "^2.5.0" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - } - } - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - } - } - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==" - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" - }, - "array-includes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", - "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "get-intrinsic": "^1.0.1", - "is-string": "^1.0.5" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" - }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "axios": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.2.tgz", - "integrity": "sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - } - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "babel-preset-react-app": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz", - "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==", - "requires": { - "@babel/core": "7.9.0", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-proposal-optional-chaining": "7.9.0", - "@babel/plugin-transform-flow-strip-types": "7.9.0", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.9.0", - "@babel/preset-env": "7.9.0", - "@babel/preset-react": "7.9.1", - "@babel/preset-typescript": "7.9.0", - "@babel/runtime": "7.9.0", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", - "requires": { - "@babel/compat-data": "^7.9.0", - "@babel/helper-compilation-targets": "^7.8.7", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.0", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.0", - "@babel/plugin-transform-modules-commonjs": "^7.9.0", - "@babel/plugin-transform-modules-systemjs": "^7.9.0", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.7", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", - "browserslist": "^4.9.1", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-react": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz", - "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.9.1", - "@babel/plugin-transform-react-jsx-development": "^7.9.0", - "@babel/plugin-transform-react-jsx-self": "^7.9.0", - "@babel/plugin-transform-react-jsx-source": "^7.9.0" - } - }, - "@babel/runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz", - "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "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==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "before-after-hook": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", - "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "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" - } - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "bootstrap-4-react": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/bootstrap-4-react/-/bootstrap-4-react-0.0.59.tgz", - "integrity": "sha512-j3a618tWHl/ajYQi6zn0LdVfksRH+gyQ4RwIanTPin6xkHkgYfk+47ZlHFSwyiO9zVFn4xznoGjTwWA0AIlJkA==", - "requires": { - "bootstrap-4-required": "0.0.1", - "fsts": "0.0.44" - } - }, - "bootstrap-4-required": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/bootstrap-4-required/-/bootstrap-4-required-0.0.1.tgz", - "integrity": "sha512-4S6Trn9pRVSR756GRYr3hy2cZL3Vc0tw0/H9E+mbNeOR+4tn6CeRgcLx0YqZmL2XlabtEV73+XAesmwkgTDKvQ==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", - "requires": { - "caniuse-lite": "^1.0.30001165", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", - "escalade": "^3.1.1", - "node-releases": "^1.1.67" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=" - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "byte-size": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", - "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001170", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz", - "integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==" - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" - }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.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" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "requires": { - "arity-n": "^1.0.4" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", - "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", - "requires": { - "conventional-changelog-writer": "^4.0.6", - "conventional-commits-parser": "^3.0.3", - "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^2.0.3", - "lodash": "^4.2.1", - "normalize-package-data": "^2.3.5", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } - } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==" - }, - "conventional-changelog-writer": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.18.tgz", - "integrity": "sha512-mAQDCKyB9HsE8Ko5cCM1Jn1AWxXPYV0v8dFPabZRkvsiWUul2YyAqbIaoMKF88Zf2ffnOPSvKhboLf3fnjo5/A==", - "requires": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "requires": { - "readable-stream": "3" - } - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", - "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^2.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "requires": { - "readable-stream": "3" - } - } - } - }, - "conventional-recommended-bump": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", - "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.1.1", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.3", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^2.0.3", - "meow": "^4.0.0", - "q": "^1.5.1" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.1.tgz", - "integrity": "sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg==" - }, - "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", - "requires": { - "browserslist": "^4.15.0", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "core-js-pure": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.1.tgz", - "integrity": "sha512-Se+LaxqXlVXGvmexKGPvnUIYC1jwXu1H6Pkyb3uBM5d8/NELMYCHs/4/roD7721NxrTLyv7e5nXd5/QLBO+10g==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "requires": { - "postcss": "^7.0.5" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "requires": { - "postcss": "^7.0.5" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - } - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", - "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "requires": { - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-accessibility-api": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz", - "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==" - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" - } - } - }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.629", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.629.tgz", - "integrity": "sha512-iSPPJtPvHrMAvYOt+9cdbDmTasPqwnwz4lkP8Dn200gDNUBQOLQ96xUsWXBwXslAo5XxdoXAoQQ3RAy4uao9IQ==" - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" - }, - "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==" - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, - "eslint-config-react-app": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", - "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", - "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", - "requires": { - "lodash": "^4.17.15" - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - }, - "dependencies": { - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - } - } - }, - "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.14.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" - }, - "eventsource": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", - "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "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" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "requires": { - "bser": "2.1.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - } - }, - "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "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==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^3.3.0", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "fsts": { - "version": "0.0.44", - "resolved": "https://registry.npmjs.org/fsts/-/fsts-0.0.44.tgz", - "integrity": "sha512-0U4qvbzOE+3s2711DdszIyaAnZ3M0dbFAhnkez/ITy31MwzDI2lepGSkVeFOyx6jqWvwaSZr01RP4hdM4I8wxQ==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==" - }, - "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==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - } - } - }, - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" - } - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "git-semver-tags": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", - "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", - "requires": { - "meow": "^4.0.0", - "semver": "^6.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" - } - } - }, - "git-up": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", - "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.4.3", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.3.tgz", - "integrity": "sha512-LZTTk0nqJnKN48YRtOpR8H5SEfp1oM2tls90NuZmBxN95PnCvmuXGzqQ4QmVirBgKx2KPYfPGteX3/raWjKenQ==", - "requires": { - "git-up": "^4.0.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "requires": { - "ini": "^1.3.2" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - } - } - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", - "requires": { - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "dependencies": { - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - } - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-parser-js": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", - "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - } - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "requires": { - "agent-base": "4", - "debug": "3.1.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "requires": { - "postcss": "^7.0.14" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "init-package-json": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", - "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "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-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-ssh": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.2.tgz", - "integrity": "sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ==", - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "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==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "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==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true - } - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "requires": { - "@jest/types": "^24.9.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" - }, - "lerna": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz", - "integrity": "sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg==", - "requires": { - "@lerna/add": "3.21.0", - "@lerna/bootstrap": "3.21.0", - "@lerna/changed": "3.21.0", - "@lerna/clean": "3.21.0", - "@lerna/cli": "3.18.5", - "@lerna/create": "3.22.0", - "@lerna/diff": "3.21.0", - "@lerna/exec": "3.21.0", - "@lerna/import": "3.22.0", - "@lerna/info": "3.21.0", - "@lerna/init": "3.21.0", - "@lerna/link": "3.21.0", - "@lerna/list": "3.21.0", - "@lerna/publish": "3.22.1", - "@lerna/run": "3.21.0", - "@lerna/version": "3.22.1", - "import-local": "^2.0.0", - "npmlog": "^4.1.2" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "loader-fs-cache": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", - "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", - "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", - "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" - } - } - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - }, - "dependencies": { - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "mime": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", - "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==" - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "requires": { - "mkdirp": "*" - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "msal": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/msal/-/msal-1.4.4.tgz", - "integrity": "sha512-aOBD/L6jAsizDFzKxxvXxH0FEDjp6Inr3Ufi/Y2o7KCFKN+akoE2sLeszEb/0Y3VxHxK0F0ea7xQ/HHTomKivw==", - "requires": { - "tslib": "^1.9.3" - } - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "multimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", - "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", - "requires": { - "array-differ": "^2.0.3", - "array-union": "^1.0.2", - "arrify": "^1.0.1", - "minimatch": "^3.0.4" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" - } - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - }, - "node-gyp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", - "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-lifecycle": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", - "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", - "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" - }, - "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", - "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "octokit-pagination-methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", - "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", - "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - } - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "p-map-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", - "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=" - }, - "p-queue": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-4.0.0.tgz", - "integrity": "sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg==", - "requires": { - "eventemitter3": "^3.1.0" - } - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "requires": { - "retry": "^0.12.0" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "p-waterfall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-1.0.0.tgz", - "integrity": "sha1-ftlLPOszMngjU69qrhGqn8I1uwA=", - "requires": { - "p-reduce": "^1.0.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-path": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.2.tgz", - "integrity": "sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w==", - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse-url": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.2.tgz", - "integrity": "sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA==", - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", - "requires": { - "ts-pnp": "^1.1.2" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "requires": { - "postcss": "^7" - } - }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "requires": { - "postcss": "^7.0.14" - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "pretty-bytes": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", - "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" - }, - "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "requires": { - "asap": "~2.0.6" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", - "requires": { - "read": "1" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==" - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "requires": { - "genfun": "^5.0.0" - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "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" - } - } - } - }, - "react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-aad-msal": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/react-aad-msal/-/react-aad-msal-2.3.5.tgz", - "integrity": "sha512-QCJXk7LtAf8ssbcuLT6glFZNmqcc6d2dy1ek+GY/feiNE3RM+bCxnH53VOPytV1h7EsUP9IvwOFum2fHcITo5A==", - "requires": { - "redux": "4.0.4" - }, - "dependencies": { - "redux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", - "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - } - } - }, - "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", - "requires": { - "core-js": "^3.5.0", - "object-assign": "^4.1.1", - "promise": "^8.0.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" - } - }, - "react-dev-utils": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz", - "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==", - "requires": { - "@babel/code-frame": "7.8.3", - "address": "1.1.2", - "browserslist": "4.10.0", - "chalk": "2.4.2", - "cross-spawn": "7.0.1", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", - "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.7", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "browserslist": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", - "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", - "requires": { - "caniuse-lite": "^1.0.30001035", - "electron-to-chromium": "^1.3.378", - "node-releases": "^1.1.52", - "pkg-up": "^3.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - } - }, - "react-error-overlay": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.8.tgz", - "integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==" - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-redux": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.2.tgz", - "integrity": "sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA==", - "requires": { - "@babel/runtime": "^7.12.1", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^16.13.1" - } - }, - "react-scripts": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", - "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", - "requires": { - "@babel/core": "7.8.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", - "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", - "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.0", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.2", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" - }, - "dependencies": { - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", - "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "read-package-json": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.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==" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", - "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { - "tslib": "^1.9.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==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "requires": { - "xmlchars": "^2.1.1" - } - }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - } - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "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==" - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "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==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "requires": { - "through2": "^2.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", - "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "requires": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" - }, - "temp-write": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", - "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", - "requires": { - "graceful-fs": "^4.1.2", - "is-stream": "^1.1.0", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - } - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==" - }, - "trim-off-newlines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", - "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==" - }, - "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" - }, - "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" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "uglify-js": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.2.tgz", - "integrity": "sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg==", - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" - }, - "umask": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", - "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", - "requires": { - "os-name": "^3.1.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "requires": { - "builtins": "^1.0.3" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wait-for-expect": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz", - "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "optional": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", - "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - }, - "dependencies": { - "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" - } - } - } - }, - "whatwg-fetch": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz", - "integrity": "sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A==" - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", - "requires": { - "execa": "^1.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", - "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", - "common-tags": "^1.8.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.3", - "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" - }, - "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", - "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" - } - }, - "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" - }, - "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" - } - }, - "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", - "requires": { - "workbox-core": "^4.3.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "requires": { - "errno": "~0.1.7" - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - }, - "dependencies": { - "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==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "write-pkg": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", - "requires": { - "sort-keys": "^2.0.0", - "write-json-file": "^2.2.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - } - } - } - }, - "ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/package.json b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/package.json deleted file mode 100644 index 381b21faba..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "react-patient-search-app", - "version": "1.0.0", - "description": "A sample React application that demonstrates the Azure AD react component.", - "private": true, - "license": "MIT", - "dependencies": { - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "axios": "^0.21.2", - "bootstrap-4-react": "0.0.59", - "lerna": "^3.19.0", - "msal": "^1.2.0", - "react": "^16.12.0", - "react-aad-msal": "^2.3.2", - "react-dom": "^16.12.0", - "react-redux": "^7.1.3", - "react-scripts": "3.4.0", - "redux": "^4.0.5" - }, - "devDependencies": { - "rimraf": "^3.0.0" - }, - "scripts": { - "clean": "rimraf build", - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test --env=jsdom", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": "react-app" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not ie < 11", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/App.css b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/App.css deleted file mode 100644 index f39c8c56cc..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/App.css +++ /dev/null @@ -1,52 +0,0 @@ -.App { - text-align: center; -} - -.App-header { - background-color: #222; - height: 25px; - padding: 20px; - color: white; - margin-bottom: 2em; -} - -.App-title { - font-size: 1.5em; - margin: 0; -} - -.App-intro { - font-size: large; -} - -.SampleContainer { - width: 100%; - display: flex; - justify-content: center; -} - -.SampleBox { - border: 1px solid black; - width: 20em; - margin: 2em; - padding: 10px; - border-radius: 10px; -} - -.SampleHeader { - font-size: 1.25em; -} - -.Button { - background-color: #00a1f1; - border: none; - color: white; - display: inline-block; - padding: 15px; - font-size: 15px; - cursor: pointer; -} - -.Button:disabled { - background-color: grey; -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/App.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/App.js deleted file mode 100644 index 543281b15e..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/App.js +++ /dev/null @@ -1,191 +0,0 @@ -import React, { Component } from 'react'; -import { AzureAD } from 'react-aad-msal'; -import { basicReduxStore } from './reduxStore' - -// Import the authentication provider which holds the default settings -import { authProvider } from './authProvider'; - -import './App.css'; - -import authService from './authService'; -import updateUI from './updateUI'; -import callPatientSearch from './callPatientSearch'; - -// Import boostrap-4 components for react -import { Card, Button } from 'bootstrap-4-react'; - -class App extends Component { - constructor(props) { - super(props); - - // Setup react useEffect - this.state = { - accountInfo: null, - sampleType: null, - bearerToken: '', - token: '', - searchValue: '', - meals: [], - headers: '', - resp: '' - }; - - // Bindings necessary to make `this` work in the callback of bound function - this.handleOnChange = this.handleOnChange.bind(this); - this.handleClick = this.handleClick.bind(this); - this.handleSearch = this.handleSearch.bind(this); - this.handleSearchAll = this.handleSearchAll.bind(this); - - } - - // Initialize authService state - sampleType = localStorage.getItem('sampleType'); - if (sampleType) { - this.setState({ sampleType }); - } - - // Set authService state to signIn or signOut per Login/Logout button click - handleClick = sampleType => { - this.setState({ sampleType }); - localStorage.setItem('sampleType', sampleType); - }; - - // For Patient Search events: - // Handle search textbox change event - Grab user typed value in textbox - handleOnChange = (event) => { - //this.setState({ searchValue: event.target.value }); - console.log('search input:' + event); - }; - - // Handle search form submit event *** NOT USE *** - handleSubmit(event) { - alert('A name was submitted: ' + this.state.searchValue); - authService.searchPatient(this.state.searchValue); - }; - - // Handle Search event - handleSearch = (search) => { - this.setState({ searchValue: search }); - console.log('search input:' + this.state.searchValue); - // Search patient by name - this.handleClick('search'); - console.log('in search for:' + this.state.searchValue); - }; - - // Handle Search All event - handleSearchAll = () => { - // Search all patient - this.handleClick('searchAll'); - }; - -// Do search for all patient -seePatients = () => { - if (authService.msalClient.getAccount()) { - - authService.getTokenPopup(authService.loginRequest) - .then(response => { - callPatientSearch(authService.fhirConfig.fhirEndpoint, response.accessToken, "", updateUI); - }).catch(error => { - console.log(error); - }); - } - }; - - // Do search for patient by name - searchPatient = (searchTxt) => { - if (authService.msalClient.getAccount()) { - authService.getTokenPopup(authService.loginRequest) - .then(response => { - callPatientSearch(authService.fhirConfig.fhirEndpoint, response.accessToken, searchTxt, updateUI); - }).catch(error => { - console.log(error); - }); - } - }; - - render() { - // Check state for authentication or search action - switch (this.state.sampleType) { - // Found signIn state - case 'signIn': - authService.signIn(); - break; - // Found signOut state - case 'signOut': - authService.signOut(); - break; - // Found search patient state - case 'search': - this.searchPatient(this.state.searchValue); - break; - // Found search for all patients state - case 'searchAll': - this.seePatients(); - break; - default: - break; - } - - return ( -
    -
    -

    Welcome to the react-aad-msal sample

    -
    - - - {({ accountInfo, authenticationState, error }) => { - return ( - - - -

    - - -
    React JavaScript SPA calling FHIR API with MSAL.JS
    -
    -
    -

    - - - -
    -
    -

    Welcome to the patient search app

    - Enter Given Name: this.handleOnChange(this.value)}> - - - -
    -

    - -

    - -
    Please sign-in to search for patients
    -
    -
    -

    -
    -
    -
    -
    -
    - ); - }} -
    -
    - ); - } -} - -export default App; diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/Identity.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/Identity.js deleted file mode 100644 index 555b96c738..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/Identity.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Encapsulation of the identity of the user. - */ -export default class Identity { - constructor(tokenResponse) { - this.account = tokenResponse.account; - this.rawIdToken = tokenResponse.idToken.rawIdToken; - } - - get userId() { - return this.account.accountIdentifier; - } - - get emailAddress() { - return this.account.userName; - } - - get name() { - return this.account.name; - } - - get idToken() { - return this.rawIdToken; - } - } \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authConfig.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authConfig.js deleted file mode 100644 index 4e2f58a14a..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authConfig.js +++ /dev/null @@ -1,17 +0,0 @@ -// -//authConfig.js **** NOT USED IN THIS REACT APP *** -// Config object to be passed to Msal on creation in authService.js -// For a full list of msal.js configuration parameters, -// visit https://azuread.github.io/microsoft-authentication-library-for-js/docs/msal/modules/_authenticationparameters_.html - -msalConfig = { - auth: { - clientId: "[Enter_the_Application_Id_Here]", - authority: "[Enter_Authority URL from FHIR Server Authentication Settings_Here]", - redirectUri: "[Enter_Your_Patient_Search_WebApp_Uri_Here]", - }, - cache: { - cacheLocation: "sessionStorage", // This configures where your cache will be stored - storeAuthStateInCookie: true, // Set this to "true" if you are having issues on IE11 or Edge - } -}; \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authConfig.json b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authConfig.json deleted file mode 100644 index 29dbe9c634..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authConfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "msal": { - "authority": "", - "clientId": "", - "scopes": [ "/.default" ], - "redirectUri": "" - }, - "cache": { - "cacheLocation": "sessionStorage", - "storeAuthStateInCookie": "true" - }, - "fhirConfig": { - "fhirEndpoint": "" - }, - "loginRequest" : { - "scopes": ["/.default"] - }, - "tokenRequest" : { - "scopes": ["/.default"] - } - } diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authProvider.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authProvider.js deleted file mode 100644 index f7a20f0087..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authProvider.js +++ /dev/null @@ -1,48 +0,0 @@ -import { MsalAuthProvider, LoginType } from "react-aad-msal"; -import { Logger, LogLevel } from "msal"; - -// The auth provider should be a singleton. Best practice is to only have it ever instantiated once. -// Avoid creating an instance inside the component it will be recreated on each render. -// If two providers are created on the same page it will cause authentication errors. -export const authProvider = new MsalAuthProvider( - { - auth: { - authority: "[Enter_Authority URL from FHIR Server Authentication Settings_Here]", - clientId: "[Enter_the_Application_Id_Here]", - postLogoutRedirectUri: window.location.origin, - redirectUri: "[Enter_Your_Patient_Search_WebApp_Uri_Here]", //window.location.origin, - validateAuthority: true, - - // After being redirected to the "redirectUri" page, should user - // be redirected back to the Url where their login originated from? - navigateToLoginRequestUrl: false - }, - // Enable logging of MSAL events for easier troubleshooting. - // This should be disabled in production builds. - system: { - logger: new Logger( - (logLevel, message, containsPii) => { - console.log("[MSAL]", message); - }, - { - level: LogLevel.Verbose, - piiLoggingEnabled: false - } - ) - }, - cache: { - cacheLocation: "sessionStorage", - storeAuthStateInCookie: true - } - }, - { - scopes: ["/.default"] - }, - { - loginType: LoginType.Popup, - // When a token is refreshed it will be done by loading a page in an iframe. - // Rather than reloading the same page, we can point to an empty html file which will prevent - // site resources from being loaded twice. - tokenRefreshUri: window.location.origin + "/auth.html" - } -); diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authService.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authService.js deleted file mode 100644 index 027552cb8d..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/authService.js +++ /dev/null @@ -1,97 +0,0 @@ -import { UserAgentApplication } from 'msal'; -import authConfig from './authConfig.json'; -import showWelcomeMessage from './showWelcomeMessage'; - -class AuthService { -constructor(configuration) { - this.signInOptions = { - scopes: configuration.msal.scopes - }; - - //authConfig.json - // MSAL Config object to be passed to Msal on creation. - // For a full list of msal.js configuration parameters, - // visit https://azuread.github.io/microsoft-authentication-library-for-js/docs/msal/modules/_authenticationparameters_.html - this.msalConfig = { - auth: { - authority: configuration.msal.authority, - clientId: configuration.msal.clientId, - redirectUri: configuration.msal.redirectUri //window.location.href - }, - cache: { - cacheLocation: configuration.cache.cacheLocation, //cacheLocation: 'sessionStorage', - storeAuthStateInCookie: configuration.cache.storeAuthStateInCookie //storeAuthStateInCookie: true - } - }; - - // Create the main msalclient instance - // configuration parameters are located at local msalConfig object or authConfig.js - this.msalClient = new UserAgentApplication(this.msalConfig); - console.log('AuthService: initialized: ', this.msalConfig); - - this.loginRequest = { - scopes: configuration.loginRequest.scopes - }; - - // Add here scopes for access token to be used at MS Graph API endpoints. - this.tokenRequest = { - scopes: configuration.loginRequest.scopes - }; - - //fhirConfig.js - // Add here the endpoints for FHIR API services you would like to use. - this.fhirConfig = { - fhirEndpoint: configuration.fhirConfig.fhirEndpoint - }; -} - -get serviceName() { return 'Microsoft'; } - -// msal login -async signIn() { - - //const response = await this.msalClient.loginPopup(this.loginRequest) - await this.msalClient.loginPopup(this.signInOptions) - .then(loginResponse => { - console.log("id_token acquired at: " + new Date().toString()); - console.log(loginResponse); - - if (this.msalClient.getAccount()) { - showWelcomeMessage(this.msalClient.getAccount()); - } - }).catch(error => { - console.log(error); - }); - - //return new Identity(response); - return; -} - -// msal logout -signOut() { - this.msalClient.logout(); -} - -// msal acquireTokenSilent -getTokenPopup(request) { - return this.msalClient.acquireTokenSilent(request) - .catch(error => { - console.log(error); - console.log("silent token acquisition fails. acquiring token using popup"); - - // fallback to interaction when silent call fails - return this.msalClient.acquireTokenPopup(request) - .then(tokenResponse => { - return tokenResponse; - }).catch(error => { - console.log(error); - }); - }); -} - - -} - -const authService = new AuthService(authConfig); - -export default authService; \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/callPatientSearch.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/callPatientSearch.js deleted file mode 100644 index 3fd6e2284f..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/callPatientSearch.js +++ /dev/null @@ -1,21 +0,0 @@ - -export default function callPatientSearch(endpoint, token, searchTxt, callback) { - const headers = new Headers(); - const bearer = `Bearer ${token}`; - - headers.append("Authorization", bearer); - - const options = { - method: "GET", - headers: headers - }; - - console.log('request made to FHIR API at: ' + new Date().toString()); - console.log(endpoint); - - // Call FHIR API - fetch(endpoint+"/Patient?given:contains="+searchTxt, options) - .then(response => response.json()) - .then(response => callback(response, endpoint)) - .catch(error => console.log(error)) -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/favicon.svg b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/favicon.svg deleted file mode 100644 index 1284553810..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/favicon.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - Icon-identity-221 - - - - - - - - diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/index.css b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/index.css deleted file mode 100644 index b4cc7250b9..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/index.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/index.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/index.js deleted file mode 100644 index 9989667b19..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import "react-app-polyfill/ie11"; -import "react-app-polyfill/stable"; - -import React from "react"; -import ReactDOM from "react-dom"; -import "./index.css"; -import App from "./App"; -import { Provider } from "react-redux"; -import { basicReduxStore } from "./reduxStore"; - -ReactDOM.render( - - - , - document.getElementById("root") -); \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/reduxStore.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/reduxStore.js deleted file mode 100644 index 38f9593354..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/reduxStore.js +++ /dev/null @@ -1,65 +0,0 @@ -import { createStore } from 'redux'; -import { AuthenticationActions, AuthenticationState } from 'react-aad-msal'; - -const initialState = { - initializing: false, - initialized: false, - idToken: null, - accessToken: null, - state: AuthenticationState.Unauthenticated, -}; - -const rootReducer = (state = initialState, action) => { - switch (action.type) { - case AuthenticationActions.Initializing: - return { - ...state, - initializing: true, - initialized: false, - }; - case AuthenticationActions.Initialized: - return { - ...state, - initializing: false, - initialized: true, - }; - case AuthenticationActions.AcquiredIdTokenSuccess: - return { - ...state, - idToken: action.payload, - }; - case AuthenticationActions.AcquiredAccessTokenSuccess: - return { - ...state, - accessToken: action.payload, - }; - case AuthenticationActions.AcquiredAccessTokenError: - return { - ...state, - accessToken: null, - }; - case AuthenticationActions.LoginSuccess: - return { - ...state, - account: action.payload.account, - }; - case AuthenticationActions.LoginError: - case AuthenticationActions.AcquiredIdTokenError: - case AuthenticationActions.LogoutSuccess: - return { ...state, idToken: null, accessToken: null, account: null }; - case AuthenticationActions.AuthenticatedStateChanged: - return { - ...state, - state: action.payload, - }; - default: - return state; - } -}; - -export const basicReduxStore = createStore( - rootReducer, - // Enable the Redux DevTools extension if available - /// See more: https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfiblj - window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(), -); diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/showWelcomeMessage.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/showWelcomeMessage.js deleted file mode 100644 index f65c83de9a..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/showWelcomeMessage.js +++ /dev/null @@ -1,16 +0,0 @@ -// Select DOM elements to work with -const welcomeDiv = document.getElementById("welcomeMessage"); -const signInButton = document.getElementById("signIn"); -const signOutButton = document.getElementById('signOut'); -const cardDiv = document.getElementById("card-div"); - -export default function showWelcomeMessage(account) { - - // Reconfiguring DOM elements - cardDiv.classList.remove('d-none'); - welcomeDiv.innerHTML = `Welcome ${account.name}`; - signInButton.classList.add('d-none'); - signOutButton.classList.remove('d-none'); -} - - diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/updateUI.js b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/updateUI.js deleted file mode 100644 index 95c929856b..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge06/react-patient-search-app/src/updateUI.js +++ /dev/null @@ -1,26 +0,0 @@ -import authService from './authService'; - -export default function updateUI(data, endpoint) { - var profileDiv = document.getElementById("profile-div"); - var patientListHtml = ''; - - console.log('FHIR API responded at: ' + new Date().toString()); - console.log(data); - - if (endpoint === authService.fhirConfig.fhirEndpoint) { - profileDiv.innerHTML = ' '; - - const patient = document.createElement('p'); - patientListHtml = '
      '; - - data.entry.forEach(function(e) { - patientListHtml += '
    1. ' + e.resource.name[0].family + ', ' + e.resource.name[0].given + ' (' + e.resource.id + ')' + ', ' + e.resource.gender; - - }); - patientListHtml += '
    '; - patient.innerHTML = patientListHtml; - profileDiv.appendChild(patient); - - } -} - diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/PowerBI - PowerQuery Connector for FHIR.pbit b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/PowerBI - PowerQuery Connector for FHIR.pbit deleted file mode 100644 index bc9b99c0e7..0000000000 Binary files a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/PowerBI - PowerQuery Connector for FHIR.pbit and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/PowerBI - SQL Connector.pbit b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/PowerBI - SQL Connector.pbit deleted file mode 100644 index 2f976ef7cc..0000000000 Binary files a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/PowerBI - SQL Connector.pbit and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/SQL DDL Script.txt b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/SQL DDL Script.txt deleted file mode 100644 index a7869b1d8e..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/SQL DDL Script.txt +++ /dev/null @@ -1,156 +0,0 @@ -CREATE TABLE dbo.Claim -( -ClaimID varchar(255), -StartBillablePeriod varchar(255), -EndBillablePeriod varchar(255), -PatientID varchar(255), -EncounterID varchar(255), -OrganizationID varchar(255), -ProcedureID varchar(255), -Insurance varchar(255), -Currency varchar(255), -TotalValue varchar(255), -CodeType varchar(255) -) - -CREATE TABLE dbo.Condition -( -ConditionID varchar(255), -PatientID varchar(255), -EncounterID varchar(255), -Condition varchar(255), -ClinicalStatus varchar(255), -OnsetDatetime varchar(255) -) - -CREATE TABLE dbo.Device -( -DeviceID varchar(255), -PatientID varchar(255), -Device varchar(255), -DeviceCode varchar(255), -Lotnumber varchar(255), -ExpirationDate varchar(255), -ManufactureDate varchar(255) -) - -CREATE TABLE dbo.Encounter -( -EncounterID varchar(255), -PatientID varchar(255), -ParticipantID varchar(255), -OrganizationID varchar(255), -EncounterCode varchar(255), -EncounterType varchar(255), -EncounterStatus varchar(255) -) - -CREATE TABLE dbo.ExplanationOfBenefit -( -ExplanationOfBenefitID varchar(255), -StartBillablePeriod varchar(255), -EndBillablePeriod varchar(255), -PatientID varchar(255), -EncounterID varchar(255), -PractionerID varchar(255), -ClaimID varchar(255), -Insurance varchar(255), -Insurer varchar(255), -Outcome varchar(255), -Status varchar(255), -Currency varchar(255), -TotalValue varchar(255) -) - -CREATE TABLE dbo.Immunization -( -ImmunizationID varchar(255), -PatientID varchar(255), -EncounterID varchar(255), -immunizationcode varchar(255), -immunization varchar(255) -) - -CREATE TABLE dbo.MedicationRequest -( -MedicationRequestID varchar(255), -PatientID varchar(255), -EncounterID varchar(255), -PractionerID varchar(255), -Authoredon varchar(255), -Code varchar(255), -MedicationRequest varchar(255) -) - -CREATE TABLE dbo.Observation -( -ObservationID varchar(255), -PatientID varchar(255), -DeviceID varchar(255), -ObservationCode varchar(255), -Observation varchar(255), -StartEffectiveDate varchar(255), -EndEffectiveDate varchar(255), -Status varchar(255), -Quantity varchar(255), -Value varchar(255) -) - -CREATE TABLE dbo.Organization -( -OrganizationID varchar(255), -Street varchar(255), -City varchar(255), -PostalCode varchar(255), -State varchar(255), -Country varchar(255), -Name varchar(255), -Type varchar(255) -) - -CREATE TABLE dbo.Patient -( -PatientID varchar(255), -LastName varchar(255), -FirstName varchar(255), -MaritalStatus varchar(255), -BirthDate varchar(255), -Gender varchar(255), -Street varchar(255), -City varchar(255), -PostalCode varchar(255), -State varchar(255), -Country varchar(255), -Phone varchar(255), -Latitude varchar(255), -Longitude varchar(255) -) - -CREATE TABLE dbo.Practitioner -( -PractionerID varchar(255), -LastName varchar(255), -FirstName varchar(255), -Gender varchar(255), -Street varchar(255), -City varchar(255), -PostalCode varchar(255), -State varchar(255), -Country varchar(255), -Phone varchar(255), -Code varchar(255) -) - - -CREATE TABLE dbo.MedicalProcedure -( -ProcedureID varchar(255), -PatientID varchar(255), -EncounterID varchar(255), -ConditionID varchar(255), -Code varchar(255), -Name varchar(255), -StartPeriod varchar(255), -EndPeriod varchar(255) -) - diff --git a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/fhirhackdatabrickstemplate.dbc b/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/fhirhackdatabrickstemplate.dbc deleted file mode 100644 index eba840649f..0000000000 Binary files a/027-FHIRPoweredHealthcare/Coach/Solutions/Challenge09/fhirhackdatabrickstemplate.dbc and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/Coach/readme.md b/027-FHIRPoweredHealthcare/Coach/readme.md deleted file mode 100644 index 2468d2dac9..0000000000 --- a/027-FHIRPoweredHealthcare/Coach/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# FHIR Powered Healthcare - -## Introduction -Welcome to the coach's guide for the FHIR Powered Heathcare What The Hack. Here you will find links to specific coaches' guidance for each of the challenges. - -Also remember that this hack includes a optional [lecture presentation](Lectures.pptx) that features short presentations to introduce key topics associated with each challenge. It is recommended that the host present each short presentation before attendees kick off their challenge. - -## Coach's Guides -- Challenge 0: **[Pre-requisites - Ready, Set, GO!](./Solution00.md)** -- Challenge 1: **[Extract and load FHIR synthetic medical data](./Solution01.md)** -- Challenge 2: **[Extract, transform and load HL7 medical data](./Solution02.md)** -- Challenge 3: **[Extract, transform and load C-CDA synthetic medical data](./Solution03.md)** -- Challenge 4: **[Connect to FHIR Server and read FHIR data through a JavaScript app](./Solution04.md)** -- Challenge 5: **[Explore FHIR medical records through FHIR Dashboard and SMART on FHIR apps](./Solution05.md)** -- Challenge 6: **[Create a new Single Page App (SPA) for patient search](./Solution06.md)** -- Challenge 7: **[Bulk export, anonymize and store FHIR data into Data Lake](./Solution07.md)** -- Challenge 8: **[Stream IoMT Device data into FHIR from IoT Central](./Solution08.md)** -- Challenge 9: **[Analyze and Visualize FHIR data using PowerBI](./Solution09.md)** diff --git a/027-FHIRPoweredHealthcare/README.md b/027-FHIRPoweredHealthcare/README.md new file mode 100644 index 0000000000..dec96d78ef --- /dev/null +++ b/027-FHIRPoweredHealthcare/README.md @@ -0,0 +1,48 @@ +# What the Hack - FHIR Powered Healthcare +## Introduction +Contoso Healthcare is implementing FHIR (Fast Healthcare Interoperability Resources) to rapidly and securely exchange data in the HL7 FHIR standard format with a single, simplified data management solution for protected health information (PHI). FHIR service in the Azure Health Data Services platform is a fully managed, enterprise-grade FHIR Server in the cloud lets you quickly connect existing data sources, such as electronic health record systems and research databases. Create new opportunities with analytics, machine learning, and actionable intelligence across your health data. + +Your team's assistance is needed to implement the following scenarios: + * Ingest and process patient record in HL7 FHIR Bundle or legacy formats from EHR systems into a common FHIR-based standard format, and persist them into a FHIR compliant store to facilate health data interoperability. + * Securely connect and search FHIR patient data stored in a FHIR Server through a patient lookup web app to enhance patient engagement. + * Extract FHIR data via FHIR Anaytics pipeline for data exporation in Synapse Studio/SSMS/PowerBI and perform downstream transformation against raw health data stored in Parquet format. + * Export de-identified FHIR data and store in staging Data Lake storage for downstream processing. + * Ingest, transform, correlate and persist medical IoT device data in FHIR using the MedTech service in Azure Health Data Services to facilate discovery of clincial insights and a patient's health and wellness. + * Load and search imaging data using the DICOM service in Azure Health Data Services to integrate clinical and imaging data for many healthcare secnarios including: creating cohorts for research, provide longitudinal view of a patient during diagnosis, finding outcomes of similar patients to plan treatment options, etc. + +You will implement a collection of Microsoft Health reference architectures using the **[Azure Health Data Services](https://docs.microsoft.com/en-us/azure/healthcare-apis/)** platform that best fit Contoso Healthcare requirements. Below is the holistic conceptual end-to-end Microsoft Health Architectures for the FHIR ecosystem. + +![Health Architecture](./images/HealthArchitecture.png) + +## Learning Objectives +This hack will help you: +1. Deploy FHIR service in Azure Health Data Services platform and persist generated synthetic FHIR data into it. +2. Convert and Load HL7v2 messages and C-CDA clinical data into FHIR Service. +3. Develop JavaScript SPA (Single Page App) to search and view FHIR patient data. +4. Transform and explore FHIR data for secondary use analytics. +5. Export and anonymize FHIR data for downstream processing. +6. Ingest, transform and load medical IoT device data into FHIR using MedTech service. +7. Ingest, search and retrieve imaging data persisted in the DICOM service. + +## Challenges +
    + +**These challenges must be completed in order:** +- Challenge 0: **[Pre-requisites - Ready, Set, GO!](Student/Challenge00.md)** +- Challenge 1: **[Extract and Load FHIR EHR Data](Student/Challenge01.md)** + +**These challenges can be completed in any order:** +- Challenge 2: **[Extract and Load HL7v2 & C-CDA EHR Data](Student/Challenge02.md)** +- Challenge 3: **[Search FHIR EHR Data](Student/Challenge03.md)** +- Challenge 4: **[Explore and Analyze FHIR EHR Data](Student/Challenge04.md)** +- Challenge 5: **[Export and Anonymize FHIR EHR Data](Student/Challenge05.md)** +- Challenge 6: **[Ingest and Persist IoT Medical Device Data](Student/Challenge06.md)** +- Challenge 7: **[Load DICOM Imaging Data](Student/Challenge07.md)** + +## Prerequisites +The prerequisites for the hack are covered in [Challenge 0](Student/Challenge00.md). + +## Contributor +- Richard Liang + + diff --git a/027-FHIRPoweredHealthcare/Student/Challenge00.md b/027-FHIRPoweredHealthcare/Student/Challenge00.md index 44f22f98b0..a526ad31d4 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge00.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge00.md @@ -1,6 +1,6 @@ # Challenge 0: Pre-requisites - Ready, Set, GO! -**[Home](../readme.md)** - [Next Challenge>](./Challenge01.md) +**[Home](../README.md)** - [Next Challenge>](./Challenge01.md) ## Pre-requisites @@ -8,76 +8,85 @@ ## Introduction -**Goal** is to complete all pre-requisites needed to finish all challenges. +This hack presents a series of challenges to help learners build knowledge, experience, and skills in working with Azure Health Data Services. It features solutions for use in real-world health data production environments. After working through the challenges, learners will have a better understanding of how to build their own solutions using the latest health data tools from Microsoft. + +In general, you will walk away with the capabilities of Azure Health Data Services platform and a sense of confidence in deploying, configuring, and implementing health data solutions within the platform. You will know how to ingest, transform, and connect health data using the Azure Health Data Service platform, and understand how these components fit together, which will prepare you to use Microsoft's health data tools in real-world solutions. + +Prerequisit knowledge in the following area is needed in completing this hack: +- A solid foundation in Azure fundamentals and basic knowledge of Azure Active Directory +- Familiarity with FHIR® and the solutions it provides versus other health data formats +- Experience with making RESTful API requests using Postman or a similar API testing tool (like cURL or Fiddler) +- Experience using Postman as your API testing tool + +Thank you for participating in the FHIR Powered Healthcare What The Hack. Before you can hack, you will need to set up some prerequisites. + +## Common Prerequisites + +We have compiled a list of common tools and software that will come in handy to complete most What The Hack Azure-based hacks! + +You might not need all of them for the hack you are participating in. However, if you work with Azure on a regular basis, these are all things you should consider having in your toolbox. + +- [Azure Subscription](../../000-HowToHack/WTH-Common-Prerequisites.md#azure-subscription) +- [Windows Subsystem for Linux](../../000-HowToHack/WTH-Common-Prerequisites.md#windows-subsystem-for-linux) +- [Managing Cloud Resources](../../000-HowToHack/WTH-Common-Prerequisites.md#managing-cloud-resources) + - [Azure Portal](../../000-HowToHack/WTH-Common-Prerequisites.md#azure-portal) + - [Azure CLI](../../000-HowToHack/WTH-Common-Prerequisites.md#azure-cli) + - [Note for Windows Users](../../000-HowToHack/WTH-Common-Prerequisites.md#note-for-windows-users) + - [Azure PowerShell CmdLets](../../000-HowToHack/WTH-Common-Prerequisites.md#azure-powershell-cmdlets) + - [Azure Cloud Shell](../../000-HowToHack/WTH-Common-Prerequisites.md#azure-cloud-shell) +- [Visual Studio Code](../../000-HowToHack/WTH-Common-Prerequisites.md#visual-studio-code) + - [VS Code plugin for ARM Templates](../../000-HowToHack/WTH-Common-Prerequisites.md#visual-studio-code-plugins-for-arm-templates) +- [Azure Storage Explorer](../../000-HowToHack/WTH-Common-Prerequisites.md#azure-storage-explorer) ## Description -**Install the recommended tool set:** -- Access to an **Azure subscription** with Owner access. **[Sign Up for Azure HERE](https://azure.microsoft.com/en-us/free/)** -- **[Windows Subsystem for Linux (Windows 10-only)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)** -- **[Windows PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-7)** version 5.1 - - Confirm PowerShell version is **[5.1](https://www.microsoft.com/en-us/download/details.aspx?id=54616)** `$PSVersionTable.PSVersion` - - **[PowerShell modules](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_modules?view=powershell-7)** - - Confirm PowerShell module versions. Re-install the required version below (if needed): - - Az version 4.1.0 - - AzureAd version 2.0.2.4 - ```PowerShell - Get-InstalledModule -Name Az -AllVersions - Get-InstalledModule -Name AzureAd -AllVersions - ``` -- **[Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)** - - (Windows-only) Install Azure CLI on Windows Subsystem for Linux - - Update to the latest - - Must be at least version 2.7.x -- Alternatively, you can use the **[Azure Cloud Shell](https://shell.azure.com/)** +Now that you have the common pre-requisites installed on your workstation, there are prerequisites specifc to this hack. + +Your coach will provide you with a `Resources.zip` file that contains resources you will need to complete the hack. If you plan to work locally, you should unpack it on your workstation. If you plan to use the Azure Cloud Shell, you should upload it to the Cloud Shell and unpack it there. + +Please install these additional tools: + - **[.NET Core 3.1](https://dotnet.microsoft.com/download/dotnet-core/3.1)** -- **[Java 1.8 JDK](https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)** (needed to run Synthea Patient Generator tool) -- **[Visual Studio Code](https://code.visualstudio.com/)** -- **[Node Module Extension for VS Code](https://code.visualstudio.com/docs/nodejs/extensions)** -- **[App Service extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice)** -- **[Node.js Window Installer](https://nodejs.org/en/download/)** -- **[Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)** -- **[Postman](https://www.getpostman.com)** +- **[Java 1.8 JDK](https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)** (Used in challenge 1 for compiling Synthea Patient Generator tool) +- **[Node Module Extension for VS Code](https://code.visualstudio.com/docs/nodejs/extensions)** (Used in challenge 3 for Patient Search app development) +- **[App Service extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice)** (Used in challenge 3 for Patient Search app deployment) +- **[Node.js Window Installer](https://nodejs.org/en/download/)** (Used in challenge 3 for Patient Search app development) +- **[Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)** (Used in challenge 3 for Patient Search app development) +- **[Postman](https://www.getpostman.com)** (Used in various challenges for API testing of Azure Health Data Services endpoints) ## Success Criteria -- Azure Subscription is ready for use -- Powershell is installed -- Azure Ad and Az modules are installed -- Bash shell (WSL, Mac, Linux or Azure Cloud Shell) is installed -- .NET Core is installed -- Java JDK is installed -- Visual Studio Code and required extensions are installed -- Node.js and npm are installed -- Postman is installed +- You have verified Azure Subscription is ready for use +- You have validated Powershell is installed +- You have validated Azure Ad and Az modules are installed +- You have validated Bash shell (WSL, Mac, Linux or Azure Cloud Shell) is installed +- You have validated .NET Core is installed +- You have validated Java JDK is installed +- Youh ave validated Visual Studio Code and required extensions are installed +- You have validated Node.js and npm are installed +- You have validated Postman is installed ## Learning Resources -- **[Install the Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)** -- **[Setting up Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview)** -- **[VS Code Extension Marketplace](https://code.visualstudio.com/docs/editor/extension-gallery)** -- **[NodeJS pre-built installer downloads](https://nodejs.org/en/download/)** -- **[Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)** - -- **[Azure API for FHIR](https://docs.microsoft.com/en-us/azure/healthcare-apis/overview)** as a centralized FHIR Compliant data management solution to persist FHIR bundles. -- **[FHIR Bulk Load](https://github.com/microsoft/fhir-server-samples)** for bulk ingestions performed by a function app that is triggered whenever new or modified BLOB arrives in the `fhirimport` BLOB container. -- **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** is a logic app based workflow to ingest and convert C-CDA and HL7v2 message into FHIR bundle. -- **[FHIR Proxy](https://github.com/microsoft/health-architectures/tree/master/FHIR/FHIRProxy)** is a function app solution that acts as an intelligent and secure gateway (reverse proxy) to FHIR Server and provides a consolidated approach to **[pre and post processing](https://github.com/microsoft/health-architectures/tree/master/FHIR/FHIRProxy#pre-and-post-processing-support)** of FHIR Server, i.e. `PublishFHIREventPostProcess` to publish FHIR CUD events for resources to a configured eventhub. It acts as a FHIR specific reverse proxy rewriting responses and brokering requests to FHIR Servers. -- **[SMART on FHIR](https://docs.microsoft.com/en-us/azure/healthcare-apis/use-smart-on-fhir-proxy)** proxy to integrate partner apps with FHIR Servers and EMR systems through FHIR interfaces. -- **[Azure Event Hubs](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-about)** event-driven architecture that handles FHIR CUD events from the FHIR Server to enable post-processing for topic subscribers to kickoff downstream workflows. -- **[Azure Logic Apps](https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-overview)** conversion workflow to ingest C-CDA data, call FHIR Converter API for C-CDA to FHIR bundle conversion and load the resulted FHIR bundle into FHIR Server. -- **[Azure Functions](https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview)** as the event trigger mechanism to auto ingest and convert HL7v2 messages, pushed to the FHIR Service Bus, into FHIR bundles. -- **[Azure App Service](https://docs.microsoft.com/en-us/azure/app-service/overview)** to host the frontend web app to search for patient(s) stored in FHIR Server and display the results in web page(s). -- **[Azure Batch](https://docs.microsoft.com/en-us/azure/batch/)** runs large-scale applications efficiently in the cloud. Schedule compute-intensive tasks and dynamically adjust resources for your solution without managing infrastructure. -- **[Azure Service Bus](https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview)** is a fully managed enterprise integration message broker. Service Bus can decouple applications and services. +- **[Azure Health Data Services](https://docs.microsoft.com/en-us/azure/healthcare-apis/healthcare-apis-overview)** is a set of managed API services that support multiple health data standards for the exchange of structured data. You can deploy multiple instances of different service types (`FHIR`, `DICOM`, and `MedTech`) that seamlessly work with one another within a workspace. All service instances within a workspace share a compliance boundary and common configuration settings. +- **[FHIR service in Azure Health Data Services](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/)** is a managed, centralized Fast Healthcare Interoperability Resources (FHIR®) Compliant data management solution to ingest, manage, and persist Protected Health Information (PHI) in the cloud. It enables rapid exchange of data through FHIR APIs, backed by a managed Platform-as-a Service (PaaS) offering for high performance and low latency. +- **[FHIR Bulk Load](https://github.com/microsoft/fhir-loader)** is an OSS Function App solution for bulk ingestions of FHIR Bundle (compressed and non-compressed) and NDJSON files that is triggered whenever new or modified BLOB arrives in the designated BLOB container. It uses a High Speed Parallel Event Grid that triggers from storage accounts or other event grid resources, and has a comprehensive Auditing, Error logging and Retry for throttled transactions. +- **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** is an open source project that enables conversion of health data from legacy formats to FHIR. It currently supports four types of conversions, `HL7v2` to `FHIR R4`, `C-CDA` to `FHIR R4`, `JSON` to `FHIR R4` and `FHIR STU3` to `FHIR R4`. The converter uses templates that define mappings between these different data formats. The templates are written in `Liquid` templating language and make use of custom filters. +- **[Tools for Health Data Anonymization](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md)** is available as a command line tool, Azure Data Factory (ADF) pipeline or De-identified `$export` operation in FHIR service to export and anonymize FHIR data. +- **[Azure Event Hubs](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-about)** is an event-driven architecture used by `MedTech service` to ingest and asynchronously processes millions of IoT medical device data over the Internet in real time for persistence into the `FHIR service`. +- **[Azure Functions](https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview)** is used in the `FHIR-Bulk Loader` pipeline to provide services for ingesting FHIR data. +- **[Azure App Service](https://docs.microsoft.com/en-us/azure/app-service/overview)** to host the frontend web app to search for patient(s) stored in FHIR service and display the results in web page(s). +- **[Azure Data Factory](https://docs.microsoft.com/en-us/azure/data-factory/)** is Azure's cloud ETL service for scale-out serverless data integration and data transformation. The ADF pipeline is one of the options in `Tools for Health Data Anonymiation` that reads from an Azure blob container, anonymizes it as per the configuration file, and writes the output to another blob container. +- **[Azure Batch](https://docs.microsoft.com/en-us/azure/batch/)** runs large-scale applications efficiently in the cloud, and is used in the `Tools for Health Data Anonymization` to perform the deidentification. - **[Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)** is Microsoft's object storage solution, optimized for storing massive amounts of unstructured data. - **[Azure Data Lake Store Gen2](https://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-introduction)** is a set of capabilities dedicated to big data analytics, is the result of converging the capabilities of our two existing storage services, Azure Blob storage and Azure Data Lake Storage Gen1. - **[Azure Storage Explorer](https://azure.microsoft.com/en-us/features/storage-explorer/)** is Azure storage management used to upload, download, and manage Azure blobs, files, queues, and tables, as well as Azure Cosmos DB and Azure Data Lake Storage entities. -- **[Azure Data Factory](https://docs.microsoft.com/en-us/azure/data-factory/)** is Azure's cloud ETL service for scale-out serverless data integration and data transformation. -- **[Azure Databricks](https://docs.microsoft.com/en-us/azure/databricks/scenarios/what-is-azure-databricks)** is an Apache Spark-based analytics platform optimized for the Microsoft Azure cloud services platform. -- **[Azure SQL Database](https://docs.microsoft.com/en-us/azure/azure-sql/)** is a managed, secure, and intelligent product that use the SQL Server database engine in the Azure cloud. -- **[PowerBI](https://docs.microsoft.com/en-us/power-bi/fundamentals/power-bi-overview)** is a collection of software services, apps, and connectors that work together to turn your unrelated sources of data into coherent, visually immersive, and interactive insights. -- **[IoT Central](https://docs.microsoft.com/en-us/azure/iot-central/healthcare/concept-continuous-patient-monitoring-architecture)** helps create, customize, and manage healthcare IoT solutions using IoT Central application templates. Continuous patient monitoring is one application template in healthcare IoT space. - - +- **[VS Code Extension Marketplace](https://code.visualstudio.com/docs/editor/extension-gallery)** lets you browse and install languages, debuggers, and tools to your default VS Code installation to support your development workflow. +- **[Postman](https://learning.postman.com/docs/getting-started/introduction/)** is an API Testing Tool to work with `FHIR`, `DICOM` and `MedTech` services in `Azure Health Data Services`. + - [Installing and updating Postman](https://learning.postman.com/docs/getting-started/installation-and-updates/) + - [Navigating Postman](https://learning.postman.com/docs/getting-started/navigating-postman/) + - [Sending your first request](https://learning.postman.com/docs/getting-started/sending-the-first-request/) + - [Creating a workspace](https://learning.postman.com/docs/getting-started/creating-your-first-workspace/) + - [Creating your first collection](https://learning.postman.com/docs/getting-started/creating-the-first-collection/) + - [Managing environments](https://learning.postman.com/docs/sending-requests/managing-environments/) diff --git a/027-FHIRPoweredHealthcare/Student/Challenge01.md b/027-FHIRPoweredHealthcare/Student/Challenge01.md index d26b85daf3..f1f861f08a 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge01.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge01.md @@ -1,34 +1,32 @@ -# Challenge 1: Extract and load FHIR synthetic medical data +# Challenge 1: Extract and Load FHIR EHR Data -[< Previous Challenge](./Challenge00.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge02.md) +[< Previous Challenge](./Challenge00.md) - **[Home](../README.md)** - [Next Challenge>](./Challenge02.md) ## Introduction -In this challenge, you will implement the FHIR Server Samples reference architecture to ingest and load patient data in FHIR. You will generate synthetic FHIR patient data for bulk load into FHIR Server. To generate synthetic patient data, you will use **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient records in FHIR format. +In this challenge, you will implement the **[FHIR Bulk Loader](https://github.com/microsoft/fhir-loader)** function app-based event-driven architecture to ingest and load patient data in FHIR. You will generate synthetic FHIR patient data for bulk load into FHIR Server. To generate synthetic patient data, you will use the **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient records in FHIR format. ### FHIR bulk load scenario -In this scenario, you will deploy a storage account with a BLOB container called `fhirimport`. Synthea generated FHIR patient data files (JSON) are copied into this storage container, and automatically ingested into FHIR Server. This bulk ingestion is performed by a BLOB triggered function app as depicted below: +In this scenario, you will deploy a storage account with a BLOB container and copy Synthea generated FHIR patient data files (JSON Bundles) into it. These FHIR Bundles will be automatically ingested into a FHIR server. This bulk ingestion process will be kicked-off by an Event Grid Trigger (blobCreatedEvent) Function App as depicted below: -
    +
    ## Description -You will implement the FHIR Bulk Load scenario in Microsoft Health Architecture as follows: -- Deploy **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples)** PaaS scenario (above) to ingest and bulk load Synthea generated FHIR patient data into FHIR Server in near real-time. - - Clone **['FHIR Server Samples'](https://github.com/microsoft/fhir-server-samples)** git repo. - - Deploy **[FHIR Server Samples](https://github.com/microsoft/fhir-server-samples#deployment)** environment. - - Before running this **[PowerShell deployment script](https://github.com/microsoft/fhir-server-samples/blob/master/deploy/scripts/Create-FhirServerSamplesEnvironment.ps1)**, you MUST login to your Azure subscription and connect to Azure AD with your secondary tenant (can be primary tenant if you already have directory admin privilege) that provides you with directory admin role access required for this setup. +First you will deploy **[Azure Health Data Services workspace](https://docs.microsoft.com/en-us/azure/healthcare-apis/workspace-overview)** and **[deploy a FHIR service](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/fhir-portal-quickstart)** within the workspace. - **NOTE:** The connection to Azure AD can be made using a different tenant domain than the one tied to your Azure subscription. If you don't have privileges to create app registrations, users, grant admin consent, etc. in your Azure AD tenant, you can create a new secondary tenant, which will just be used for demo identities, etc. +You will then implement the **[FHIR Bulk Loader](https://github.com/microsoft/fhir-loader)** Function App solution to ingest and load Synthea generated FHIR patient data into the FHIR service in near real-time. +- Install and configure FHIR Bulk Loader with the deploy **[script](https://github.com/microsoft/fhir-loader/blob/main/scripts/Readme.md#getting-started)**. +- Validate your deployment, check Azure components installed: + - Function App with App Insights and Storage + - Function App Service plan + - EventGrid + - Storage Account (with containers) + - Key Vault - - Post deployment, save your admin tenant user credential to be used in later challenges for web app sign-in. - - - To Validate your deployment, - - Check Azure resources created in `{ENVIRONMENTNAME}` and `{ENVIRONMENTNAME}-sof` Resource Groups - - Check `App Registration` in secondary AAD tenant that all three different **[client application types are registered](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-app-registration#application-registrations)** for Azure API for FHIR +To test the FHIR Bulk Loader, you will copy Synthea generated test FHIR patient data files to a specified Data Lake storage for bulk load into the FHIR service. - Generate simulated patient data in FHIR format using **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)**. - - - Update the **[default properties](https://github.com/synthetichealth/synthea#changing-the-default-properties)** for FHIR output + - Configure the **[Synthea default properties](https://github.com/synthetichealth/synthea#changing-the-default-properties)** for FHIR output. Below are the recommended properties setting for this challenge: - Set Synthea export directory: `exporter.baseDirectory = ./output/fhir` - Enable FHIR bundle export: @@ -36,39 +34,34 @@ You will implement the FHIR Bulk Load scenario in Microsoft Health Architecture - Generate 1000 patient records: `generate.default_population = 1000` - ```properties - exporter.baseDirectory = ./output/fhir - ... - exporter.ccda.export = false - exporter.fhir.export = true - ... - # the number of patients to generate, by default - # this can be overridden by passing a different value to the Generator constructor - generate.default_population = 1000 - ``` - - **Note:** The default properties file values can be found at src/main/resources/synthea.properties. By default, synthea does not generate CCDA, CPCDA, CSV, or Bulk FHIR (ndjson). You'll need to adjust this file to activate these features. See the **[wiki](https://github.com/synthetichealth/synthea/wiki)** for more details. - -- Copy Synthea generated FHIR bundle JSON files in its `./output/fhir` folder to `fhirimport` BLOB container. + - Load Synthea generated FHIR bundle JSON files + - Copy from Synthea project subfolder `./output/fhir` to `bundles` BLOB container. - You can copy data to Azure Storage using **[Azure AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)** commandline tool or **[Azure Storage Explorer](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-storage-explorer#upload-blobs-to-the-container)** user interface. -- Test FHIR bulk load using Postman `FHIR API` collection to retreive FHIR patient data loaded. - - You can import Postman collection and environment variables for FHIR API from the **[Student Resources folder for Postman](./Resources/Postman)** folder. - - You need to register your **[public client application](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-public-app-reg)** to connect Postman desktop app to FHIR Server. +- Test the results of FHIR bulk load using Postman `FHIR API` collection to retreive FHIR patient data loaded. + - You need to first register your **[public client application](https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application)** to connect Postman desktop app to FHIR service in Azure Health Data Services. + - Then **[Configure RBAC roles](https://learn.microsoft.com/en-us/azure/healthcare-apis/configure-azure-rbac)** to assign access to the Azure Health Data Services data plane. + - To **[access FHIR service using Postman](https://learn.microsoft.com/en-us/azure/healthcare-apis/fhir/use-postman)**, you need to import the FHIR API Postman collection and environment variables: + - You can find the Postman template files (`WTHFHIR.postman_collection.json` and `WTHFHIR.postman_environment.json`) in the `/Postman` folder of the Resources.zip file provided by your coach. + - **[Import](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/)** the environment and collection template files into your Postman + - Configure Postman environment variables specific to your FHIR service instance ## Success Criteria - - You have provisioned FHIR Bulk Load environment in Azure. + - You have provisioned FHIR service and FHIR Bulk Load environment in Azure. - You have generated synthetic patient data in FHIR format. - You have loaded FHIR patient data into FHIR Server. - You have retrieved the new FHIR patient data using Postman. ## Learning Resources -- **[Azure API for FHIR samples](https://github.com/microsoft/fhir-server-samples)** +- **[What is Azure Health Data Services?](https://docs.microsoft.com/en-us/azure/healthcare-apis/healthcare-apis-overview)** +- **[Get started with FHIR service](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/get-started-with-fhir)** +- **[FHIR Bulk Loader](https://github.com/microsoft/fhir-loader)** - **[Synthea Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** - **[Synthea wiki](https://github.com/synthetichealth/synthea/wiki)** - **[Copy data to Azure Storage using Azure AzCopy tool](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)** - **[Copy data to Azure Storage using Azure Storage Explorer](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-storage-explorer#upload-blobs-to-the-container)** +- **[Register a client application in Azure Active Directory](https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application)** - **[Import Postman data, including collections, environments, data dumps, and globals.](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/)** -- **[Register your public client application for Postman](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-public-app-reg)** -- **[Access Azure API for FHIR using Postman](https://docs.microsoft.com/en-us/azure/healthcare-apis/access-fhir-postman-tutorial)** +- **[Access FHIR service using Postman](https://learn.microsoft.com/en-us/azure/healthcare-apis/fhir/use-postman)** +- **[Configure RBAC roles](https://learn.microsoft.com/en-us/azure/healthcare-apis/configure-azure-rbac)** diff --git a/027-FHIRPoweredHealthcare/Student/Challenge02.md b/027-FHIRPoweredHealthcare/Student/Challenge02.md index 27a8ae4e8d..bdd5540f52 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge02.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge02.md @@ -1,97 +1,39 @@ -# Challenge 2: Extract, transform and load HL7 medical data +# Challenge 2: Extract and Load HL7v2 & C-CDA EHR Data -[< Previous Challenge](./Challenge01.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge03.md) +[< Previous Challenge](./Challenge01.md) - **[Home](../README.md)** - [Next Challenge>](./Challenge03.md) ## Introduction -In this challenge, you will deploy a Health Architecture **[HL7toFHIR Conversion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** serverless solution that provides the following services within **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** and FHIR Proxy: -- Import and process valid HL7 bundles and persist them to a FHIR Compliant store -- FHIR Server Proxy connection to FHIR Server without exposing credentials -- Publish successful FHIR CUD events referencing FHIR Resources to an event hub to support pre-processing and/or post-processing for event driven workflow and orchestration scenarios. This can be done by enabling the PublishFHIREventPostProcess module of the FHIR Proxy. +In this challenge, you will use the **[\$convert-data](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#use-the-convert-data-endpoint)** operation, which is a service integrated into the FHIR service within Azure Health Data platform, to convert HL7v2 message and C-CDA XML legacy formats for persistance in FHIR. The $convert-data endpoint in FHIR service uses the Liquid template engine and default templates from the **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** OSS project to perform data mapping between these legacy formats to FHIR. -
    +
    -**[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** is an open source project that runs as a REST web service for converting health data from legacy formats to FHIR bundles. Microsoft FHIR Converter currently supports HL7v2 and C-CDA to FHIR conversion. It uses pre-installed **[Handlebars templates](https://handlebarsjs.com/)** to define data mapping for HL7v2 to FHIR and C-CDA to FHIR conversion. It can be deploy separately or as part of the **[HL7 to FHIR Conversion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** pipeline. +**[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** is an open source project that transforms health data sources from legacy formats to FHIR bundles that are persisted to a FHIR server. Microsoft FHIR Converter with Liquid engine supports HL7v2, C-CDA, JSON and FHIR STU3 to FHIR R4 conversions. It uses default **[Liquid templates](https://shopify.github.io/liquid/)** to define data mapping between these legacy data formats to FHIR, and the template can be **[customized](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#customize-templates)** to meet your specific conversion requirements. -**[HL7 Ingest Platform](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#deploying-your-own-hl7-ingest-platform)** reference architeture is deployed to ingest HL7 messages and produce a consumable event in a Service Bus queue for processing by FHIR Event Processor function app. It provides a sample `samplemsg.hl7` for testing the `hl7overhttps` ingest service. - -**[HL7 to FHIR Conversion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** reference architecture deployment will create a Logic App based workflow that is triggered whenever new HL7 message is added to the queue of `hl7ingest` Service Bus. This conversion workflow performs the following tasks: -- Orderly conversion from HL7 to FHIR via the **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** -- Persists converted HL7v2 message into FHIR Server through secure proxied FHIR Server connection (FHIR Server Proxy). -- Publishes FHIR change events referencing FHIR Resources to an Event Hub. You can also provide a central ingest point and event bus to support virtually unlimited event driven workflow and orchestration scenarios by enabling the PublishFHIREventPostProcess module of the FHIR Proxy - -**Note:** After successful deployment, the FHIR converter pipeline is integrated with the HL7 Ingest platform. +**[$convert-data](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#use-the-convert-data-endpoint)** operation is the custom API endpoint in the FHIR service meant to convert data from different data types to FHIR. ## Description -- **Deploy HL7 Ingest Platform** reference architecture. - - Download or Clone the **[Microsoft Health Archtectures](https://github.com/microsoft/health-architectures)** GitHub repo. - - Open a bash shell into the Azure CLI 2.0 environment - - Switch to `HL7Conversion` subdirectory in your local repo - - Run the `./deployhl7ingest.bash` script and follow the prompts - - Enter your subscription ID - - Enter a Resource Group name (new or existing) - - Enter Resource Group location - - Enter deployment prefix (environment name) -- Deploy **[HL7toFHIR Conversion Workflow](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#-deploying-your-own-hl7tofhir-conversion-workflow)** reference architecture. - - Download or Clone the **[Microsoft Health Archtectures](https://github.com/microsoft/health-architectures)** GitHub repo (if you have not done so). - - Open a bash shell into the Azure CLI 2.0 environment - - Switch to `HL7Conversion` subdirectory of this repo - - Run the `deployhl72fhir.bash` script and follow the prompts - - Enter your subscription ID - - Enter a Resource Group name (new or existing) - - Enter Resource Group location - - Enter deployment prefix (environment name) - - Enter a resource group name to deploy the converter to: `[EVIRONMENTNAME]hl7conv` - - Enter the name of the HL7 Ingest Resource Group (from above `hl7ingest` deployment) - - Enter the name of the HL7 Ingest storage account (from above `hl7ingest` deployment) - - Enter the name of the HL7 ServiceBus namespace (from above `hl7ingest` deployment) - - Enter the name of the HL7 ServiceBus destination queue (from above `hl7ingest` deployment) - - Enter the destination FHIR Server URL - - Enter the FHIR Server Service Client Application ID - - Enter the FHIR Server Service Client Secret: - - Enter the FHIR Server/Service Client Audience/Resource (`https://azurehealthcareapis.com`) - - Enter the FHIR Server/Service Client Tenant ID - -- Validate resources created in the deployment - - Storage account: `[ENVIRONMENTNAME]store#####` - - FHIR Event Hub Namespace: `fehub###` - - FHIR Event Hub: `fhirevents` - - FHIREventProcessor Function App: `fhirevt####` - - Application Insights: `fhirevt####` - - Logic App: `HL7toFHIR` Workflow steps are: - - When a message is received in a `hl7ingest` queue (`HL7ServiceBus`) - - Get blob content (`hl7blobstorage`) - - Connections - Custom Logic App connection (`HL7FHIRConverter`) - - Import Bundle to FHIR Server (Connected thru FHIR Server Proxy) - -- Test send sample HL7v2 message via `hl7overhttps` ingestion service. - - Locate the sample message `samplemsg.hl7` in the root directory of the cloned Health Architecture GitHub repo - - Use a text editor to see contents - - From the Linux command shell run the following command to test the `hl7overhttps` ingest - ```bash - curl --trace-ascii - -H "Content-Type:text/plain" --data-binary @samplemsg.hl7 /api/hl7ingest?code= - ``` - - You should receive back an HL7 ACK message to validate that the sample hl7 message was accepted securely stored into blob storage and queued for HL7 to FHIR Conversion processing on the deployed service bus queue - - To validate the end-to-end HL7 Conversion process, you can see execution from the `HL7toFHIR` Logic App Run History in your `HL7toFHIR` resource group. This will also provide you with detailed steps to see the transform process in the Logic App run. +**Prepare API Request to convert legacy health data into FHIR** +- Setup API request **[using the $convert-data endpoint](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#using-the-convert-data-endpoint)** in the FHIR service and configure **[Parameter Resource](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data#parameters-resource)** in the request body. + +**Convert data using the $convert-data endpoint** +- Test send **[sample HL7v2](https://github.com/microsoft/FHIR-Converter/tree/main/data/SampleData/Hl7v2)** and **[sample C-CDA](https://github.com/microsoft/FHIR-Converter/tree/main/data/SampleData/Ccda)** requests in the request body payload and make the appropriate $convert-data API calls to receive FHIR Bundle response. ## Success Criteria -- You have deployed HL7 Ingest, Conversion reference architectures that includes the FHIR Event Processor and FHIR Converter components. -- You have tested sending sample HL7v2 message via `HL7OverHTTPS` ingest service. -- You have validated the end-to-end HL7 Ingest and Conversion process. -- You have validated FHIR CUD event is published to Event Hub for post-processing. +- You have created new HL7 and C-CDA request operations in Postman. +- You have tested sending sample HL7v2 message and received a FHIR "resourceType": "Bundle" response after calling $convert-data with a HL7v2 payload. +- You have tested sending sample C-CDA XML data and received a FHIR "resourceType": "Bundle" response after calling $convert-data with a C-CDA payload. ## Learning Resources -- **[Working Reference Architectures combining Microsoft capabilities and FHIR Resources](https://microsoft.github.io/health-architectures/Architectures.html)** -- **[HL7 Ingest, Conversion Samples](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** +- **[Convert legacy health data to FHIR](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/convert-data)** - **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** -- **[FHIR Converter API Details](https://github.com/microsoft/FHIR-Converter/blob/master/docs/api-summary.md)** -- **[Using FHIR Bundle Conversion APIs](https://github.com/microsoft/FHIR-Converter/blob/master/docs/convert-data-concept.md)** -- **[FHIR Converter pre-installed templates for C-CDA and HL7v2](https://github.com/microsoft/FHIR-Converter/tree/master/src/templates)** -- **[Sample HL7 messages](https://github.com/microsoft/FHIR-Converter/tree/master/src/sample-data/hl7v2)** -- **[How to create a FHIR Converter template](https://github.com/microsoft/FHIR-Converter/blob/master/docs/template-creation-how-to-guide.md)** -- **[Browser based FHIR Converter template editor](https://github.com/microsoft/FHIR-Converter/blob/master/docs/web-ui-summary.md)** +- **[FHIR Converter pre-installed templates for C-CDA and HL7v2](https://github.com/microsoft/FHIR-Converter/tree/main/data/Templates)** +- **[Sample HL7v2 messages](https://github.com/microsoft/FHIR-Converter/tree/main/data/SampleData/Hl7v2)** +- **[Sample C-CDA XML data](https://github.com/microsoft/FHIR-Converter/tree/main/data/SampleData/Ccda)** +- **[HL7v2 to FHIR Conversion template](https://github.com/microsoft/FHIR-Converter/blob/main/docs/HL7v2-templates.md)** +- **[VS Code FHIR Converter template authoring tool](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-health-fhir-converter)** diff --git a/027-FHIRPoweredHealthcare/Student/Challenge03.md b/027-FHIRPoweredHealthcare/Student/Challenge03.md index 8b7ec0c485..3e9fb5f0e0 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge03.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge03.md @@ -1,69 +1,63 @@ -# Challenge 3: Extract, transform and load C-CDA synthetic medical data +# Challenge 3: Search FHIR EHR Data -[< Previous Challenge](./Challenge02.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge04.md) +[< Previous Challenge](./Challenge02.md) - **[Home](../README.md)** - [Next Challenge>](./Challenge04.md) ## Introduction -In this challenge, you will use the **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** reference architecture in **[Microsoft Health Architectures](https://github.com/microsoft/health-architectures)**, deployed in **[challenge 2](./Challenge02.md)**, to ingest, transform, and load clinical healthcare data into FHIR Server. You will generate synthetic patient clinical data (C-CDA), convert them into FHIR Bundle and ingest them into FHIR Server. To generate synthetic patient data, you will use **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** open source Java tool to simulate patient clinical data in HL7 C-CDA format. -
    +In this challenge, you will create a new JavaScript Single Page App (SPA) integrated with Microsoft Authentication Library (MSAL) to connect to the FHIR service, search for patient(s) and display the search results in a web app. -### Clinical data ingest and convert scenario -In this scenario, you will develop a logic app based workflow to perform the C-CDA-to-FHIR conversion using **[FHIR Converter API](https://github.com/microsoft/FHIR-Converter/blob/master/docs/api-summary.md)** and import the resulting FHIR Bundle into FHIR Server. +
    ## Description -You will use the Microsoft Health Architectures environment and add a new logic app based workflow for the C-CDA-to-FHIR ingest and convert scenarios as follows: -- Use **[HL7toFHIR conversion](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#hl7tofhir-conversion)** pipeline infrastructure (deployed in **[challenge 2](./Challenge02.md)**) to expose the C-CDA Conversion service endpoint: +- Create a new JavaScript Web App or Single-Page App (SPA). + - Web App: **[Deploy sample web app with MSAL in Azure App Service Web App to read FHIR data in FHIR service](https://learn.microsoft.com/en-us/azure/healthcare-apis/azure-api-for-fhir/tutorial-web-app-write-web-app)** + - Node.js: git clone sample code for **[Node.js JavaScript SPA with MSAL](https://learn.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-auth-code)** + - React: Use **[Create React App](https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)** frontend build pipeline (toolchain) to generate the initial project structure. - `https://.azurewebsites.net/api/convert/cda/ccd.hbs` +- Integrate and configure the Microsoft Authentication Library (MSAL) with your JavaScript SPA app to connect and fetch data from protected FHIR web API. + + - You need to use MSAL to authenticate and acquired access token as a bearer in your FHIR API HTTP request within the web app. -- Create a new logic app based workflow to perform the C-CDA-to-FHIR conversion and import the resulting FHIR Bundle into FHIR Server. - - Your new logic app needs to perform the following steps in the workflow: - - Step 1: Create a new BLOB triggered Logic App. - - Step 2: Get BLOB content from C-CDA XML file. - - Step 3: Compose BLOB content as Input object. - - Step 4: Call the FHIR Converter API. - - Step 5: Import response body (FHIR bundle) in Input object into FHIR Server connected through a **[FHIR Server Proxy](https://github.com/microsoft/health-architectures/blob/master/FHIR/FHIRProxy/readme.md)**. -- Generate simulated patient data in C-CDA format using **[SyntheaTM Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)**. - - Update the **[default properties](https://github.com/synthetichealth/synthea#changing-the-default-properties)** for CDA output - ```properties - exporter.baseDirectory = ./output/cda - ... - exporter.ccda.export = true - exporter.fhir.export = false - ... - # the number of patients to generate, by default - # this can be overridden by passing a different value to the Generator constructor - generate.default_population = 1000 - ``` - - **Note:** The default properties file values can be found at src/main/resources/synthea.properties. By default, synthea does not generate CCDA, CPCDA, CSV, or Bulk FHIR (ndjson). You'll need to adjust this file to activate these features. See the **[wiki](https://github.com/synthetichealth/synthea/wiki)** for more details. - -- Copy the Synthea generated C-CDA patient data (XML) in `./output/cda` folder to `cda` BLOB container in `{ENVIRONMENTNAME}store` Storage Account created for FHIR Converter. This will trigger the `CCDAtoFHIR` logic app convert and load workflow. - - You can copy data to Azure Storage using **[Azure AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)** commandline tool or **[Azure Storage Explorer](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-storage-explorer#upload-blobs-to-the-container)** user interface. + ![JavaScript SPA App - Implicit Flow](../images/JavaScriptSPA-ImplicitFlow.jpg) -- Retrieve new FHIR patient clinical data using Postman. +- Create a patient lookup by Given or Family name in JavaScript SPA app. + - Explore the `FHIR API` collection imported into Postman earlier to obtain the appropriate API request for the patient search query. -## Success Criteria +- (Optional) Include any other modern UI features to improve the user experience. +- **[Register your app](https://learn.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** on AAD tenant with directory admin access to connect web app with FHIR Server for both local and Azure web app URLs. + + Hint: Ensure that the Reply URL matches the local and Azure Web App URL. - - You have added a new logic app based workflow in the Microsoft Health Architectures environment to handle C-CDA to FHIR conversion. - - You have generated synthetic FHIR patient clinical data in C-CDA format. - - You have converted Synthea generated patient clinical data in C-CDA format to FHIR bundle. - - You have loaded the patient clinical data into FHIR Server. - - You have use Postman to retrieve the newly loaded patient clinical data in FHIR Server. +- Build and test JavaScript SPA app locally. + - To run locally, you'll need to change the `redirectUri` property to: `http://localhost:3000/`. +- Deploy JavaScript SPA web app to Azure App Service. + - To run on Azure, you'll need to change the `redirectUri` property to: ``. +- Test the JavaScript SPA Patient Search app: + - Browse to App Service website URL in a new in-private/Incognito window. + - Sign in with your admin tenant user credential saved in **[challenge 1](./Challenge01.md)**. + - Enter full/partial name in the patient search textbox and click the search button. + - You should see a list of FHIR patient(s) that matches your search criteria. + +## Success Criteria +- You have created a JavaScript SPA Patient Search app and deployed it to Azure App Service. +- You have tested patient lookup in the Patient Search web app. ## Learning Resources -- **[HL7 Ingest, Conversion Samples](https://github.com/microsoft/health-architectures/tree/master/HL7Conversion#ingest)** -- **[FHIR Converter](https://github.com/microsoft/FHIR-Converter)** -- **[FHIR Converter API Details](https://github.com/microsoft/FHIR-Converter/blob/master/docs/api-summary.md)** -- **[Using FHIR Bundle Conversion APIs](https://github.com/microsoft/FHIR-Converter/blob/master/docs/convert-data-concept.md)** -- **[FHIR Converter pre-installed templates for C-CDA and HL7v2](https://github.com/microsoft/FHIR-Converter/tree/master/src/templates)** -- **[How to create a FHIR Converter template](https://github.com/microsoft/FHIR-Converter/blob/master/docs/template-creation-how-to-guide.md)** -- **[Browser based FHIR Converter template editor](https://github.com/microsoft/FHIR-Converter/blob/master/docs/web-ui-summary.md)** -- **[FHIR Server Proxy](https://github.com/microsoft/health-architectures/blob/master/FHIR/FHIRProxy/readme.md)** -- **[Synthea Patient Generator](https://github.com/synthetichealth/synthea#syntheatm-patient-generator)** -- **[Synthea wiki](https://github.com/synthetichealth/synthea/wiki)** -- **[Copy data to Azure Storage using Azure AzCopy tool](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)** -- **[Copy data to Azure Storage using Azure Storage Explorer](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-storage-explorer#upload-blobs-to-the-container)** -- **[Access Azure API for FHIR using Postman](https://docs.microsoft.com/en-us/azure/healthcare-apis/access-fhir-postman-tutorial)** +- **[Write Azure App Service Web App to read FHIR data in FHIR service (includes sample code) ](https://learn.microsoft.com/en-us/azure/healthcare-apis/azure-api-for-fhir/tutorial-web-app-write-web-app)** +- **[Build and host a web app with Azure Web Apps](https://ms.portal.azure.com/?quickstart=true#view/Microsoft_Azure_Resources/QuickstartAnchorServicesBlade/goalId/create-a-web-app)** +- **[Create a new JavaSCript SPA using MSAL to call protected Web API](https://learn.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-auth-code)** +- **[Vanilla JavaScript Single-page Application secured with MSAL.js v2](https://github.com/Azure-Samples/ms-identity-javascript-v2)** +- **[Create React App integrated toochain](https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)** +- **[Microsoft Authentication Library for React (@azure/msal-react)](https://www.npmjs.com/package/@azure/msal-react)** +- **[Initialization of MSAL (@azure/msal-react) in React app](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md)** +- **[Samples for the MSAL.js 2.x library](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/README.md#advanced-topics)** +- **[Getting Started: Using React AAD MSAL library components to integrate MSAL with AAD in your React app](https://www.npmjs.com/package/react-aad-msal#checkered_flag-getting-started)** +- **[Sample JavaScript code to acquired access token as a bearer in an HTTP request to call protected web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-call-api?tabs=javascript#call-a-web-api)** +- **[Sample React JS code to perform a search](https://github.com/lytes20/meal-search-app)** +- **[Deploy your Node.js app using VS Code and the Azure App Service extension](https://docs.microsoft.com/en-us/azure/app-service/quickstart-nodejs?pivots=platform-linux#deploy-to-azure)** +- **[Hosting options and deployment scenarios to move your node.js app from a local or cloud repository to Azure](https://docs.microsoft.com/en-us/azure/developer/javascript/how-to/deploy-web-app)** +- **[Deploying React apps to Azure with Azure DevOps](https://devblogs.microsoft.com/premier-developer/deploying-react-apps-to-azure-with-azure-devops/)** +- **[Register your app](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** +- **[Register a web app public client application](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-public-app-reg#connect-with-web-app)** \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Challenge04.md b/027-FHIRPoweredHealthcare/Student/Challenge04.md index 1382f9ea11..9a1eab605d 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge04.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge04.md @@ -1,58 +1,45 @@ -# Challenge 4: Connect to FHIR Server and read FHIR data through a JavaScript app +# Challenge 4: Explore and Analyze FHIR EHR Data -[< Previous Challenge](./Challenge03.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge05.md) +[< Previous Challenge](./Challenge03.md) - **[Home](../README.md)** - [Next Challenge>](./Challenge05.md) ## Introduction -In this challenge, you will deploy a sample JavaScript app to connect and read FHIR patient data. You will configure public client application registration to allow JavaScript app to access FHIR Server. +In this challenge, you will deploy the OSS **[FHIR-to-Synapse Analytics Pipeline](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/docs/Deployment.md)** to move FHIR data from Azure FHIR service to a Azure Data Lake storage in near real time and making it available to a Synapse workspace, which will enable you to query against the entire FHIR dataset with tools such as Synapse Studio, SSMS, and/or Power BI. -
    - - -**[Public Client Application registrations](https://docs.microsoft.com/en-us/azure/healthcare-apis/register-public-azure-ad-client-app)** are Azure AD representations of apps that can authenticate and authorize for API permissions on behalf of a user. Public clients are mobile and SPA JavaScript apps that can't be trusted to hold an application secret, so you don't need to add one. For a SPA, you can enable implicit flow for app user sign-in with ID tokens and/or call a protected web API with Access tokens. +This pipeline is an Azure Function solution that extracts data from the FHIR server using FHIR Resource APIs, converts them to hierarchical Parquet files, and writes them to Azure Data Lake storage in near real time. It contains a script to create External Tables and Views in Synapse Serverless SQL pool pointing to the Parquet files. You can also access the Parquet files directly from a Synapse Spark Pool to perform custom transformation to downstream systems, i.e. USCDI datamart, etc. +
    ## Description -You will deploy a FHIR sample JavaScript app in Azure to read patient data from the FHIR service. -- **[Create a new Azure Web App](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-write-web-app#create-web-application)** in Azure Portal to host the FHIR sample JavaScript app. -- Check in secondary Azure AD tenant (can be same as your primary AAD tenant if you already have admin privileges) that a **[Resource Application](https://docs.microsoft.com/en-us/azure/healthcare-apis/register-resource-azure-ad-client-app)** has been registered for the FHIR Server resource. - - **Note:** - - If you are using the Azure API for FHIR, a Resource Application is automatically created when you deploy the service in same AAD tenant as your application. - - In the FHIR Server Sample environment deployment, a Resource Application is automatically created for the FHIR Server resource. - -- **[Register your public client application to connect web app to FHIR Server](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-public-app-reg#connect-with-web-app)** in Secondary Azure AD tenant (can be primary tenant if you already have directory admin privilege) to allow the deployed Web App to authenticate and authorize for FHIR Server API access. - - Ensure that the Reply URL matches the Web App URL - - In AAD `App Registration`, configure a new `Web Platform` under `Authentication` blade - - Set `Redirect URIs` to your [Web App URL] - - Enable `Implicit Grant` by selecting Access token and ID tokens - - Configure permissions for Azure Healthcare APIs with `User_Impersonation` permission (if needed) - -- Write a new JavaScript application to connect and read FHIR patient data - - Start with the sample code from the **[FHIR patient JavaScript app](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-write-web-app)**. - - Initialize **[MSAL (Mirosoft Authentication Library) provider](https://docs.microsoft.com/en-us/graph/toolkit/providers/msal)** configuration for your FHIR environment: - - `clientId` - Update with your client application ID of public client app registered earlier - - `authority` - Update with Authority from your FHIR Server (under Authentication) - - `FHIRendpoint` - Update the FHIRendpoint to have your FHIR service name - - `Scopes` - Update with Audience from your FHIR Server (under Authentication) - -- Deploy your sample code from your local repo to your App Service `wwwroot` folder. - - Use App Service Editor in-browser editing tool in Azure Portal to update your `index.html` code under the `wwwroot` folder. - -- Test sample JavaScript app - - Browse to App Service website URL in In-private / Incognito window. - - SignIn with your secondary tenant used in deploying FHIR Server Samples reference architecture. - - You should see a list of patients that were loaded into FHIR Server. +You need to deploy an instance of FHIR service (done in challenge 1) and a **[Synapse Workspace](https://learn.microsoft.com/en-us/azure/synapse-analytics/quickstart-deployment-template-workspaces)**. + +- **Deploy the FHIR-to-Synapse Analytics Pipeline** + - To **[deploy the pipeline](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/docs/Deployment.md#1-deploy-the-pipeline)**, run this **[ARM template](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FMicrosoft%2FFHIR-Analytics-Pipelines%2Fmain%2FFhirToDataLake%2Fdeploy%2Ftemplates%2FFhirSynapsePipelineTemplate.json)** for pipeline deployment through the Azure Portal. +- **Provide Access of the FHIR server to the Azure Function** + - **[Assign the FHIR Data Reader role](https://learn.microsoft.com/en-us/azure/healthcare-apis/configure-azure-rbac#assign-roles-for-the-fhir-service)** to the Azure Function created from the deployment above +- **Verify the data movement** as the function app deployed will run automatically and the time taken to write the FHIR dataset to the storage account will depend on the amount of data stored in the FHIR server. + + Hint: + - You will see folders for only those Resources that are present in your FHIR server. Running the PowerShell **[script](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/scripts/Set-SynapseEnvironment.ps1)** will create folders for other Resources. + +- **Provide privilege to your account** + - You must provide the following roles to your account to run the PowerShell script in the next step (and revoke these roles after the installation if needed) + - **[Assign Synapse Administrator role](https://learn.microsoft.com/en-us/azure/synapse-analytics/get-started-add-admin#synapse-rbac-synapse-administrator-role-for-the-workspace)** in your Synapse Workspace + - **[Assign the Storage Blob Data Contributor role](https://learn.microsoft.com/en-us/azure/storage/blobs/assign-azure-role-data-access?tabs=portal#assign-an-azure-role)** in your Storage Account for running the PowerScript below. +- **Provide access of the Storage Account to the Synapse Workspace** + - **[Assign the Storage Blob Data Contributor role](https://learn.microsoft.com/en-us/azure/storage/blobs/assign-azure-role-data-access?tabs=portal#assign-an-azure-role)** to your Synapse Workspace. +- **Run the PowerShell script** + - Run the PowerShell **[script](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/scripts/Set-SynapseEnvironment.ps1)** to create External Tables and Views in Synapse Serverless SQL Pool pointing to the Parquet files in the Storage Account. ## Success Criteria -- You have deployed a FHIR sample Web App in Azure that connects to FHIR Server and retrieves FHIR patient data displayed in a web page. +- You have verfied that Parquet files are stored in the Storage Account after the Azure Function execution is completed +- You have verified that there are folders corresponding to different FHIR resources in the container's results folder. +- You have queried the `fhirdb` data in Synapse Studio to explore the External Tables and Views to see the exported FHIR resource entities. +- You have validated that new persisted FHIR data are fetched automatically to the Data Lake and are available for querying. ## Learning Resources -- **[Deploy a JavaSript app to read data from FHIR service](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-fhir-server)** -- **[Register a web app public client application](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-public-app-reg#connect-with-web-app)** -- **[Test FHIR API setup with Postman](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-test-postman)** -- **[Write Azure web app to read FHIR data](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-write-web-app)** -- **[Overview of Mirosoft Authentication Library (MSAL)](https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-overview)** -- **[Initial MSAL provider in HTML or JavaScript](https://docs.microsoft.com/en-us/graph/toolkit/providers/msal)** +- **[FHIR Analytics Pipeline](https://github.com/microsoft/FHIR-Analytics-Pipelines)** +- **[FHIR to Synapse Sync Agent](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/docs/Deployment.md#fhir-to-synapse-sync-agent)** +- **[Data mapping from FHIR to Synapse](https://github.com/microsoft/FHIR-Analytics-Pipelines/blob/main/FhirToDataLake/docs/Data-Mapping.md)** diff --git a/027-FHIRPoweredHealthcare/Student/Challenge05.md b/027-FHIRPoweredHealthcare/Student/Challenge05.md index e3109124c0..11df97d923 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge05.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge05.md @@ -1,46 +1,48 @@ -# Challenge 5: Explore FHIR medical records through FHIR Dashboard and SMART on FHIR apps +# Challenge 5: Export and Anonymize FHIR EHR Data -[< Previous Challenge](./Challenge04.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge06.md) +[< Previous Challenge](./Challenge04.md) - **[Home](../README.md)** - [Next Challenge>](./Challenge06.md) ## Introduction -In this challenge, you will explore patient medical records and SMART on FHIR apps through the FHIR Dashboard app. +In this challenge, you will leverage the API requests in FHIR service in Azure Health Data Services within the Azure Data Factory (ADF) pipeline to export and de-identify FHIR data according to a set of data redaction/transformation rules specified in a **[configuration file](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#configuration-file-format)**. The goal of the of this challege is to apply the **[HIPAA Safe Harbor Method](https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html#safeharborguidance)** de-id requirements against FHIR data to create a research datasets. -
    +**[FHIR Tool for Anonymization](https://github.com/microsoft/FHIR-Tools-for-Anonymization)** provides various tooling to anonymize healthcare FHIR data, on-premises or cloud, for secondary usage such as research, public health, etc. as follows: +- **[Command line tool](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#anonymize-fhir-data-using-the-command-line-tool)**, +- **[Azure Data Factory (ADF) pipeline](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#anonymize-fhir-data-using-azure-data-factory)** +- **[De-ID $export](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#how-to-perform-de-identified-export-operation-on-the-fhir-server)** FHIR service operation -**[What is SMART on FHIR?](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-faq#what-is-smart-on-fhir)** -SMART ((Substitutable Medical Applications and Reusable Technology) on FHIR is a set of open specifications to integrate partner apps with FHIR Servers and other Health IT systems, i.e. Electronic Health Records and Health Information Exchanges. By creating a SMART on FHIR application, you can ensure that your application can be accessed and leveraged by different systems. - -Azure API for FHIR has a built-in **[Azure AD SMART on FHIR proxy](https://docs.microsoft.com/en-us/azure/healthcare-apis/use-smart-on-fhir-proxy)** to integrate partner apps with FHIR Servers and EMR systems through FHIR interfaces. This set of open specifications describes how an app should discover authentication endpoints for FHIR Server and start an authentication sequence. Specifically, the proxy enables the **[EHR launch sequence](https://hl7.org/fhir/smart-app-launch/#ehr-launch-sequence)**. +Below depicts the Azure Data Factory pipeline method for FHIR anonymization leveraged in this challenge: +
    ## Description -You will perform the following steps to access patient medical records and explore the use of SMART on FHIR applications in Azure API for FHIR through the FHIR Dashboard app: -- Access FHIR Dashboard app - - Open In-private/Incognito browser and navigate to FHIR Dashboard app URL. - - Use the dashboard user credentials to sign in (captured during FHIR Server Samples deployment in **[Challenge 1](./Challenge01.md)**. - - In popup Consent dialog box, accept consent to permissions requested by the Confidential Client app to get access to FHIR Server. -- Explore patient medical records through FHIR Dashboard app, including: - - Patient and its FHIR bundle details - - Patient medical elements - - Conditions - - Encounters - - Observations -- Explore SMART on FHIR apps through FHIR Dashboard app, including: - - Growth Chart - - Medications +You will deploy a **[FHIR Anonymization ADF pipeline](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#anonymize-fhir-data-using-azure-data-factory)** to de-identify FHIR data. You will run a PowerShell **[script](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/tree/master/FHIR/src/Microsoft.Health.Fhir.Anonymizer.R4.AzureDataFactoryPipeline)** to create an ADF pipeline that reads data from a source container in Azure Blob storage and writes the outputted anonymized data to a destination containter in Azure Blob storage. + +To test the FHIR Anonymization pipeline, call the **[$export endpoint](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/export-data#calling-the-export-endpoint)** in FHIR service to export FHIR data into a blob storage container inside the storage account for the Anonymization pipeline. Alternatively, you can directly upload the test Synthea generated FHIR Bundles to the container. + +- **Setup ADF pipeline configuration for anonymization** + - Download or Clone the **[Tools-for-Health-Data-Anonymization](https://github.com/microsoft/Tools-for-Health-Data-Anonymization)** GitHub repo + - Configure the Anonymization pipeline deployment **[script](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/tree/master/FHIR/src/Microsoft.Health.Fhir.Anonymizer.R4.AzureDataFactoryPipeline)** execution for your **[environment](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#create-data-factory-pipeline)**. + - Define **[command line environment variables](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#create-data-factory-pipeline)** needed during the script execution to create and configure the Anonymization pipeline. +- **Deploy ADF pipeline for FHIR data anonymization** + - Execute **[script](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/tree/master/FHIR/src/Microsoft.Health.Fhir.Anonymizer.R4.AzureDataFactoryPipeline)** to created the Anonymization pipeline. +- **Upload test FHIR patient data for anonymization** + - **[Configure](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/configure-export-data)** and **[perform](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/export-data)** the bulk FHIR export using the $export operation in FHIR service via Postman. + - Alternatively, upload Synthea generated FHIR patient data to the source container configured in the linked service of ADF pipeline. +- **Trigger and monitor pipeline run to anonymize the uploaded test FHIR patient data** + - **[Trigger pipeline run](https://github.com/microsoft/Tools-for-Health-Data-Anonymization/blob/master/docs/FHIR-anonymization.md#trigger-and-monitor-pipeline-run-from-powershell)** to de-ID test FHIR patient data. +- **Validate FHIR data export and anonymization** + - Compare pre de-identified data in the 'source' container and post de-identified data in the 'destination' container in the Storage Account(s). ## Success Criteria -- You have successfully access FHIR Dashboard app to access patient medical records and encounters. -- You have explored SMART on FHIR applications. +- You have successfully configured and deployed the FHIR anonymization tool. +- You have successfully configured FHIR Bulk Export and called the $export operation to upload the test FHIR data for anonymization +- You have successfully triggered and monitored the Anonymization pipeline in ADF +- You have compared pre de-ided and post de-ided FHIR data in the resource and destination containers respectively. ## Learning Resources -- **[SMART on FHIR - FHIR Server Dashboard app](https://github.com/smart-on-fhir/fhir-server-dashboard#:~:text=The%20FHIR%20Server%20Dashboard%20is%20a%20standalone%20app,at%20the%20sample%20data%20on%20a%20FHIR%20sandbox.)** -- **[FHIR Server Dashboard Demo](http://docs.smarthealthit.org/fhir-server-dashboard/)** -- **[FHIR Dashboard JS source code](https://github.com/microsoft/fhir-server-samples/blob/master/src/FhirDashboardJS/index.html)** -- **[Use Azure AD SMART on FHIR proxy](https://docs.microsoft.com/en-us/azure/healthcare-apis/use-smart-on-fhir-proxy)** -- **[Download the SMART on FHIR app launcher](https://docs.microsoft.com/en-us/azure/healthcare-apis/use-smart-on-fhir-proxy#download-the-smart-on-fhir-app-launcher)** -- **[Test the SMART on FHIR proxy](https://docs.microsoft.com/en-us/azure/healthcare-apis/use-smart-on-fhir-proxy#test-the-smart-on-fhir-proxy)** -- **[SMART](https://smarthealthit.org/)** -- **[HL7 FHIR SMART Application Launch Framework](http://www.hl7.org/fhir/smart-app-launch/)** +- **[FHIR Tools for Anonymization](https://github.com/microsoft/FHIR-Tools-for-Anonymization)** +- **[Configure Bulk export FHIR service operation](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/configure-export-data)** +- **[How to export FHIR data with $export opertation in FHIR service](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir/export-data)** +- **[HIPPA Safe Harbor Method](https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html)** diff --git a/027-FHIRPoweredHealthcare/Student/Challenge06.md b/027-FHIRPoweredHealthcare/Student/Challenge06.md index 7d2971e4ce..be90409bd7 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge06.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge06.md @@ -1,64 +1,57 @@ -# Challenge 6: Create a new Single Page App (SPA) for patient search +# Challenge 6: Ingest and Persist IoT Medical Device Data -[< Previous Challenge](./Challenge05.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge07.md) +[< Previous Challenge](./Challenge05.md) - **[Home](../README.md)** - [Next Challenge>](./Challenge07.md) ## Introduction -In this challenge, you will create a new JavaScript Single Page App (SPA) integrated with Microsoft Authentication Library (MSAL) to connect, read and search for FHIR patient data. +In this challenge, you will work with IoT medical device data using the **[MedTech service](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/get-started-with-iot)** in Azure Health Data Services. You will use **[MedTech service toolkit](https://github.com/microsoft/iomt-fhir/tree/main/tools/data-mapper)** to transform IoT medical device data into Fast Healthcare Interoperability Resources (FHIR®)-based Observation resources. You will deploy a **[MedTech service data pipeline](https://learn.microsoft.com/en-us/azure/healthcare-apis/iot/iot-data-flow)** to ingest medical IoT data, normalize and group these messages,transform the grouped-normalized messages into FHIR-based Observation resources, and then persist the transformed messages into the FHIR service (previously deployed in challenge 1). -
    +The **[MedTech service](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/get-started-with-iot)** in Azure Health Data Services uses an event hub to ingests streaming event data from IoT medical devices, transforms them into FHIR-based Observation resources, retrieves associated Patient resource from FHIR service, adds them as reference to the Observation resource created, and then persists the transformed messages to the FHIR service. + +**[Azure IoMT Connector Data Mapper](https://github.com/microsoft/iomt-fhir/tree/main/tools/data-mapper)** is the MedTech toolkit to visualize and configure normalize mapping between the medical IoT data and FHIR. Once you completed the FHIR mapping, you can export it and upload the mapping files to your **[MedTech service Device Mapping](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/how-to-use-device-mappings)** configuration in Azure Portal. + + +Below is the overview of the **[MedTech service data flow](https://learn.microsoft.com/en-us/azure/healthcare-apis/iot/iot-data-flow)**: +
    ## Description -- Create a new JavaScript Single-Page App (SPA) Node.js or React app. - - Node.js: git clone sample code for **[Node.js JavaScript SPA with MSAL](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa)** - - React: Use **[Create React App](https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)** frontend build pipeline (toolchain) to generate the initial project structure. - -- Integrate and configure the Microsoft Authentication Library (MSAL) with your JavaScript SPA app to fetch data from protected FHIR web API. - - - You need to use MSAL to authenticate and acquired access token as a bearer in your FHIR API HTTP request. - - ![JavaScript SPA App - Implicit Flow](../images/JavaScriptSPA-ImplicitFlow.jpg) - -- Create a patient lookup by Given or Family name in JavaScript SPA app. - - Explore the `FHIR API` collection imported into Postman earlier to obtain the appropriate API request for the patient search query. - -- (Optional) Include any other modern UI features to improve the user experience. -- **[Register your app](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** on AAD tenant with directory admin access to connect web app with FHIR Server for both local and Azure web app URLs. - - Ensure that the Reply URL matches the local and Azure Web App URL - - In AAD `App Registration` of AAD with directory admin access, configure a new `Web Platform` under `Authentication` blade - - Add `Redirect URI` for both local and Azure Web App URLs - - Enable `Implicit Grant` by selecting Access token and ID tokens - - Configure permissions for Azure Healthcare APIs with `User_Impersonation` permission (if needed) - -- Build and test JavaScript SPA app locally. - - To run locally, you'll need to change the `redirectUri` property to: `http://localhost:3000/`. -- Deploy JavaScript SPA web app to Azure App Service. - - To run on Azure, you'll need to change the `redirectUri` property to: ``. -- Test the JavaScript SPA Patient Search app: - - Browse to App Service website URL in a new in-private/Incognito window. - - Sign in with your admin tenant user credential saved in **[challenge 1](./Challenge01.md)**. - - Enter full/partial name in the patient search textbox and click the search button. - - You should see a list of FHIR patient(s) that matches your search criteria. +You will deploy an instance of MedTech service in your Azure Health Data Service workspace, and configure it to receive and transform medical IoT data for persitence in your FHIR service (deployed in challenge 1) as Observation resources. + +- **Deploy **[Azure Event Hubs](https://docs.microsoft.com/en-us/azure/event-hubs/)** for MedTech service to **[ingest](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/iot-data-flow#ingest)** medical IoT device data** + + Hint: An Event Hubs namespace provides a unique scoping container, in which you create one or more event hubs. + +- ****[Deploy](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/deploy-iot-connector-in-azure)** a new instance of the MedTech service in your Azure Health Data Services workspace (deployed in challenge 1) and configure it to ingest IoT data from the above Event Hubs instance** +- **Deploy the **[IoT mapper tool](https://github.com/microsoft/iomt-fhir/tree/main/tools/data-mapper)**** + - Import **[sample IoT messages](https://github.com/microsoft/azure-health-data-services-workshop/tree/main/Challenge-09%20-%20MedTech%20service/SampleData/Answers)** into tool to customize device mapping to FHIR + - You can also find the sample IoT message files (`devicecontent.json` and `fhirmapping.json`) in the `/MedTech-service/SampleData` folder of the Resources.zip file provided by your coach. + - Export customized mapping in tool to generate the new Device Mapping and FHIR Mapping files +- **Import the newly generated FHIR mapping into your MedTech service** + - Configure and save the **[Device mapping](https://learn.microsoft.com/en-us/azure/healthcare-apis/iot/how-to-use-device-mappings)** JSON in the MedTech service (Device Mapping setting) + - Configure and save the **[Destination mapping](https://learn.microsoft.com/en-us/azure/healthcare-apis/iot/how-to-use-fhir-mappings)** JSON to in the MedTech service (Destination setting) +- **Send sample device data to persist in the FHIR service using Postman via **[MedTech service Event Hub service](https://docs.microsoft.com/en-us/rest/api/eventhub/get-azure-active-directory-token)**** ## Success Criteria -- You have created a JavaScript SPA Patient Search app and deployed it to Azure App Service. -- You have tested patient lookup in the Patient Search web app. +- You have successfully configured device mapping to FHIR using the data mapper tool +- You have successfully generated a custom FHIR mapping for medical IoT device data +- You have successfully configured MedTech service for mapping IoT device data to FHIR +- You have successfully ingested sample medical IoT device data into the FHIR services as Observation resources. + ## Learning Resources -- **[Create a new JavaSCript SPA using MSAL to call protected Web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa)** -- **[GitHub Azure Samples - MSAL JavaScript Single-page Application using Implicit Flow](https://github.com/Azure-Samples/active-directory-javascript-graphapi-v2/)** -- **[Create React App integrated toochain](https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)** -- **[Microsoft Authentication Library for React (@azure/msal-react)](https://www.npmjs.com/package/@azure/msal-react)** -- **[Initialization of MSAL (@azure/msal-react) in React app](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md)** -- **[Samples for the MSAL.js 2.x library](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/README.md#advanced-topics)** -- **[Getting Started: Using React AAD MSAL library components to integrate MSAL with AAD in your React app](https://www.npmjs.com/package/react-aad-msal#checkered_flag-getting-started)** -- **[Sample JavaScript code to acquired access token as a bearer in an HTTP request to call protected web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-call-api?tabs=javascript#call-a-web-api)** -- **[How to create a simple search app in React](https://medium.com/developer-circle-kampala/how-to-create-a-simple-search-app-in-react-df3cf55927f5)** -- **[Sample React JS code to perform a search](https://github.com/lytes20/meal-search-app)** -- **[Deploy your Node.js app using VS Code and the Azure App Service extension](https://docs.microsoft.com/en-us/azure/app-service/quickstart-nodejs?pivots=platform-linux#deploy-to-azure)** -- **[Hosting options and deployment scenarios to move your node.js app from a local or cloud repository to Azure](https://docs.microsoft.com/en-us/azure/developer/javascript/how-to/deploy-web-app)** -- **[Deploying React apps to Azure with Azure DevOps](https://devblogs.microsoft.com/premier-developer/deploying-react-apps-to-azure-with-azure-devops/)** -- **[Register your app](https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa#register-your-application)** -- **[Register a web app public client application](https://docs.microsoft.com/en-us/azure/healthcare-apis/tutorial-web-app-public-app-reg#connect-with-web-app)** \ No newline at end of file +- **[What is the MedTech service?](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/iot-connector-overview?WT.mc_id=Portal-Microsoft_Healthcare_APIs)** +- **[MedTech service data flow](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/iot-data-flow)** +- **[Deploy the MedTech service manually](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/deploy-iot-connector-in-azure#deploy-the-medtech-service-manually)**, which will allow you to use existing FHIR service deployed in challenge 1 in the MedTech service destination configuration. +- **[Deploy the MedTech service using Azure portal](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/deploy-iot-connector-in-azure#configure-device-mapping-properties)**, which will include the following Azure services: Event Hubs, Health Data Services workspace, FHIR service and MedTech service. +- **[Azure IoMT Connector Data Mapper](https://github.com/microsoft/iomt-fhir/tree/main/tools/data-mapper)** +- **[How to use Device mappings](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/how-to-use-device-mappings)** +- **[How to use the FHIR destination mappings](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/how-to-use-fhir-mappings)** +- **[Granting access to device message event hub and FHIR service](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/deploy-iot-connector-in-azure#granting-the-medtech-service-access-to-the-device-message-event-hub-and-fhir-service)** +- **[Receive device data through Azure IoT Hub](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/device-data-through-iot-hub)** +- **[Create an IoT Hub](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal)** +- **[Connect IoT Hub to MedTech Service with Message Routing](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messages-d2c)** +- **[Upload files from connected devices to IoT Hub](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-file-upload)** +- **[Ingest data from IoT devices](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot/device-data-through-iot-hub#send-device-message-to-iot-hub)** +- **[Get an Azure Active Directory (Azure AD) token and use it send events to an event hub](https://docs.microsoft.com/en-us/rest/api/eventhub/get-azure-active-directory-token#send-messages-to-a-queue)** diff --git a/027-FHIRPoweredHealthcare/Student/Challenge07.md b/027-FHIRPoweredHealthcare/Student/Challenge07.md index 3e7aec64c7..2b332f85c6 100644 --- a/027-FHIRPoweredHealthcare/Student/Challenge07.md +++ b/027-FHIRPoweredHealthcare/Student/Challenge07.md @@ -1,66 +1,80 @@ -# Challenge 7: Bulk export, anonymize and store FHIR data into Data Lake +# Challenge 7: Load DICOM Imaging Data -[< Previous Challenge](./Challenge06.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge08.md) +[< Previous Challenge](./Challenge06.md) - **[Home](../README.md)** ## Introduction -In this challenge, you will explore bulk exporting, anonymizing and storing FHIR data into Data Lake. +In this challenge, you will deploy, configure and use **[DICOM service](https://docs.microsoft.com/azure/healthcare-apis/dicom/)** in **[Azure Health Data Services](https://docs.microsoft.com/azure/healthcare-apis/healthcare-apis-overview)** to work with medical images. DICOM service facilitates transmission of imaging data with any DICOMweb™ enabled system or application through standard transactions including Store (STOW-RS), Search (QIDO-RS), and Retrieve (WADO-RS). It persists imaging data in a *DICOMweb™-compliant server, and injects DICOM metadata into a FHIR server to create a holistic view of patient data. You can upload PHI (Protected Health Information) data to the HIPAA/HITRUST compliant DICOM service, and the data will remain safely segregated within the compliance boundary in the Azure Health Data Services workspace. -The **[FHIR Tools for Anonymization](https://github.com/microsoft/FHIR-Tools-for-Anonymization)** is an open-source project that helps anonymize healthcare FHIR data, on-premises or in the cloud, for secondary usage such as research, public health, and more. This architecture uses multiple Azure services for creating an automated pipeline to process the bulk export and anonymization for FHIR. The goal of the template is to enable quick and continuous creation of research datasets while applying HIPAA safe harbor rules. +Below is the overview of the **[DICOMcast synchronization pipeline](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-cast-overview)**: +
    -
    +## Description -A Timer is used to trigger the Logic App which bulk exports data from FHIR and stores in a preset storage location. The Logic App loops on an adjustable 5 minute interval until Bulk Export finishes exporting all data from FHIR. Logic App runs Azure Data Factory which in triggers Azure Batch which performs the deidentification with the FHIR Tools for Anonymization. The deidentified data is stored in Azure Data Lake Gen 2 for further use. +You will deploy an instance of DICOM service in your Azure Health Data Service workspace, and configure it to ingest DICOM files for persistence in the DICOM service. Its DICOMcast pipeline will synchronize image metadata to FHIR service (deployed in challenge 1), which will enable healthcare organizations to integrate clinical and imaging data. DICOMcast expands the health data use cases by supporting a longitudinal patient data and creating cohorts for medical studies, analytics, and machine learning. -## Description +- **Deploy a DICOM service instance within your Azure Health Data Services workspace (deployed in challenge 1).** + +- **[Configure Azure roles for access to DICOM data](https://docs.microsoft.com/azure/healthcare-apis/configure-azure-rbac#assign-roles-for-the-dicom-service)** + + Hint: You will need to add the `DICOM Data Owner` role for yourself and the Postman service client (Service Principal created in challenge 1). + +- **Import and configure Postman environment and collection files to connect to DICOM service.** + - You can find the Postman template files (`WTHFHIR.Conformance-as-Postman.postman_collection.json` and `WTHFHIR.dicom-service.postman_environment.json`) in the `/Postman` folder of the Resources.zip file provided by your coach. + - Import the environment and collection template files into your Postman + - Configure Postman environment variables specific to your DICOM service instance + + Hint: -You will deploy using the [Microsoft Health Architectures](https://github.com/microsoft/health-architectures/tree/master/Research-and-Analytics/FHIRExportwithAnonymization). - -- **Setup** - - **[Download or Clone the Microsoft Health Archtectures GitHub repo](https://github.com/microsoft/health-architectures)** - - Navigate to `health-architectures/Research-and-Analytics/FHIRExportwithAnonymization` and open the `./Assets/arm_template_parameters.json` file in your preferred JSON editor. Replace FHIR URL, client id, client secret, tenant id and export storage account with yours. - - Save & close the parameters file. - -- **Deploy** - - Log into Azure using PowerShell - ```powershell - Connect-AzAccount - Get-AzSubscription - Select-AzSubscription -SubscriptionId "" - ``` - - Navigate to the repo directory - ```powershell - cd health-architectures-master\Research-and-Analytics\FHIRExportwithAnonymization - ``` - - Create variables and deploy - ```powershell - $EnvironmentName = "" #The name must be lowercase, begin with a letter, end with a letter or digit, and not contain hyphens. - $EnvironmentLocation = "" #optional input. The default is eastus2 - - ./deployFHIRExportwithAnonymization.ps1 -EnvironmentName $EnvironmentName -EnvironmentLocation $EnvironmentLocation #Environment Location is optional - ``` -- **Validate deployment resources** - - Resource Group `{ENVIRONMENTNAME}` - - Azure Data Factory `{ENVIRONMENTNAME}adf` - - Batch Account `{ENVIRONMENTNAME}batch` - - Key Vault `{ENVIRONMENTNAME}kv` - - Logic App `{ENVIRONMENTNAME}la` - - Storage Account `{ENVIRONMENTNAME}dlg2` - -- **Post-deployment setup** - - In Azure Portal, navigate to the FHIR Integration Storage Account entered in the parameters file in the Setup above. Locate the storage account 'Access key' blade under 'Settings'. Copy one of the connection strings. - - Navigate to the new key vault `{ENVIRONMENTNAME}kv` deployed with the script. Open the key vault, locate 'Secrets' blade under 'Settings'. Click on the secret named 'blobstorageacctstring'. Then click "+ New Version". In the 'Value' box paste the connection string from the storage account. Then click the 'Create' button at the bottom the page. This will point the Azure Data Factory to the pre-configured FHIR Integration Storage Account. - - Navigate to the Logic App Logic App `{ENVIRONMENTNAME}la` deployed with the script and click Run Trigger. Click on the Running status in Runs History below in the same screen. The time taken to complete depends on the volume of data you have in Azure API for FHIR. - -- **Validate export and anonymization** - - Compare pre de-identified data in the container with the latest date in the Storage Account entered in the parameters file in the Setup above, and post de-identified data in the container with output as suffix in the Storage Account `{ENVIRONMENTNAME}dlg2` deployed with the script. Look for the container with output as suffix. + From your existing fhir-service Postman environment: + - tenantId - AAD tenant ID (you also can find it in AAD -> Overview -> Tenant ID). + - clientId - Application (client) ID for Postman service client app. + - clientSecret - Client secret for your Postman app. + + New values you need to input: + - resource - https://dicom.healthcareapis.azure.com + - baseUrl - Service URL appended with /v1. Go to Portal -> Resource Group -> DICOM service -> Service URL. Copy and add /v1 on the end: https://-.dicom.azurehealthcareapis.com/v1 + +- **Use DICOM service to load imaging files** + - Obtain access token to connect with your DICOM service + - Store DICOM instances with sample DICOM files + + Hint: + - Select corresponding POST `Store-single-instance (xxx.dcm)` in `WTH FHIR-Conformance-as-Postman` collection for each sample DICOM files (red-triangle.dcm, green-square.dcm and blue-circle.dcm) + - You can find the sample DICOM files (`red-triangle.dcm`, `green-square.dcm` and `blue-circle.dcm`) in the `/DICOM-service/dcms` folder of the Resources.zip file provided by your coach. + - Select the appropriate .dcm file (downloaded previously) for each API call in the `Body` tab. + - For each sample .dcm file, send appropriate `POST Store-single-instance...` API call to populate your DICOM service with the three .dcm single instance files. + + - Use DICOM service API calls to Search for DICOM instance(s) + - Use DICOM service API calls to Retrieve DICOM instance(s) + - Check logs for changes in DICOM service via Change Feed + - Manage extended query tags in your DICOM service instance(s) + - Add extended query tags + - List extended query tags + - Get extended query tags + - Update extended query tags + - Delete extended query tags ## Success Criteria -- You have successfully deployed export and anonyization template. -- You have compared pre de-ided and post de-ided FHIR data. +- You have successfully provisioned and configured DICOM service for ingestion and storage of DICOM studies +- You have successfully used DICOM service to upload, search, and retrieve DICOM studies +- You have successfully checked log (Change Feed) +- You have successfully added/removed additional query tags. + ## Learning Resources -- **[HIPPA Safe Harbor Method](https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html)** -- **[HL7 bulk export](https://hl7.org/Fhir/uv/bulkdata/export/index.html)** -- **[FHIR Tools for Anonymization](https://github.com/microsoft/FHIR-Tools-for-Anonymization)** +- **[What is the DICOM service?](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-services-overview)** +- **[DICOMcast architecture overview](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-cast-overview)** +- **[DICOM Change Feed Overview](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-change-feed-overview)** +- **[DICOM Extended Query Tag Overview](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-extended-query-tags-overview)** +- **[Using DICOMweb™Standard APIs with DICOM services](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicomweb-standard-apis-with-dicom-services)** +- **[HDICOM Conformance Statement-DICOMweb™ Standard Service Documentation](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-services-conformance-statement)** +- **[DICOM Change Feed Overview](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-change-feed-overview)** +- **[Pull DICOM changes using the Change Feed](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/pull-dicom-changes-from-change-feed)** +- **[Obtain and use an access token for the DICOM service](https://learn.microsoft.com/en-us/azure/healthcare-apis/get-access-token?tabs=azure-cli#obtain-and-use-an-access-token-for-the-dicom-service)** +- **[Get started with the DICOM service](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/get-started-with-dicom)** +- **[Deploy DICOM service using the Azure portal](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/deploy-dicom-services-in-azure)** +- **[Configure Azure RBAC for the DICOM service](https://learn.microsoft.com/en-us/azure/healthcare-apis/configure-azure-rbac#assign-roles-for-the-dicom-service)** +- **[Register a client application for the DICOM service in Azure Active Directory](https://learn.microsoft.com/en-us/azure/healthcare-apis/dicom/dicom-register-application)** +- **[OSS DICOM Server: Medical Imaging Server for DICOM](https://github.com/microsoft/dicom-server)** \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Challenge08.md b/027-FHIRPoweredHealthcare/Student/Challenge08.md deleted file mode 100644 index 4cb395722f..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Challenge08.md +++ /dev/null @@ -1,100 +0,0 @@ -# Challenge 8: Stream IoMT Device data into FHIR from IoT Central - -[< Previous Challenge](./Challenge07.md) - **[Home](../readme.md)** - [Next Challenge>](./Challenge09.md) - -## Introduction - -In this challenge, you will stream IoMT Device data into FHIR from IoT Central. - -The **[Azure IoT Connector for FHIR](https://docs.microsoft.com/en-us/azure/healthcare-apis/iot-fhir-portal-quickstart)** for Fast Healthcare Interoperability Resources (FHIR®)* is a feature of Azure API for FHIR that provides the capability to ingest data from Internet of Medical Things (IoMT) devices. Azure IoT Connector for FHIR needs two mapping templates to transform device messages into FHIR-based Observation resource(s): device mapping and FHIR mapping. Device mapping template transforms device data into a normalized schema. On the IoT Connector page, click on Configure device mapping button to go to the Device mapping page. FHIR mapping template transforms a normalized message to a FHIR-based Observation resource. On the IoT Connector page, click on Configure FHIR mapping button to go to the FHIR mapping page. - -Azure offers an extensive suite of IoT products to connect and manage your IoT devices. Users can build their own solution based on PaaS using Azure IoT Hub, or start with a manage IoT apps platform with Azure IoT Central. This challenge leverages Azure IoT Central, which has industry-focused solution templates to help get started. Once IoT Central application is deployed, two out-of-the-box simulated devices will start generating telemetry. - -
    - -## Description - -You will deploy IoT Connector for FHIR and Setup IoT Device in IoT Central and Connect to FHIR. - -- **Deploy Azure IoT Connector for FHIR** - - Navigate to Azure API for FHIR resource. Click on IoT Connector under the Add-ins section. Click on the Add button to open the Create IoT Connector page. Enter Connector name for the new Azure IoT Connector for FHIR. Choose Create for Resolution Type and click on Create button. -- **Configure Azure IoT Connector for FHIR**. To **upload mapping templates**, click on the newly deployed Azure IoT Connector for FHIR to go to the IoT Connector page. - * Device mapping template transforms **device data into a normalized schema**. On the IoT Connector page, click on **Configure device mapping** button to go to the Device mapping page. On the Device mapping page, add the following script to the JSON editor and click Save. - ```json - { - "templateType": "CollectionContent", - "template": [ - { - "templateType": "IotJsonPathContent", - "template": { - "typeName": "heartrate", - "typeMatchExpression": "$..[?(@Body.HeartRate)]", - "patientIdExpression": "$.SystemProperties.iothub-connection-device-id", - "values": [ - { - "required": "true", - "valueExpression": "$.Body.HeartRate", - "valueName": "hr" - } - ] - } - } - ] - } - ``` - * FHIR mapping template **transforms a normalized message to a FHIR-based Observation resource**. On the IoT Connector page, click on **Configure FHIR mapping** button to go to the FHIR mapping page. On the FHIR mapping page, add the following script to the JSON editor and click Save. - ```json - { - "templateType": "CollectionFhir", - "template": [ - { - "templateType": "CodeValueFhir", - "template": { - "codes": [ - { - "code": "8867-4", - "system": "http://loinc.org", - "display": "Heart rate" - } - ], - "periodInterval": 0, - "typeName": "heartrate", - "value": { - "unit": "count/min", - "valueName": "hr", - "valueType": "Quantity" - } - } - } - ] - } - ``` -- **Generate a connection string for IoT Device** - - On the IoT Connector page, select **Manage client connections** button. Click on **Add** button. Provide a name and select the **Create** button. Select the newly created connection from the Connections page and copy the value of Primary connection string field from the overlay window on the right. - -- **Create App in IoT Central** - - Navigate to the [Azure IoT Central application manager website](https://apps.azureiotcentral.com/). Select **Build** from the left-hand navigation bar and then click the **Healthcare** tab. - - Click the **Create app** button and sign in. It will take you to the **New application** page. - - Change the **Application name** and **URL** or leave as-is. - - Check the **Pricing plan** and select free pricing plan or one of the standard pricing plans. - - Select **Create** at the bottom of the page to deploy your application. - - More details on [Continuous Patient Monitoring](https://docs.microsoft.com/en-us/azure/iot-central/healthcare/tutorial-continuous-patient-monitoring#create-an-application-template). -- **Connect your IoT data with the Azure IoT Connector for FHIR** - - Navigate to IoT Central App created, click on **Data Export (legacy)** under App Settings in the left navigation. - - Choose **New --> Azure Event Hubs**. Enter a display name for your new export, and make sure the data export is Enabled. - - Choose **Connection String** in Event Hubs namespace and paste the Connection String copied from above. Event Hub name will autofill. - - Make sure **Telemetry** is enabled, Devices and Device templates are disabled. - - More details on [Data Export](https://docs.microsoft.com/en-us/azure/iot-central/core/howto-export-data#set-up-data-export). - -- **Validate export and anonymization** - - Connect to Azure API for FHIR from Postman and check if Device and Observsation resources return data. - -## Success Criteria -- You have successfully configured IoT Connector for FHIR. -- You have successfully configured IoT Central Continuous Patient Monitoring Application. - -## Learning Resources - -- **[HIPPA Safe Harbor Method](https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html)** -- **[HL7 bulk export](https://hl7.org/Fhir/uv/bulkdata/export/index.html)** -- **[FHIR Tools for Anonymization](https://github.com/microsoft/FHIR-Tools-for-Anonymization)** diff --git a/027-FHIRPoweredHealthcare/Student/Challenge09.md b/027-FHIRPoweredHealthcare/Student/Challenge09.md deleted file mode 100644 index c2e37fdc9a..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Challenge09.md +++ /dev/null @@ -1,55 +0,0 @@ -# Challenge 9: Analyze and Visualize FHIR data using PowerBI - -[< Previous Challenge](./Challenge08.md) - **[Home](../readme.md)** - -## Introduction - -In this challenge, you will analyze and visualize FHIR data using PowerQuery Connector for FHIR and SQL DB Connector in PowerBI. - -Once the data is loaded into FHIR, there are many ways to utilize FHIR data to draw out additional insights whether it is to do some basic analysis or for some deep analysis. -One option is to use the [Power Query connector for FHIR](https://docs.microsoft.com/en-us/power-query/connectors/fhir/fhir) in PowerBI to import and shape data from a FHIR server. -Another option is to first structure the data using Databricks and store in Azure SQL DB. Then use Azure SQL DB Connector in PowerBI to visualze. - -
    - -## Description - -You will deploy IoT Connector for FHIR and Setup IoT Device in IoT Central and Connect to FHIR. - -- **Vizualize in PowerBI using PowerQuery Connector for FHIR** - - Open PowerBI Desktop. [Download](https://powerbi.microsoft.com/en-us/downloads/) if you don't have one. - - Go to **File** --> **Options and settings** --> **Data source settings** and click **Clear All Permissions**. - - Click **Get Data** from the menu. - - Search **FHIR**, select the result, and click **Connect**. - - Enter your FHIR URL **https://{your resource prefix}.azurehealthcareapis.com**. You can get this from Azure API for FHIR resource in Azure Portal. - - Click the **Sign In** button. - - Enter user and password from Azure AD. - - Click **Connect**. - - Choose the tables you are interested in analyzing and click the **Transform data** button. - - You should see all tables you selected are loaded into Power Query Editor. - - Explore/transform/visualize! - -- **Vizualize in PowerBI using Azure SQL DB Connector** - - Process and Load FHIR data into Azure SQL Database using Azure Databricks - - Create **Azure SQL Database** - - **Export Data** from Azure API for FHIR into **Export Storage Account** using $export from Postman. - - Create **Databricks** Environment. Connect to the Export Storage Account, Transform and load into Azure SQL Database. - - **Vizualize in PowerBI** - - Open PowerBI Desktop. [Download](https://powerbi.microsoft.com/en-us/downloads/) if you don't have one. - - Go to **File** --> **Options and settings** --> **Data source settings** and click **Clear All Permissions**. - - Click **Get Data** from the menu. - - Search **Azure SQL**, select and click Connect. - - Enter **SQL Server name** and ** SQL Database name** from Task #1 above. Leave Import checked. Click the **Ok** button. - - Click Database on the left menu. Type in User name and Password from Task #1 above. - - Choose all the tables you are interested in analyzing/visualizing and click Transform data. - - Explore/transform/visualize! - -## Success Criteria -- You have successfully analyzed FHIR data using PowerQuery Connector for FHIR. -- You have successfully analyzed FHIR data using SQL DB Connector for FHIR. - -## Learning Resources - -- **[HIPPA Safe Harbor Method](https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html)** -- **[HL7 bulk export](https://hl7.org/Fhir/uv/bulkdata/export/index.html)** -- **[FHIR Tools for Anonymization](https://github.com/microsoft/FHIR-Tools-for-Anonymization)** diff --git a/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/blue-circle.dcm b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/blue-circle.dcm new file mode 100644 index 0000000000..b2755e82ea Binary files /dev/null and b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/blue-circle.dcm differ diff --git a/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/dicom-metadata.csv b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/dicom-metadata.csv new file mode 100644 index 0000000000..fd2e68cdf4 --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/dicom-metadata.csv @@ -0,0 +1,4 @@ +SpecificCharacterSet,ImageType,SOPClassUID,SOPInstanceUID,StudyDate,ContentDate,AcquisitionDateTime,StudyTime,ContentTime,AccessionNumber,Modality,ConversionType,ReferringPhysicianName,PatientName,PatientID,PatientBirthDate,PatientSex,PatientAge,PatientPosition,StudyInstanceUID,SeriesInstanceUID,StudyID,SeriesNumber,InstanceNumber,PatientOrientation,Laterality,ImageComments,SamplesPerPixel,PhotometricInterpretation,PlanarConfiguration,Rows,Columns,PixelSpacing,BitsAllocated,BitsStored,HighBit,PixelRepresentation,SmallestImagePixelValue,LargestImagePixelValue,fname,MultiImageType,ImageType1,ImageType2,MultiPixelSpacing,PixelSpacing1 +ISO_IR 192,DERIVED,1.2.840.10008.5.1.4.1.1.7,1.2.826.0.1.3680043.8.498.13273713909719068980354078852867170114,20200922,,,120000,,,OT,SYN,Doctor Doc,Anony Mous,ID1,,F,024Y,,1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420,1.2.826.0.1.3680043.8.498.77033797676425927098669402985243398207,1,2,1,,,Fake DICOM - Blue Circle,3,RGB,0,979,985,1,8,8,7,0,0,255,C:\data\fakedicom\files\blue-circle.dcm,1,SECONDARY,OTHER,1,1 +ISO_IR 192,DERIVED,1.2.840.10008.5.1.4.1.1.7,1.2.826.0.1.3680043.8.498.12714725698140337137334606354172323212,20200922,,,120000,,,OT,SYN,Doctor Doc,Anony Mous,ID1,,F,024Y,,1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420,1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652,1,1,2,,,Fake DICOM - Green Square,3,RGB,0,979,985,1,8,8,7,0,0,255,C:\data\fakedicom\files\green-square.dcm,1,SECONDARY,OTHER,1,1 +ISO_IR 192,DERIVED,1.2.840.10008.5.1.4.1.1.7,1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395,20200922,,,120000,,,OT,SYN,Doctor Doc,Anony Mous,ID1,,F,024Y,,1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420,1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652,1,1,1,,,Fake DICOM - Red Triangle,3,RGB,0,979,985,1,8,8,7,0,0,255,C:\data\fakedicom\files\red-triangle.dcm,1,SECONDARY,OTHER,1,1 diff --git a/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/green-square.dcm b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/green-square.dcm new file mode 100644 index 0000000000..61bc03d976 Binary files /dev/null and b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/green-square.dcm differ diff --git a/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/red-triangle.dcm b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/red-triangle.dcm new file mode 100644 index 0000000000..b9cbe05269 Binary files /dev/null and b/027-FHIRPoweredHealthcare/Student/Resources/DICOM-service/dcms/red-triangle.dcm differ diff --git a/027-FHIRPoweredHealthcare/Student/Resources/JavaScript-Sample/index.html b/027-FHIRPoweredHealthcare/Student/Resources/JavaScript-Sample/index.html deleted file mode 100644 index 5296045b06..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/JavaScript-Sample/index.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - FHIR Patient browser sample app - - - - -
    -

    Welcome to the FHIR Patient browsing sample Application

    - -
    - -
    -
    - - - - - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/MedTech-service/SampleData/devicecontent.json b/027-FHIRPoweredHealthcare/Student/Resources/MedTech-service/SampleData/devicecontent.json new file mode 100644 index 0000000000..5f1f794f4e --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/MedTech-service/SampleData/devicecontent.json @@ -0,0 +1,175 @@ +{ + "templateType": "CollectionContent", + "template": [ + { + "templateType": "JsonPathContent", + "template": { + "typeName": "heartrate", + "typeMatchExpression": "$..[?(@hr)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "heartRate", + "valueExpression": "$.hr", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "Spo2", + "typeMatchExpression": "$..[?(@spo2)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "oxygenSaturation", + "valueExpression": "$.spo2", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "BloodPerfusion", + "typeMatchExpression": "$..[?(@bloodperfusion)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "bloodPerfusion", + "valueExpression": "$.bloodperfusion", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "Steps", + "typeMatchExpression": "$..[?(@steps)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "steps", + "valueExpression": "$.steps", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "BloodPulseWave", + "typeMatchExpression": "$..[?(@bpw)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "bloodPulseWave", + "valueExpression": "$.bpw", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "RespirationRate", + "typeMatchExpression": "$..[?(@rrate)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "respirationRate", + "valueExpression": "$.rrate", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "SkinTemp", + "typeMatchExpression": "$..[?(@bodytemp)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "skinTemperature", + "valueExpression": "$.bodytemp", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "BloodPressureDiastolic", + "typeMatchExpression": "$..[?(@dia)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "diastolic", + "valueExpression": "$.dia", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "BloodPressureSystolic", + "typeMatchExpression": "$..[?(@sys)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "systolic", + "valueExpression": "$.sys", + "required": false + } + ] + } + }, + { + "templateType": "JsonPathContent", + "template": { + "typeName": "Weight", + "typeMatchExpression": "$..[?(@weight)]", + "timestampExpression": "$.utctimestamp", + "deviceIdExpression": "$.device_id", + "patientIdExpression": "$.patient_id", + "values": [ + { + "valueName": "weight", + "valueExpression": "$.weight", + "required": false + } + ] + } + } + ] +} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/MedTech-service/SampleData/fhirmapping.json b/027-FHIRPoweredHealthcare/Student/Resources/MedTech-service/SampleData/fhirmapping.json new file mode 100644 index 0000000000..2bb1356b5f --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/MedTech-service/SampleData/fhirmapping.json @@ -0,0 +1,298 @@ +{ + "templateType": "CollectionFhir", + "template": [ + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "codes": [ + { + "code": "8867-4", + "system": "http://loinc.org", + "display": "Heart rate" + } + ], + "periodInterval": 60, + "typeName": "heartrate", + "value": { + "defaultPeriod": 5000, + "unit": "Bpm", + "valueName": "heartRate", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "codes": [ + { + "code": "9279-1", + "system": "http://loinc.org", + "display": "Respiratory rate" + } + ], + "periodInterval": 60, + "typeName": "RespirationRate", + "value": { + "defaultPeriod": 5000, + "unit": "Brpm", + "valueName": "respirationRate", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "periodInterval": 60, + "typeName": "BloodPressureDiastolic", + "codes": [ + { + "code": "8462-4", + "display": "Diastolic blood pressure", + "system": "http://loinc.org" + } + ], + "value": { + "defaultPeriod": 5000, + "unit": "mmHg", + "valueName": "diastolic", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "periodInterval": 60, + "typeName": "BloodPressureSystolic", + "codes": [ + { + "code": "8480-6", + "display": "Systolic blood pressure", + "system": "http://loinc.org" + }, + { + "code": "271649006", + "display": "Systolic blood pressure", + "system": "http://snomed.info/sct" + } + ], + "value": { + "defaultPeriod": 5000, + "unit": "mmHg", + "valueName": "systolic", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "codes": [ + { + "code": "59405-1", + "system": "http://loinc.org", + "display": "Oxygen Saturation" + } + ], + "periodInterval": 60, + "typeName": "Spo2", + "value": { + "defaultPeriod": 5000, + "unit": "%", + "valueName": "oxygenSaturation", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "codes": [ + { + "code": "29463-7", + "system": "http://loinc.org", + "display": "Body weight" + } + ], + "periodInterval": 60, + "typeName": "Weight", + "value": { + "defaultPeriod": 5000, + "unit": "KG", + "valueName": "weight", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "codes": [ + { + "code": "73794-0", + "system": "http://loinc.org", + "display": "Perfusion index Blood Postductal Pulse oximetry" + } + ], + "periodInterval": 60, + "typeName": "BloodPerfusion", + "value": { + "defaultPeriod": 5000, + "unit": "%", + "valueName": "bloodPerfusion", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "codes": [ + { + "code": "55423-8", + "system": "http://loinc.org", + "display": "Number of steps in unspecified time Pedometer" + } + ], + "periodInterval": 60, + "typeName": "Steps", + "value": { + "defaultPeriod": 5000, + "unit": "steps/second", + "valueName": "steps", + "valueType": "SampledData" + } + } + }, + { + "templateType": "CodeValueFhir", + "template": { + "category": [ + { + "codes": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "codes": [ + { + "code": "39106-0", + "system": "http://loinc.org", + "display": "Temperature of Skin" + } + ], + "periodInterval": 60, + "typeName": "SkinTemp", + "value": { + "defaultPeriod": 5000, + "unit": "C", + "valueName": "skinTemperature", + "valueType": "SampledData" + } + } + } + ] +} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.Conformance-as-Postman.postman_collection.json b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.Conformance-as-Postman.postman_collection.json new file mode 100644 index 0000000000..37c47759f2 --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.Conformance-as-Postman.postman_collection.json @@ -0,0 +1,1286 @@ +{ + "info": { + "_postman_id": "8241b02f-9ac3-4215-acdb-69548a9a82c4", + "name": "WTH FHIR-Conformance-as-Postman", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "15998620" + }, + "item": [ + { + "name": "AuthorizeGetToken", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);\r", + "postman.setEnvironmentVariable(\"bearerToken\", jsonData.access_token);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "noauth" + }, + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "grant_type", + "value": "client_credentials", + "type": "text" + }, + { + "key": "client_id", + "value": "{{clientId}}", + "type": "text" + }, + { + "key": "client_secret", + "value": "{{clientSecret}}", + "type": "text" + }, + { + "key": "resource", + "value": "{{resource}}", + "type": "text" + } + ] + }, + "url": { + "raw": "https://login.microsoftonline.com/{{tenantId}}/oauth2/token", + "protocol": "https", + "host": [ + "login", + "microsoftonline", + "com" + ], + "path": [ + "{{tenantId}}", + "oauth2", + "token" + ] + } + }, + "response": [] + }, + { + "name": "Store-single-instance (red-triangle.dcm)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + } + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/dicom+json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/dicom" + } + ], + "body": { + "mode": "file", + "file": { + "src": "/C:/Users/v-pbartley/OneDrive - Microsoft/Documents/OpenHack MC4H 2021/DICOM/red-triangle.dcm" + } + }, + "url": { + "raw": "{{baseUrl}}/studies", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "Store-single-instance (green-square.dcm)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + } + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/dicom+json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/dicom" + } + ], + "body": { + "mode": "file", + "file": { + "src": "/C:/Users/v-pbartley/OneDrive - Microsoft/Documents/OpenHack MC4H 2021/DICOM/green-square.dcm" + } + }, + "url": { + "raw": "{{baseUrl}}/studies", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies" + ] + }, + "description": "This upload is simply to ensure the remaining requests succeed. Ideally, red-triangle.dcm, blue-cirle.dcm, and green-square.dcm are all uploaded.\r\n\r\nFor the body of the request, select the green-square.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "Store-single-instance (blue-circle.dcm)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + } + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/dicom+json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/dicom" + } + ], + "body": { + "mode": "file", + "file": { + "src": "/C:/Users/v-pbartley/OneDrive - Microsoft/Documents/OpenHack MC4H 2021/DICOM/blue-circle.dcm" + } + }, + "url": { + "raw": "{{baseUrl}}/studies", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies" + ] + }, + "description": "This upload is simply to ensure the remaining requests succeed. Ideally, red-triangle.dcm, blue-cirle.dcm, and green-square.dcm are all uploaded.\r\n\r\nFor the body of the request, select the blue-circle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "[will not work - see description] Store-instances-using-multipart/related", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + } + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/dicom+json" + }, + { + "key": "Content-Type", + "type": "text", + "value": "multipart/related;boundary=ABCD1234" + } + ], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "file", + "contentType": "application/dicom", + "type": "file", + "src": "/C:/githealth/dicom-samples/visus.com/case1/dicomfile" + } + ] + }, + "url": { + "raw": "{{baseUrl}}/studies", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies" + ] + }, + "description": "This request intends to demonstrate how to upload DICOM files using multipart/related. However, it will not work in Postman.\r\n\r\n> NOTE: Postman cannot be used to upload DICOM files in a way that complies with the DICOM standard. This is due to a Postman limitation. Instead, consider using cURL or programatically uploading the file using Python, C# or another full featured language.\r\n\r\n_Details:_\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: multipart/related; type=\"application/dicom\"`\r\n* Body:\r\n * `Content-Type: application/dicom` for each file uploaded, separated by a boundary value\r\n\r\n> Some programming languages and tools behave differently. For instance, some require you to define your own boundary. For those, you may need to use a slightly modified Content-Type header. The following have been used successfully.\r\n> * `Content-Type: multipart/related; type=\"application/dicom\"; boundary=ABCD1234`\r\n> * `Content-Type: multipart/related; boundary=ABCD1234`\r\n> * `Content-Type: multipart/related`\r\n\r\nIf using Postman, please consider using Store-single-instance. This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related." + }, + "response": [] + }, + { + "name": "[will not work - see description] Store-instances-for-a-specific-study", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [] + }, + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}" + ] + }, + "description": "This request intends to demonstrate how to upload DICOM files using multipart/related to a designated study. However, it will not work in Postman.\r\n\r\n> NOTE: Postman cannot be used to upload DICOM files in a way that complies with the DICOM standard. This is due to a Postman limitation. Instead, consider using cURL or programatically uploading the file using Python, C# or another full featured language.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: multipart/related; type=\"application/dicom\"`\r\n* Body:\r\n * `Content-Type: application/dicom` for each file uploaded, separated by a boundary value\r\n\r\n> Some programming languages and tools behave differently. For instance, some require you to define your own boundary. For those, you may need to use a slightly modified Content-Type header. The following have been used successfully.\r\n > * `Content-Type: multipart/related; type=\"application/dicom\"; boundary=ABCD1234`\r\n > * `Content-Type: multipart/related; boundary=ABCD1234`\r\n > * `Content-Type: multipart/related`\r\n\r\nIf using Postman, please consider using Store-single-instance. This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related." + }, + "response": [] + }, + { + "name": "Retrieve-all-instances-within-a-study", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "multipart/related; type=\"application/dicom\"; transfer-syntax=*", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}" + ] + }, + "description": "This request retrieves all instances within a single study, and returns them as a collection of multipart/related bytes.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: multipart/related; type=\"application/dicom\"; transfer-syntax=*`\r\n" + }, + "response": [] + }, + { + "name": "Retrieve-metadata-of-all-instances-in-study", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "let seriesid = pm.variables.get(\"series1\");\r", + "pm.test(\"Series in returned metadata\", function () {\r", + " pm.expect(pm.response.text()).to.include(seriesid);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/metadata", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "metadata" + ] + }, + "description": "This request retrieves the metadata for all instances within a single study.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}/metadata\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n" + }, + "response": [] + }, + { + "name": "Retrieve-all-instances-within-a-series", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "multipart/related; type=\"application/dicom\"; transfer-syntax=*", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}" + ] + }, + "description": "This request retrieves all instances within a single series, and returns them as a collection of multipart/related bytes.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}/series{series}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: multipart/related; type=\"application/dicom\"; transfer-syntax=*`\r\n" + }, + "response": [] + }, + { + "name": "Retrieve-metadata-of-all-instances-within-a-series", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}/metadata", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}", + "metadata" + ] + }, + "description": "This request retrieves the metadata for all instances within a single series.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}/series/{series}/metadata\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n" + }, + "response": [] + }, + { + "name": "Retrieve-a-single-instance-within-a-series-of-a-study", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom; transfer-syntax=*", + "type": "text" + }, + { + "key": "", + "value": "", + "type": "text", + "disabled": true + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}/instances/{{instance1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}", + "instances", + "{{instance1}}" + ] + }, + "description": "This request retrieves a single instances, and returns it as a DICOM formatted stream of bytes.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}/series{series}/instances/{instance}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom; transfer-syntax=*`\r\n" + }, + "response": [] + }, + { + "name": "Retrieve-metadata-of-a-single-instance-within-a-series-of-a-study", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}/instances/{{instance1}}/metadata", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}", + "instances", + "{{instance1}}", + "metadata" + ] + }, + "description": "This request retrieves the metadata for a single instances within a single study and series.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}/series/{series}/instances/{instance}/metadata\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`" + }, + "response": [] + }, + { + "name": "Retrieve-one-or-more-frames-from-a-single-instance", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "multipart/related; type=\"application/octet-stream\"; transfer-syntax=1.2.840.10008.1.2.1", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}/instances/{{instance1}}/frames/1", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}", + "instances", + "{{instance1}}", + "frames", + "1" + ] + }, + "description": "This request retrieves one or more frames from a single instance, and returns them as a collection of multipart/related bytes.\r\n\r\n_Details:_\r\n* Path: ../studies/{study}/series{series}/instances/{instance}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: multipart/related; type=\"application/octet-stream\"; transfer-syntax=1.2.840.10008.1.2.1` (Default) or\r\n * `Accept: multipart/related; type=\"application/octet-stream\"; transfer-syntax=*` or\r\n * `Accept: multipart/related; type=\"application/octet-stream\";`\r\n" + }, + "response": [] + }, + { + "name": "Search-for-studies", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/dicom+json" + } + ], + "url": { + "raw": "{{baseUrl}}/studies?StudyInstanceUID={{study1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies" + ], + "query": [ + { + "key": "StudyInstanceUID", + "value": "{{study1}}" + } + ] + }, + "description": "This request enables searches for studies, series and instances by DICOM attributes.\r\n\r\n> Please see the [Conformance.md](https://github.com/microsoft/dicom-server/blob/main/docs/users/Conformance.md) file for supported DICOM attributes.\r\n\r\n_Details:_\r\n* Path: ../studies?StudyInstanceUID={{study1}}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n" + }, + "response": [] + }, + { + "name": "Search-for-series", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/series?SeriesInstanceUID={{series1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "series" + ], + "query": [ + { + "key": "SeriesInstanceUID", + "value": "{{series1}}" + } + ] + }, + "description": "This request enables searches for one or more series by DICOM attributes.\r\n\r\n> Please see the [Conformance.md](https://github.com/microsoft/dicom-server/blob/main/docs/users/Conformance.md) file for supported DICOM attributes.\r\n\r\n_Details:_\r\n* Path: ../series?SeriesInstanceUID={{series}}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n" + }, + "response": [] + }, + { + "name": "Search-for-series-within-a-study", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series?SeriesInstanceUID={{series1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series" + ], + "query": [ + { + "key": "SeriesInstanceUID", + "value": "{{series1}}" + } + ] + }, + "description": "This request enables searches for one or more series within a single study by DICOM attributes.\r\n\r\n> Please see the [Conformance.md](https://github.com/microsoft/dicom-server/blob/main/docs/users/Conformance.md) file for supported DICOM attributes.\r\n\r\n_Details:_\r\n* Path: ../studies/{{study}}/series?SeriesInstanceUID={{series}}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n" + }, + "response": [] + }, + { + "name": "Search-for-instances", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/instances?SOPInstanceUID={{instance1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "instances" + ], + "query": [ + { + "key": "SOPInstanceUID", + "value": "{{instance1}}" + } + ] + }, + "description": "This request enables searches for one or more instances by DICOM attributes.\r\n\r\n> Please see the [Conformance.md](https://github.com/microsoft/dicom-server/blob/main/docs/users/Conformance.md) file for supported DICOM attributes.\r\n\r\n_Details:_\r\n* Path: ../instances?SOPInstanceUID={{instance}}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n" + }, + "response": [] + }, + { + "name": "Search-for-instances-within-a-study", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/dicom+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/instances?SOPInstanceUID={{instance1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "instances" + ], + "query": [ + { + "key": "SOPInstanceUID", + "value": "{{instance1}}" + } + ] + }, + "description": "This request enables searches for one or more instances within a single study by DICOM attributes.\r\n\r\n> Please see the [Conformance.md](https://github.com/microsoft/dicom-server/blob/main/docs/users/Conformance.md) file for supported DICOM attributes.\r\n\r\n_Details:_\r\n* Path: ../studies/{{study}}/instances?SOPInstanceUID={{instance}}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`" + }, + "response": [] + }, + { + "name": "Search-for-instances-within-a-study-and-series", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true + } + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "type": "text", + "value": "application/dicom+json" + } + ], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}/instances?SOPInstanceUID={{instance1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}", + "instances" + ], + "query": [ + { + "key": "SOPInstanceUID", + "value": "{{instance1}}" + } + ] + }, + "description": "This request enables searches for one or more instances within a single study and single series by DICOM attributes.\r\n\r\n> Please see the [Conformance.md](https://github.com/microsoft/dicom-server/blob/main/docs/users/Conformance.md) file for supported DICOM attributes.\r\n\r\n_Details:_\r\n* Path: ../studies/{{study}}/series/{{series}}instances?SOPInstanceUID={{instance}}\r\n* Method: GET\r\n* Headers:\r\n * `Accept: application/dicom+json`" + }, + "response": [] + }, + { + "name": "Delete-a-specific-instance-within-a-study -and-series", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}/instances/{{instance1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}", + "instances", + "{{instance1}}" + ] + }, + "description": "This request deletes a single instance within a single study and single series.\r\n\r\n> Delete is not part of the DICOM standard, but has been added for convenience.\r\n\r\n_Details:_\r\n* Path: ../studies/{{study}}/series/{{series}}/instances/{{instance}}\r\n* Method: DELETE\r\n* Headers: No special headers needed" + }, + "response": [] + }, + { + "name": "Delete-a-specific-series-within-a-study", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}/series/{{series1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}", + "series", + "{{series1}}" + ] + }, + "description": "This request deletes a single series (and all child instances) within a single study.\r\n\r\n> Delete is not part of the DICOM standard, but has been added for convenience.\r\n\r\n_Details:_\r\n* Path: ../studies/{{study}}/series/{{series}}\r\n* Method: DELETE\r\n* Headers: No special headers needed" + }, + "response": [] + }, + { + "name": "Delete-a-specific-study", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/studies/{{study1}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "studies", + "{{study1}}" + ] + }, + "description": "This request deletes a single study (and all child series and instances).\r\n\r\n> Delete is not part of the DICOM standard, but has been added for convenience.\r\n\r\n_Details:_\r\n* Path: ../studies/{{study}}\r\n* Method: DELETE\r\n* Headers: No special headers needed" + }, + "response": [] + }, + { + "name": "Create-extended-query-tag", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + } + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "[\r\n {\r\n \"Path\": \"{{extendedQueryTag}}\",\r\n \"VR\": \"LO\",\r\n \"Level\": \"Series\"\r\n }\r\n]", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/extendedquerytags", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "extendedquerytags" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "List-extended-query-tags", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + }, + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/extendedquerytags", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "extendedquerytags" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "Get-extended-query-tag", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + }, + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/extendedquerytags/{{extendedQueryTag}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "extendedquerytags", + "{{extendedQueryTag}}" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "Delete-extended-query-tag", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + } + }, + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/extendedquerytags/{{extendedQueryTag}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "extendedquerytags", + "{{extendedQueryTag}}" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "Update-extended-query-tag", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + } + }, + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "default" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"QueryStatus\": \"Disabled\"\r\n}", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/extendedquerytags/{{extendedQueryTag}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "extendedquerytags", + "{{extendedQueryTag}}" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "List-extended-query-tag-errors", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + }, + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/extendedquerytags/{{extendedQueryTag}}/errors", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "extendedquerytags", + "{{extendedQueryTag}}", + "errors" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + }, + { + "name": "Get-operation", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "accept": true, + "accept-encoding": true, + "connection": true, + "content-type": true, + "user-agent": true + }, + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/operations/{{operationId}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "operations", + "{{operationId}}" + ] + }, + "description": "For the body of the request, select the red-triangle.dcm file located in the GitHub repo at ../docs/dcms. Ensure you attach the file as `binary`.\r\n\r\n> NOTE: This is a non-standard API that allows the upload of a single DICOM file without the need to configure the POST for multipart/related. It allows the use of Postman to upload files to the DICOMweb service.\r\n\r\nThe following is required to upload a single DICOM file.\r\n\r\n* Path: ../studies\r\n* Method: POST\r\n* Headers:\r\n * `Accept: application/dicom+json`\r\n * `Content-Type: application/dicom`\r\n* Body:\r\n * Contains the DICOM file as a bytes.\r\n\r\n> This API is currently not implemented\r\n" + }, + "response": [] + } + ], + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{bearerToken}}", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "https://localhost:63838/v1" + }, + { + "key": "study1", + "value": "1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420" + }, + { + "key": "series1", + "value": "1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652" + }, + { + "key": "instance1", + "value": "1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395" + }, + { + "key": "instance2", + "value": "1.2.826.0.1.3680043.8.498.12714725698140337137334606354172323212\n" + }, + { + "key": "extendedQueryTag", + "value": "ManufacturerModelName", + "type": "default" + }, + { + "key": "operationId", + "value": "1", + "type": "default" + } + ] +} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_collection.json b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_collection.json new file mode 100644 index 0000000000..3f87dc8329 --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_collection.json @@ -0,0 +1,205 @@ +{ + "info": { + "_postman_id": "d47122ef-fe12-4bed-bfc5-472931f50f1c", + "name": "WTH FHIR-IoT-MedTech", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "AuthorizeGetToken", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "postman.setEnvironmentVariable(\"bearerToken\", jsonData.access_token);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "noauth" + }, + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "grant_type", + "value": "client_credentials", + "type": "text" + }, + { + "key": "client_Id", + "value": "{{clientId}}", + "type": "text" + }, + { + "key": "client_secret", + "value": "{{clientSecret}}", + "type": "text" + }, + { + "key": "resource", + "value": "{{resource}}", + "type": "text" + } + ] + }, + "url": { + "raw": "https://login.microsoftonline.com/{{adtenantId}}/oauth2/token", + "protocol": "https", + "host": [ + "login", + "microsoftonline", + "com" + ], + "path": [ + "{{adtenantId}}", + "oauth2", + "token" + ] + } + }, + "response": [] + }, + { + "name": "AuthorizeGetToken SetBearer", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "postman.setEnvironmentVariable(\"bearerToken\", jsonData.access_token);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "noauth" + }, + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "grant_type", + "value": "client_credentials", + "type": "text" + }, + { + "key": "client_Id", + "value": "{{clientId}}", + "type": "text" + }, + { + "key": "client_secret", + "value": "{{clientSecret}}", + "type": "text" + }, + { + "key": "resource", + "value": "{{resource}}", + "type": "text" + } + ] + }, + "url": { + "raw": "https://login.microsoftonline.com/{{adtenantId}}/oauth2/token", + "protocol": "https", + "host": [ + "login", + "microsoftonline", + "com" + ], + "path": [ + "{{adtenantId}}", + "oauth2", + "token" + ] + } + }, + "response": [] + }, + { + "name": "Send message to devicedata", + "protocolProfileBehavior": { + "disabledSystemHeaders": {} + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "accessToken", + "value": "{{bearerToken}}", + "type": "string" + }, + { + "key": "tokenType", + "value": "Bearer", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "\r\n============ VITALS =============\r\n{\r\n \"type\": \"VITALS\",\r\n \"data\": [{\"patient_id\": \"PatientMary\",\r\n \"device_id\": \"MSFT00001\",\r\n \"utctimestamp\": \"2020-10-22T01:34:56+00:00\",\r\n \"spo2\": 96, //Spo2 - Pulse Ox\r\n \"hr\": 80, //Heart Rate\r\n \"bloodperfusion\": 1.1399999856948853,\r\n \"steps\": 3, //Steps per second\r\n \"bpw\": 2.4800000190734863, //Blood Pulse wave\r\n \"rrate\": 20, //Respiration Rate\r\n \"bodytemp\": 33, //Skin Temp in C\r\n }]\r\n}\r\n \r\n========== BP =============\r\n{\r\n \"type\": \"BP\",\r\n \"data\": [\r\n {\r\n \"patient_id\": \"PatientMary\",\r\n \"device_id\": \"MSFT00002BP\",\r\n \"sys\": \"185\",\r\n \"dia\": \"100\",\r\n \"utctimestamp\": \"2020-11-04T08:09:02+00:00\"\r\n }\r\n ]\r\n}\r\n \r\n=========== WEIGHT =========\r\n{\r\n \"type\": \"WEIGHT\",\r\n \"data\": [\r\n {\r\n \"patient_id\": \"PatientMary\",\r\n \"device_id\": \"MSFT00003WT\",\r\n \"weight\": \"150\",\r\n \"unit\": \"kg\",\r\n \"utctimestamp\": \"2020-11-04T10:21:28+00:00\"\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{eventhubnamespaceurl}}", + "host": [ + "{{eventhubnamespaceurl}}" + ] + } + }, + "response": [] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ] +} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_environment.json b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_environment.json new file mode 100644 index 0000000000..a21cfeb3e9 --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech.postman_environment.json @@ -0,0 +1,44 @@ +{ + "id": "29966630-2ef9-4778-bfec-0044b998add7", + "name": "WTH FHIR-IoT-MedTech", + "values": [ + { + "key": "adtenantId", + "value": "", + "enabled": true + }, + { + "key": "clientId", + "value": "", + "enabled": true + }, + { + "key": "clientSecret", + "value": "", + "enabled": true + }, + { + "key": "bearerToken", + "value": "", + "enabled": true + }, + { + "key": "fhirurl", + "value": "", + "enabled": true + }, + { + "key": "resource", + "value": "", + "enabled": true + }, + { + "key": "containerName", + "value": "", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2022-09-13T13:05:38.276Z", + "_postman_exported_using": "Postman/7.36.5" +} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech_event hub namespace.postman_environment.json b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech_event hub namespace.postman_environment.json new file mode 100644 index 0000000000..c345fccfce --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.IoT-MedTech_event hub namespace.postman_environment.json @@ -0,0 +1,39 @@ +{ + "id": "73fb5817-a689-4491-ba3c-e140f8ab7014", + "name": "WTH FHIR-IoT-MedTech_event hub namespace", + "values": [ + { + "key": "adtenantId", + "value": "", + "enabled": true + }, + { + "key": "clientId", + "value": "", + "enabled": true + }, + { + "key": "clientSecret", + "value": "", + "enabled": true + }, + { + "key": "bearerToken", + "value": "", + "enabled": true + }, + { + "key": "resource", + "value": "https://eventhubs.azure.net", + "enabled": true + }, + { + "key": "eventhubnamespaceurl", + "value": "", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2022-09-13T13:37:17.831Z", + "_postman_exported_using": "Postman/7.36.5" +} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.dicom-service.postman_environment.json b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.dicom-service.postman_environment.json new file mode 100644 index 0000000000..94f20d7780 --- /dev/null +++ b/027-FHIRPoweredHealthcare/Student/Resources/Postman/WTHFHIR.dicom-service.postman_environment.json @@ -0,0 +1,45 @@ +{ + "id": "ba3c7f20-8583-45d0-89ce-3f87a0c3e197", + "name": "WTH FHIR-dicom-service", + "values": [ + { + "key": "tenantId", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "clientId", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "clientSecret", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "bearerToken", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "resource", + "value": "", + "type": "default", + "enabled": true + }, + { + "key": "baseUrl", + "value": "", + "type": "default", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2022-06-09T12:27:12.909Z", + "_postman_exported_using": "Postman/9.20.3" +} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-converter/deploy/default-azuredeploy.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-converter/deploy/default-azuredeploy.json deleted file mode 100644 index 775377066e..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-converter/deploy/default-azuredeploy.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "serviceName": { - "type": "string", - "defaultValue": "[concat('FhirConverter-', utcNow())]", - "metadata": { - "description": "Name of the FHIR Converter Web App." - } - }, - "apiKey": { - "type": "secureString", - "defaultValue": "[newGuid()]", - "metadata": { - "description": "API key to access the app." - } - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3" - ], - "defaultValue": "B2" - }, - "imageTag": { - "type": "string", - "allowedValues": [ - "v1.0.0", - "v2.0.0" - ], - "defaultValue": "v2.0.0" - } - }, - "variables": { - "lowerCaseServiceName": "[toLower(parameters('serviceName'))]", - "registryName": "healthplatformregistry.azurecr.io", - "resourcesLocation": "[resourceGroup().location]", - "serverfarmName": "[concat(variables('lowerCaseServiceName'), '-plan')]", - "appInsightName": "[concat(variables('lowerCaseServiceName'), '-appinsight')]", - "tagValue": "FhirConverter" - }, - "resources": [ - { - "type": "microsoft.insights/components", - "apiVersion": "2015-05-01", - "name": "[variables('appInsightName')]", - "location": "[variables('resourcesLocation')]", - "kind": "web", - "properties": { - "Application_Type": "web" - }, - "tags": { - "[variables('tagValue')]": "[variables('tagValue')]" - } - }, - { - "apiVersion": "2018-02-01", - "name": "[variables('serverfarmName')]", - "type": "Microsoft.Web/serverfarms", - "location": "[variables('resourcesLocation')]", - "kind": "linux", - "tags": { - "[variables('tagValue')]": "[variables('tagValue')]" - }, - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "reserved": true - } - }, - { - "type": "Microsoft.Web/sites", - "apiVersion": "2018-11-01", - "name": "[variables('lowerCaseServiceName')]", - "location": "[variables('resourcesLocation')]", - "tags": { - "[variables('tagValue')]": "[variables('tagValue')]" - }, - "dependsOn": [ - "[concat('Microsoft.Web/serverfarms/', variables('serverfarmName'))]", - "[resourceId('Microsoft.Insights/components', variables('appInsightName'))]" - ], - "properties": { - "name": "[variables('lowerCaseServiceName')]", - "siteConfig": { - "appSettings": [ - { - "name": "CONVERSION_API_KEYS", - "value": "[parameters('apiKey')]" - }, - { - "name": "APPINSIGHTS_INSTRUMENTATIONKEY", - "value": "[reference(resourceId('Microsoft.Insights/components', variables('appInsightName')), '2014-04-01').InstrumentationKey]" - }, - { - "name": "DOCKER_REGISTRY_SERVER_URL", - "value": "[concat('https://', variables('registryName'))]" - }, - { - "name": "DOCKER_REGISTRY_SERVER_USERNAME", - "value": "" - }, - { - "name": "DOCKER_REGISTRY_SERVER_PASSWORD", - "value": "" - }, - { - "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", - "value": "true" - } - ], - "linuxFxVersion": "[concat('DOCKER|', variables('registryName'), '/fhirconverter:', parameters('imageTag'))]", - "appCommandLine": "./deploy/webapp.sh", - "alwaysOn": true - }, - "serverFarmId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourcegroups/', resourceGroup().name, '/providers/Microsoft.Web/serverfarms/', variables('serverfarmName'))]", - "clientAffinityEnabled": false, - "httpsOnly": true - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/grow-chart-app/Dockerfile b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/grow-chart-app/Dockerfile deleted file mode 100644 index bc96fe6c85..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/grow-chart-app/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM node:10 - -RUN git clone https://github.com/smart-on-fhir/growth-chart-app - -WORKDIR /growth-chart-app - -RUN npm install - -COPY startup.sh . -RUN ["chmod", "+x", "startup.sh"] - -EXPOSE 9000 - -CMD ["/bin/bash", "startup.sh"] \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/grow-chart-app/startup.sh b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/grow-chart-app/startup.sh deleted file mode 100644 index 9c7b3a31af..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/grow-chart-app/startup.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sed -i "s/growth_chart/${CLIENT_ID}/" launch.html -npm start \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/medications-app/Dockerfile b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/medications-app/Dockerfile deleted file mode 100644 index 73d14e514c..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/medications-app/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM node:10 - -RUN git clone https://github.com/smart-on-fhir/sample-apps-stu3 - -WORKDIR /sample-apps-stu3/medications - -RUN npm install - -COPY startup.sh . -RUN ["chmod", "+x", "startup.sh"] - -EXPOSE 9090 - -CMD ["/bin/bash", "startup.sh"] \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/medications-app/startup.sh b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/medications-app/startup.sh deleted file mode 100644 index 986f6216c2..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/docker/medications-app/startup.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sed -i "s/my_web_app/${CLIENT_ID}/" launch.html -npm start \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Create-FhirServerSamplesAuthConfig.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Create-FhirServerSamplesAuthConfig.ps1 deleted file mode 100644 index 8fdecaed56..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Create-FhirServerSamplesAuthConfig.ps1 +++ /dev/null @@ -1,264 +0,0 @@ -<# -.SYNOPSIS -Adds the required application registrations and user profiles to an AAD tenant -.DESCRIPTION -#> -param -( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [ValidateLength(5,12)] - [ValidateScript({ - Write-Host $_ - if ("$_" -Like "* *") { - throw "Environment name cannot contain whitespace" - return $false - } - else { - return $true - } - })] - [string]$EnvironmentName, - - [Parameter(Mandatory = $false)] - [string]$EnvironmentLocation = "West US", - - [Parameter(Mandatory = $false )] - [String]$WebAppSuffix = "azurewebsites.net", - - [Parameter(Mandatory = $false)] - [string]$ResourceGroupName = $EnvironmentName, - - [parameter(Mandatory = $false)] - [string]$KeyVaultName = "$EnvironmentName-ts", - - [Parameter(Mandatory = $false)] - [bool]$UsePaaS = $true, - - [parameter(Mandatory = $false)] - [SecureString]$AdminPassword -) - -Set-StrictMode -Version Latest - -# Get current AzureAd context -try { - $tenantInfo = Get-AzureADCurrentSessionInfo -ErrorAction Stop -} -catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" -} - -# Get current Az context -try { - $azContext = Get-AzContext -} -catch { - throw "Please log in to Azure RM with Login-AzAccount cmdlet before proceeding" -} - -# Ensure that we have the FhirServer PS Module loaded -if (Get-Module -Name FhirServer) { - Write-Host "FhirServer PS module is loaded" -} else { - Write-Host "Cloning FHIR Server repo to get access to FhirServer PS module." - if (!(Test-Path -Path ".\fhir-server")) { - git clone --quiet https://github.com/Microsoft/fhir-server | Out-Null - } - Import-Module .\fhir-server\samples\scripts\PowerShell\FhirServer\FhirServer.psd1 -} - -$keyVault = Get-AzKeyVault -VaultName $KeyVaultName - -if (!$keyVault) { - Write-Host "Creating keyvault with the name $KeyVaultName" - $resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue - if (!$resourceGroup) { - New-AzResourceGroup -Name $ResourceGroupName -Location $EnvironmentLocation | Out-Null - } - New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -Location $EnvironmentLocation | Out-Null -} - -if ($azContext.Account.Type -eq "User") { - Write-Host "Current context is user: $($azContext.Account.Id)" - - $currentUser = Get-AzADUser -UserPrincipalName $azContext.Account.Id - - if (!$currentUser) { - # For some reason $azContext.Account.Id will sometimes be the email of the user instead of the UPN, we need the UPN - # Selecting the same subscription with the same tenant (twice), brings us back to the UPN - Select-AzSubscription -SubscriptionId $azContext.Subscription.Id -TenantId $azContext.Tenant.Id | Out-Null - Select-AzSubscription -SubscriptionId $azContext.Subscription.Id -TenantId $azContext.Tenant.Id | Out-Null - $azContext = Get-AzContext - Write-Host "Current context is user: $($azContext.Account.Id)" - $currentUser = Get-AzADUser -UserPrincipalName $azContext.Account.Id - } - - #If this is guest account, we will try a search instead - if (!$currentUser) { - # External user accounts have UserPrincipalNames of the form: - # myuser_outlook.com#EXT#@mytenant.onmicrosoft.com for a user with username myuser@outlook.com - $tmpUserName = $azContext.Account.Id.Replace("@", "_") - $currentUser = Get-AzureADUser -Filter "startswith(UserPrincipalName, '${tmpUserName}')" - $currentObjectId = $currentUser.ObjectId - } else { - $currentObjectId = $currentUser.Id - } - - if (!$currentObjectId) { - throw "Failed to find objectId for signed in user" - } -} -elseif ($azContext.Account.Type -eq "ServicePrincipal") { - Write-Host "Current context is service principal: $($azContext.Account.Id)" - $currentObjectId = (Get-AzADServicePrincipal -ServicePrincipalName $azContext.Account.Id).Id -} -else { - Write-Host "Current context is account of type '$($azContext.Account.Type)' with id of '$($azContext.Account.Id)" - throw "Running as an unsupported account type. Please use either a 'User' or 'Service Principal' to run this command" -} - -if ($currentObjectId) { - Write-Host "Adding permission to keyvault for $currentObjectId" - Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ObjectId $currentObjectId -PermissionsToSecrets Get, Set, List -} - -Write-Host "Ensuring API application exists" - -$fhirServiceName = "${EnvironmentName}srvr" -if ($UsePaas) { - $fhirServiceUrl = "https://${EnvironmentName}.azurehealthcareapis.com" -} else { - $fhirServiceUrl = "https://${fhirServiceName}.${WebAppSuffix}" -} - -$application = Get-AzureAdApplication -Filter "identifierUris/any(uri:uri eq '$fhirServiceUrl')" - -if (!$application) { - $newApplication = New-FhirServerApiApplicationRegistration -FhirServiceAudience $fhirServiceUrl -AppRoles "globalAdmin" - - # Change to use applicationId returned - $application = Get-AzureAdApplication -Filter "identifierUris/any(uri:uri eq '$fhirServiceUrl')" -} - -$UserNamePrefix = "${EnvironmentName}-" -$userId = "${UserNamePrefix}admin" -$domain = $tenantInfo.TenantDomain -$userUpn = "${userId}@${domain}" - -# See if the user exists -Write-Host "Checking if UserPrincipalName exists" -$aadUser = Get-AzureADUser -Filter "userPrincipalName eq '$userUpn'" -if ($aadUser) -{ - Write-Host "User found, will update." -} -else -{ - Write-Host "User not, will create." -} - - -if ($AdminPassword) -{ - $passwordSecureString = $AdminPassword - $password = (New-Object PSCredential "user",$passwordSecureString).GetNetworkCredential().Password -} -else -{ - Add-Type -AssemblyName System.Web - $password = [System.Web.Security.Membership]::GeneratePassword(16, 5) - $passwordSecureString = ConvertTo-SecureString $password -AsPlainText -Force -} - -if ($aadUser) { - Set-AzureADUserPassword -ObjectId $aadUser.ObjectId -Password $passwordSecureString -EnforceChangePasswordPolicy $false -ForceChangePasswordNextLogin $false -} -else { - $PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile - $PasswordProfile.Password = $password - $PasswordProfile.EnforceChangePasswordPolicy = $false - $PasswordProfile.ForceChangePasswordNextLogin = $false - - $aadUser = New-AzureADUser -DisplayName $userId -PasswordProfile $PasswordProfile -UserPrincipalName $userUpn -AccountEnabled $true -MailNickName $userId -} - -$upnSecureString = ConvertTo-SecureString $userUpn -AsPlainText -Force -Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name "$userId-upn" -SecretValue $upnSecureString | Out-Null -Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name "$userId-password" -SecretValue $passwordSecureString | Out-Null -Set-FhirServerUserAppRoleAssignments -ApiAppId $application.AppId -UserPrincipalName $userUpn -AppRoles "globalAdmin" - -$dashboardJSName = "${EnvironmentName}dash" -$dashboardJSUrl = "https://${dashboardJSName}.${WebAppSuffix}" -$dashboardJSReplyUrl = "${dashboardJSUrl}/.auth/login/aad/callback" -$growthChartName = "${EnvironmentName}growth" -$growthChartUrl = "https://${growthChartName}.${WebAppSuffix}" -$medicationsName = "${EnvironmentName}meds" -$medicationsUrl = "https://${medicationsName}.${WebAppSuffix}" - -$confidentialClientAppName = "${EnvironmentName}-confidential-client" -$confidentialClient = Get-AzureAdApplication -Filter "DisplayName eq '$confidentialClientAppName'" -if (!$confidentialClient) { - $confidentialClient = New-FhirServerClientApplicationRegistration -ApiAppId $application.AppId -DisplayName $confidentialClientAppName -ReplyUrl $dashboardJSReplyUrl - - $appId = $confidentialClient.AppId - $appReg = Get-AzureADApplication -Filter "AppId eq '$appId'" - if (!$appReg) { - Write-Host "Application with AppId = $AppId was not found." - return - } - - $origReplyUrls = $appReg.ReplyUrls - - # Add Reply URL if not already in the list - if ($origReplyUrls -NotContains $dashboardJSReplyUrl) { - $origReplyUrls.Add($dashboardJSReplyUrl) - Set-AzureADApplication -ObjectId $appReg.ObjectId -ReplyUrls $origReplyUrls - } - - $secretSecureString = ConvertTo-SecureString $confidentialClient.AppSecret -AsPlainText -Force -} else { - $existingPassword = Get-AzureADApplicationPasswordCredential -ObjectId $confidentialClient.ObjectId | Remove-AzureADApplicationPasswordCredential -ObjectId $confidentialClient.ObjectId - $newPassword = New-AzureADApplicationPasswordCredential -ObjectId $confidentialClient.ObjectId - $secretSecureString = ConvertTo-SecureString $newPassword.Value -AsPlainText -Force -} -$secretConfidentialClientId = ConvertTo-SecureString $confidentialClient.AppId -AsPlainText -Force -Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name "$confidentialClientAppName-id" -SecretValue $secretConfidentialClientId| Out-Null -Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name "$confidentialClientAppName-secret" -SecretValue $secretSecureString | Out-Null - -# Create service client -$serviceClientAppName = "${EnvironmentName}-service-client" -$serviceClient = Get-AzureAdApplication -Filter "DisplayName eq '$serviceClientAppName'" -if (!$serviceClient) { - $serviceClient = New-FhirServerClientApplicationRegistration -ApiAppId $application.AppId -DisplayName $serviceClientAppName - $secretSecureString = ConvertTo-SecureString $serviceClient.AppSecret -AsPlainText -Force -} else { - $existingPassword = Get-AzureADApplicationPasswordCredential -ObjectId $serviceClient.ObjectId | Remove-AzureADApplicationPasswordCredential -ObjectId $serviceClient.ObjectId - $newPassword = New-AzureADApplicationPasswordCredential -ObjectId $serviceClient.ObjectId - $secretSecureString = ConvertTo-SecureString $newPassword.Value -AsPlainText -Force -} - -Set-FhirServerClientAppRoleAssignments -AppId $serviceClient.AppId -ApiAppId $application.AppId -AppRoles "globalAdmin" - -$secretServiceClientId = ConvertTo-SecureString $serviceClient.AppId -AsPlainText -Force -Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name "$serviceClientAppName-id" -SecretValue $secretServiceClientId| Out-Null -Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name "$serviceClientAppName-secret" -SecretValue $secretSecureString | Out-Null - - -# Create public (SMART on FHIR) client -$publicClientAppName = "${EnvironmentName}-public-client" -$publicClient = Get-AzureAdApplication -Filter "DisplayName eq '$publicClientAppName'" -if (!$publicClient) { - $publicClient = New-FhirServerClientApplicationRegistration -ApiAppId $application.AppId -DisplayName $publicClientAppName -PublicClient:$true - $secretPublicClientId = ConvertTo-SecureString $publicClient.AppId -AsPlainText -Force - Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name "$publicClientAppName-id" -SecretValue $secretPublicClientId| Out-Null -} - -Set-FhirServerClientAppRoleAssignments -AppId $publicClient.AppId -ApiAppId $application.AppId -AppRoles "globalAdmin" -New-FhirServerSmartClientReplyUrl -AppId $publicClient.AppId -FhirServerUrl $fhirServiceUrl -ReplyUrl $growthChartUrl -New-FhirServerSmartClientReplyUrl -AppId $publicClient.AppId -FhirServerUrl $fhirServiceUrl -ReplyUrl "${growthChartUrl}/" -New-FhirServerSmartClientReplyUrl -AppId $publicClient.AppId -FhirServerUrl $fhirServiceUrl -ReplyUrl "${growthChartUrl}/index.html" -New-FhirServerSmartClientReplyUrl -AppId $publicClient.AppId -FhirServerUrl $fhirServiceUrl -ReplyUrl $medicationsUrl -New-FhirServerSmartClientReplyUrl -AppId $publicClient.AppId -FhirServerUrl $fhirServiceUrl -ReplyUrl "${medicationsUrl}/" -New-FhirServerSmartClientReplyUrl -AppId $publicClient.AppId -FhirServerUrl $fhirServiceUrl -ReplyUrl "${medicationsUrl}/index.html" - diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Create-FhirServerSamplesEnvironment.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Create-FhirServerSamplesEnvironment.ps1 deleted file mode 100644 index 78a315f07b..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Create-FhirServerSamplesEnvironment.ps1 +++ /dev/null @@ -1,199 +0,0 @@ -<# -.SYNOPSIS -Creates a new FHIR Server Samples environment. -.DESCRIPTION -#> -param -( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [ValidateLength(5,12)] - [ValidateScript({ - if ("$_" -Like "* *") { - throw "Environment name cannot contain whitespace" - return $false - } - else { - return $true - } - })] - [string]$EnvironmentName, - - [Parameter(Mandatory = $false)] - [string]$EnvironmentLocation = "westus", - - [Parameter(Mandatory = $false)] - [string]$FhirApiLocation = "westus2", - - [Parameter(Mandatory = $false)] - [string]$SourceRepository = "https://github.com/Microsoft/fhir-server-samples", - - [Parameter(Mandatory = $false)] - [string]$SourceRevision = "master", - - [Parameter(Mandatory = $false)] - [bool]$DeploySource = $true, - - [Parameter(Mandatory = $false)] - [bool]$UsePaaS = $true, - - [Parameter(Mandatory = $false)] - [ValidateSet('cosmos','sql')] - [string]$PersistenceProvider = "cosmos", - - [Parameter(Mandatory = $false)] - [ValidateSet('Stu3','R4')] - [string]$FhirVersion = "R4", - - [Parameter(Mandatory = $false)] - [SecureString]$SqlAdminPassword, - - [Parameter(Mandatory = $false)] - [bool]$EnableExport = $false, - - [parameter(Mandatory = $false)] - [SecureString]$AdminPassword - -) - -Set-StrictMode -Version Latest - -# Some additional parameter validation -if (($PersistenceProvider -eq "sql") -and ([string]::IsNullOrEmpty($SqlAdminPassword))) -{ - throw 'For SQL persistence provider you must provide -SqlAdminPassword parameter' -} - -if ($UsePaaS -and ($PersistenceProvider -ne "cosmos")) -{ - throw 'SQL Server is only supported in OSS. Set -UsePaaS $false when using SQL' -} - - -# Get current AzureAd context -try { - $tenantInfo = Get-AzureADCurrentSessionInfo -ErrorAction Stop -} -catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" -} - -# Get current Az context -try { - $azContext = Get-AzContext -} -catch { - throw "Please log in to Azure RM with Login-AzAccount cmdlet before proceeding" -} - -if ($azContext.Account.Type -eq "User") { - Write-Host "Current context is user: $($azContext.Account.Id)" - $currentUser = Get-AzADUser -UserPrincipalName $azContext.Account.Id - - if (!$currentUser) { - # For some reason $azContext.Account.Id will sometimes be the email of the user instead of the UPN, we need the UPN - # Selecting the same subscription with the same tenant (twice), brings us back to the UPN - Select-AzSubscription -SubscriptionId $azContext.Subscription.Id -TenantId $azContext.Tenant.Id | Out-Null - Select-AzSubscription -SubscriptionId $azContext.Subscription.Id -TenantId $azContext.Tenant.Id | Out-Null - $azContext = Get-AzContext - Write-Host "Current context is user: $($azContext.Account.Id)" - $currentUser = Get-AzADUser -UserPrincipalName $azContext.Account.Id - } - - #If this is guest account, we will try a search instead - if (!$currentUser) { - # External user accounts have UserPrincipalNames of the form: - # myuser_outlook.com#EXT#@mytenant.onmicrosoft.com for a user with username myuser@outlook.com - $tmpUserName = $azContext.Account.Id.Replace("@", "_") - $currentUser = Get-AzureADUser -Filter "startswith(UserPrincipalName, '${tmpUserName}')" - $currentObjectId = $currentUser.ObjectId - } else { - $currentObjectId = $currentUser.Id - } - - if (!$currentObjectId) { - throw "Failed to find objectId for signed in user" - } -} -elseif ($azContext.Account.Type -eq "ServicePrincipal") { - Write-Host "Current context is service principal: $($azContext.Account.Id)" - $currentObjectId = (Get-AzADServicePrincipal -ServicePrincipalName $azContext.Account.Id).Id -} -else { - Write-Host "Current context is account of type '$($azContext.Account.Type)' with id of '$($azContext.Account.Id)" - throw "Running as an unsupported account type. Please use either a 'User' or 'Service Principal' to run this command" -} - - -# Set up Auth Configuration and Resource Group -./Create-FhirServerSamplesAuthConfig.ps1 -EnvironmentName $EnvironmentName -EnvironmentLocation $EnvironmentLocation -AdminPassword $AdminPassword -UsePaaS $UsePaaS - -#Template URLs -$fhirServerTemplateUrl = "https://raw.githubusercontent.com/microsoft/fhir-server/master/samples/templates/default-azuredeploy.json" -if ($PersistenceProvider -eq 'sql') -{ - $fhirServerTemplateUrl = "https://raw.githubusercontent.com/microsoft/fhir-server/master/samples/templates/default-azuredeploy-sql.json" -} - -$githubRawBaseUrl = $SourceRepository.Replace("github.com","raw.githubusercontent.com").TrimEnd('/') -$sandboxTemplate = "${githubRawBaseUrl}/${SourceRevision}/deploy/templates/azuredeploy-sandbox.json" -$dashboardJSTemplate = "${githubRawBaseUrl}/${SourceRevision}/deploy/templates/azuredeploy-fhirdashboard-js.json" -$importerTemplate = "${githubRawBaseUrl}/${SourceRevision}/deploy/templates/azuredeploy-importer.json" - -$tenantDomain = $tenantInfo.TenantDomain -$aadAuthority = "https://login.microsoftonline.com/${tenantDomain}" - -$dashboardJSUrl = "https://${EnvironmentName}dash.azurewebsites.net" - -if ($UsePaaS) { - $fhirServerUrl = "https://${EnvironmentName}.azurehealthcareapis.com" -} else { - $fhirServerUrl = "https://${EnvironmentName}srvr.azurewebsites.net" -} - -$confidentialClientId = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-confidential-client-id").SecretValueText -$confidentialClientSecret = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-confidential-client-secret").SecretValueText -$serviceClientId = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-service-client-id").SecretValueText -$serviceClientSecret = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-service-client-secret").SecretValueText -$serviceClientObjectId = (Get-AzureADServicePrincipal -Filter "AppId eq '$serviceClientId'").ObjectId -$dashboardUserUpn = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-admin-upn").SecretValueText -$dashboardUserOid = (Get-AzureADUser -Filter "UserPrincipalName eq '$dashboardUserUpn'").ObjectId -$dashboardUserPassword = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-admin-password").SecretValueText -$publicClientId = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-public-client-id").SecretValueText - -$accessPolicies = @() -$accessPolicies += @{ "objectId" = $currentObjectId.ToString() } -$accessPolicies += @{ "objectId" = $serviceClientObjectId.ToString() } -$accessPolicies += @{ "objectId" = $dashboardUserOid.ToString() } - -#We need to pass "something" as SQL server password even when it is not used: -if ([string]::IsNullOrEmpty($SqlAdminPassword)) -{ - $SqlAdminPassword = ConvertTo-SecureString -AsPlainText -Force "DummySQLServerPasswordNotUsed" -} - -$resourceGroup = Get-AzResourceGroup -Name $EnvironmentName -ErrorAction SilentlyContinue -if (!$resourceGroup) { - New-AzResourceGroup -Name $EnvironmentName -Location $EnvironmentLocation | Out-Null -} - -# Making a separate resource group for SMART on FHIR apps, since Linux Container apps cannot live in a resource group with windows apps -$sofResourceGroup = Get-AzResourceGroup -Name "${EnvironmentName}-sof" -ErrorAction SilentlyContinue -if (!$sofResourceGroup) { - New-AzResourceGroup -Name "${EnvironmentName}-sof" -Location $EnvironmentLocation | Out-Null -} - -# Deploy the template -New-AzResourceGroupDeployment -TemplateUri $sandboxTemplate -environmentName $EnvironmentName -fhirApiLocation $FhirApiLocation -ResourceGroupName $EnvironmentName -fhirServerTemplateUrl $fhirServerTemplateUrl -fhirVersion $FhirVersion -sqlAdminPassword $SqlAdminPassword -aadAuthority $aadAuthority -aadDashboardClientId $confidentialClientId -aadDashboardClientSecret $confidentialClientSecret -aadServiceClientId $serviceClientId -aadServiceClientSecret $serviceClientSecret -smartAppClientId $publicClientId -fhirDashboardJSTemplateUrl $dashboardJSTemplate -fhirImporterTemplateUrl $importerTemplate -fhirDashboardRepositoryUrl $SourceRepository -fhirDashboardRepositoryBranch $SourceRevision -deployDashboardSourceCode $DeploySource -usePaaS $UsePaaS -accessPolicies $accessPolicies -enableExport $EnableExport - -Write-Host "Warming up site..." -Invoke-WebRequest -Uri "${fhirServerUrl}/metadata" | Out-Null -$functionAppUrl = "https://${EnvironmentName}imp.azurewebsites.net" -Invoke-WebRequest -Uri $functionAppUrl | Out-Null - -@{ - dashboardUrl = $dashboardJSUrl - fhirServerUrl = $fhirServerUrl - dashboardUserUpn = $dashboardUserUpn - dashboardUserPassword = $dashboardUserPassword -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Delete-FhirServerSamplesAuthConfig.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Delete-FhirServerSamplesAuthConfig.ps1 deleted file mode 100644 index 1fb14a1e28..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Delete-FhirServerSamplesAuthConfig.ps1 +++ /dev/null @@ -1,88 +0,0 @@ -<# -.SYNOPSIS -Deletes application registrations and user profiles from an AAD tenant -.DESCRIPTION -#> -param -( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$EnvironmentName, - - [Parameter(Mandatory = $false)] - [string]$EnvironmentLocation = "westus", - - [Parameter(Mandatory = $false )] - [String]$WebAppSuffix = "azurewebsites.net", - - [Parameter(Mandatory = $false)] - [string]$ResourceGroupName = $EnvironmentName, - - [parameter(Mandatory = $false)] - [string]$KeyVaultName = "$EnvironmentName-ts" -) - -Set-StrictMode -Version Latest - -# Get current AzureAd context -try { - $tenantInfo = Get-AzureADCurrentSessionInfo -ErrorAction Stop -} -catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" -} - -# Ensure that we have the FhirServer PS Module loaded -if (Get-Module -Name FhirServer) { - Write-Host "FhirServer PS module is loaded" -} else { - Write-Host "Cloning FHIR Server repo to get access to FhirServer PS module." - if (!(Test-Path -Path ".\fhir-server")) { - git clone --quiet https://github.com/Microsoft/fhir-server | Out-Null - } - Import-Module .\fhir-server\samples\scripts\PowerShell\FhirServer\FhirServer.psd1 -} - -$fhirServiceName = "${EnvironmentName}srvr" -$fhirServiceUrl = "https://${fhirServiceName}.${WebAppSuffix}" -$PaasUrl = "https://${EnvironmentName}.azurehealthcareapis.com" - -$application = Get-AzureAdApplication -Filter "identifierUris/any(uri:uri eq '$PaasUrl')" - -if ($application) { - Remove-FhirServerApplicationRegistration -AppId $application.AppId -} - -$application = Get-AzureAdApplication -Filter "identifierUris/any(uri:uri eq '$fhirServiceUrl')" -if ($application) { - Remove-FhirServerApplicationRegistration -AppId $application.AppId -} - - -$UserNamePrefix = "${EnvironmentName}-" -$userId = "${UserNamePrefix}admin" -$domain = $tenantInfo.TenantDomain -$userUpn = "${userId}@${domain}" - -$aadUser = Get-AzureADUser -Filter "userPrincipalName eq '$userUpn'" -if ($aadUser) { - Remove-AzureADUser -ObjectId $aadUser.ObjectId -} - -$confidentialClientAppName = "${EnvironmentName}-confidential-client" -$confidentialClient = Get-AzureAdApplication -Filter "DisplayName eq '$confidentialClientAppName'" -if ($confidentialClient) { - Remove-FhirServerApplicationRegistration -AppId $confidentialClient.AppId -} - -$serviceClientAppName = "${EnvironmentName}-service-client" -$serviceClient = Get-AzureAdApplication -Filter "DisplayName eq '$serviceClientAppName'" -if ($confidentialClient) { - Remove-FhirServerApplicationRegistration -AppId $serviceClient.AppId -} - -$publicClientAppName = "${EnvironmentName}-public-client" -$publicClient = Get-AzureAdApplication -Filter "DisplayName eq '$publicClientAppName'" -if ($publicClient) { - Remove-FhirServerApplicationRegistration -AppId $publicClient.AppId -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Delete-FhirServerSamplesEnvironment.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Delete-FhirServerSamplesEnvironment.ps1 deleted file mode 100644 index 57482c7383..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Delete-FhirServerSamplesEnvironment.ps1 +++ /dev/null @@ -1,36 +0,0 @@ -<# -.SYNOPSIS -Removes a FHIR Server Samples environment -.DESCRIPTION -#> -param -( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$EnvironmentName -) - -Set-StrictMode -Version Latest - -# Get current AzureAd context -try { - $tenantInfo = Get-AzureADCurrentSessionInfo -ErrorAction Stop -} -catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" -} - -# Get current Az context -try { - $azContext = Get-AzContext -} -catch { - throw "Please log in to Azure RM with Login-AzAccount cmdlet before proceeding" -} - -# Set up Auth Configuration and Resource Group -./Delete-FhirServerSamplesAuthConfig.ps1 -EnvironmentName $EnvironmentName - -# Wipe out the environment -Get-AzResourceGroup -Name "${EnvironmentName}-sof" | Remove-AzResourceGroup -Verbose -Force -Get-AzResourceGroup -Name $EnvironmentName | Remove-AzResourceGroup -Verbose -Force diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Set-TestEnvironmentVariables.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Set-TestEnvironmentVariables.ps1 deleted file mode 100644 index b8a00435af..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/Set-TestEnvironmentVariables.ps1 +++ /dev/null @@ -1,79 +0,0 @@ -<# -.SYNOPSIS -Sets environment variables for E2E integration tests -.DESCRIPTION -#> -param -( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$EnvironmentName, - - [Parameter(Mandatory = $false)] - [bool]$SetUserSecrets = $false -) - -Set-StrictMode -Version Latest - -# Get current Az context -try { - $azContext = Get-AzContext -} -catch { - throw "Please log in to Azure RM with Login-AzAccount cmdlet before proceeding" -} - -$dashboardUrl = "https://${EnvironmentName}dash.azurewebsites.net" -$growthChartAppLaunchUrl = "https://${EnvironmentName}growth.azurewebsites.net/launch.html" -$medicationsAppLaunchUrl = "https://${EnvironmentName}meds.azurewebsites.net/launch.html" -$fhirServerUrl = "https://${EnvironmentName}srvr.azurewebsites.net" -$dashboardUserUpn = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-admin-upn").SecretValueText -$dashboardUserPassword = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-admin-password").SecretValueText -$confidentialClientId = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-confidential-client-id").SecretValueText -$confidentialClientSecret = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-confidential-client-secret").SecretValueText -$serviceClientId = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-service-client-id").SecretValueText -$serviceClientSecret = (Get-AzKeyVaultSecret -VaultName "${EnvironmentName}-ts" -Name "${EnvironmentName}-service-client-secret").SecretValueText - -$storageAccountName = ("${EnvironmentName}dashsa").Replace('-',''); -$storageAccountKey = (Get-AzStorageAccountKey -Name $storageAccountName -ResourceGroupName $EnvironmentName)[0].Value -$storageAccountConnectionString = "DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccountKey}" - -$env:StorageAccountConnectionString = $storageAccountConnectionString -$env:FhirServerUrl = $fhirServerUrl -$env:DashboardUrl = $dashboardUrl -$env:DashboardUserUpn = $dashboardUserUpn -$env:DashboardUserPassword = $dashboardUserPassword -$env:ConfidentialClientId = $confidentialClientId -$env:ConfidentialClientSecret = $confidentialClientSecret -$env:ServiceClientId = $serviceClientId -$env:ServiceClientSecret = $serviceClientSecret - -if ($SetUserSecrets) -{ - dotnet user-secrets set "FhirImportService:StorageConnectionString" $storageAccountConnectionString - dotnet user-secrets set "FhirServerUrl" $fhirServerUrl - dotnet user-secrets set "FhirImportService:FhirServerUrl" $fhirServerUrl - dotnet user-secrets set "FhirImportService:ClientSecret" $serviceClientSecret - dotnet user-secrets set "FhirImportService:ClientId" $serviceClientId - dotnet user-secrets set "FhirServerAudience" $fhirServerUrl - dotnet user-secrets set "AzureAd:ClientSecret" $confidentialClientSecret - dotnet user-secrets set "AzureAd:ClientId" $confidentialClientId - dotnet user-secrets set "SmartOnFhirApps:0:DisplayName" "Growth Chart" - dotnet user-secrets set "SmartOnFhirApps:0:LaunchUrl" $growthChartAppLaunchUrl - dotnet user-secrets set "SmartOnFhirApps:1:DisplayName" "Medications" - dotnet user-secrets set "SmartOnFhirApps:1:LaunchUrl" $medicationsAppLaunchUrl -} - -@{ - dashboardUrl = $dashboardUrl - fhirServerUrl = $fhirServerUrl - dashboardUserUpn = $dashboardUserUpn - dashboardUserPassword = $dashboardUserPassword - confidentialClientId = $confidentialClientId - confidentialClientSecret = $confidentialClientSecret - serviceClientId = $serviceClientId - serviceClientSecret = $serviceClientSecret - storageAccountConnectionString = $storageAccountConnectionString -} - - diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Models/SmartLauncherConfig.cs b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Models/SmartLauncherConfig.cs deleted file mode 100644 index 437ba5535e..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Models/SmartLauncherConfig.cs +++ /dev/null @@ -1,16 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -namespace SmartLauncher -{ - public class SmartLauncherConfig - { - public string FhirServerUrl { get; set; } - - public string DefaultSmartAppUrl { get; set; } - - public string ClientId { get; set; } - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Program.cs b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Program.cs deleted file mode 100644 index 6b0379a486..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Program.cs +++ /dev/null @@ -1,22 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; - -namespace SmartLauncher -{ - public class Program - { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/SmartLauncher.csproj b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/SmartLauncher.csproj deleted file mode 100644 index 59aab12971..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/SmartLauncher.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - netcoreapp3.1 - true - SmartLauncher_3d9536f4-982c-4334-83df-890fb8ae70e6 - - - - - - - - - - - - - diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Startup.cs b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Startup.cs deleted file mode 100644 index 565690ce74..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/Startup.cs +++ /dev/null @@ -1,55 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using System.Reflection; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.FileProviders; -using Microsoft.Extensions.Hosting; -using Newtonsoft.Json; - -namespace SmartLauncher -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 - public void ConfigureServices(IServiceCollection services) - { - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseDefaultFiles(); - app.UseStaticFiles(new StaticFileOptions { FileProvider = new EmbeddedFileProvider(Assembly.GetExecutingAssembly(), "SmartLauncher.wwwroot") }); - - app.Map("/config", a => - { - a.Run(async (context) => - { - var config = new SmartLauncherConfig(); - Configuration.Bind(config); - await context.Response.WriteAsync(JsonConvert.SerializeObject(config)); - }); - }); - } - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/appsettings.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/appsettings.json deleted file mode 100644 index 759686134a..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/appsettings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "FhirServerUrl": "https://localhost:44348", - "ClientId": "APP-ID", - "DefaultSmartAppUrl": "/sampleapp/launch.html" -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/index.html b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/index.html deleted file mode 100644 index a9e2a4afe0..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/index.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - Microsoft FHIR Server SMART on FHIR App Launcher - - - -
    -

    Microsoft FHIR Server SMART on FHIR App Launcher

    -
    -

    Launch parameters

    -
    - - - - - - - - - - -
    -
    -
    -

    Launch context

    -
    - -
    -
    - -
    -

    Launch URL

    -
    - - -
    -
    -
    - - - - - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/sampleapp/index.html b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/sampleapp/index.html deleted file mode 100644 index 41f4ed8626..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/sampleapp/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - Sample app - - - - - - - -
    -

    Microsoft FHIR Server SMART on FHIR Sample App

    - -
    -

    Patient Resource

    - -
    - -
    -

    Token Response

    - -
    -
    - - - - - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/sampleapp/launch.html b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/sampleapp/launch.html deleted file mode 100644 index 8a75e7f799..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/apps/SmartLauncher/wwwroot/sampleapp/launch.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - Loading... - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/docker/README.md b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/docker/README.md deleted file mode 100644 index 6964c91f73..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/docker/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Running Azure FHIR Server with Docker - -*IMPORTANT:* This sample has been created to enable Dev/Test scenarios and is not suitable for production scenarios. Passwords are contained in deployment files, the SQL server connection is not encrypted, authentication on the FHIR Server has been disabled, and data is not persisted between container restarts. - -The following instructions detail how to build and run the FHIR Server in Docker on Linux. - -## Use CI image - -If it is not desirable to clone this repository and build locally an image of the most recent CI build is available from the Azure Container Repository HealthPlatformRegistry. Both of the following methods will generate a R4 server, but a STU3 or R5 server can be created by changing which image is pulled. - -Using docker-compose this image can be started with the following steps: -1. Open a terminal window. -2. Set the enviornment variable SAPASSWORD to what you want the SQL access password to be. Be sure to follow the [SQL server password complexity requirements](https://docs.microsoft.com/en-us/sql/relational-databases/security/password-policy?view=sql-server-ver15#password-complexity). -3. Copy & save a local version of the docker-compose file from the release directory of the fhir-server project. -4. Run the command: - -```bash -docker-compose up -d . -``` - -5. After giving the container a minute to start up it should be accessable at http://localhost:8080/metadata. - - -Using just docker this image can be started with the following steps. Replace the `` below with your chosen SQL connection password, following the complexity rules linked above. -1. Open a terminal window. -2. Run the command: - -```bash -docker network create fhir_network -``` - -3. Run the command: - -```bash -docker run --net fhir_network --name fhir_sql -e SA_PASSWORD= -e ACCEPT_EULA="Y" -d mcr.microsoft.com/mssql/server -``` - -4. Give the SQL server a minute to start up. -5. Run the command: - -```bash -docker run --net fhir_network -e FhirServer__Security__Enabled="false" -e SqlServer__ConnectionString="Server=tcp:fhir_sql,1433;Initial Catalog=FHIR;Persist Security Info=False;User ID=sa;Password=;MultipleActiveResultSets=False;Connection Timeout=30;" -e SqlServer__AllowDatabaseCreation="true" -e SqlServer__Initialize="true" -e DataStore="SqlServer" -p 8080:8080 -d healthplatformregistry.azurecr.io/r4_fhir-server azure-fhir-api -``` - -6. After giving the container a minute to start up it should be accessible at http://localhost:8080/metadata. - -## Build and run with SQL Server using Docker Compose - -Another way to get the Azure FHIR Server up and running on Docker is to build and run the Azure FHIR Server with a SQL server container using docker compose. Run the following command, replacing `` with your chosen password (be sure to follow the [SQL server password complexity requirements](https://docs.microsoft.com/en-us/sql/relational-databases/security/password-policy?view=sql-server-ver15#password-complexity)), from the root of the `microsoft/fhir-server` repository: - -```bash -env SAPASSWORD='' docker-compose -f samples/docker/docker-compose.yaml up -d -``` - -Given the FHIR API is likely to start before the SQL server is ready, you may need to restart the API container once the SQL server is healty. This can be done using `docker restart `, i.e. docker restart `docker restart docker_fhir-api_1`. - -Once deployed the FHIR Server metadata endpoint should be avaialble at `http://localhost:8080/metadata/`. - -## Run in Docker with a custom configuration - -To build the `azure-fhir-api` image run the following command from the root of the `microsoft/fhir-server`repository: - -The default configuration builds an image with the FHIR R4 API: - -```bash -docker build -f samples/docker/Dockerfile -t azure-fhir-api . -``` - -For STU3 use the following command: - -```bash -docker build -f samples/docker/Dockerfile -t azure-fhir-api --build-arg FHIR_VERSION=Stu3 . -``` - -The container can then be run, specifying configuration details such as: - -```bash -docker run -d \ - -e FHIRServer__Security__Enabled="false" - -e SqlServer__ConnectionString="Server=tcp:,1433;Initial Catalog=FHIR;Persist Security Info=False;User ID=sa;Password=;MultipleActiveResultSets=False;Connection Timeout=30;" \ - -e SqlServer__AllowDatabaseCreation="true" \ - -e SqlServer__Initialize="true" \ - -e DataStore="SqlServer" \ - -p 8080:8080 - azure-fhir-api azure-fhir-api -``` diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/docker/docker-compose.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/docker/docker-compose.yaml deleted file mode 100644 index 8fb0bfbfb3..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/docker/docker-compose.yaml +++ /dev/null @@ -1,29 +0,0 @@ -version: "3" -services: - fhir-api: - build: - context: ./../../ - dockerfile: ./build/docker/Dockerfile - args: - FHIR_VERSION: R4 - restart: on-failure - environment: - FHIRServer__Security__Enabled: "false" - SqlServer__ConnectionString: "Server=tcp:sql,1433;Initial Catalog=FHIR;Persist Security Info=False;User ID=sa;Password=${SAPASSWORD};MultipleActiveResultSets=False;Connection Timeout=30;" - SqlServer__AllowDatabaseCreation: "true" - SqlServer__Initialize: "true" - DataStore: "SqlServer" - ports: - - "8080:8080" - depends_on: - - sql - sql: - image: "mcr.microsoft.com/mssql/server" - environment: - SA_PASSWORD: ${SAPASSWORD} - ACCEPT_EULA: "Y" - healthcheck: - test: ["CMD", "/opt/mssql-tools/bin/sqlcmd","-U sa -P ${SAPASSWORD} -Q 'SELECT * FROM INFORMATION_SCHEMA.TABLES'"] - interval: 10s - timeout: 10s - retries: 6 diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/README.md b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/README.md deleted file mode 100644 index 7799b10f5a..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/README.md +++ /dev/null @@ -1,310 +0,0 @@ -# Running Microsoft FHIR Server for Azure in Kubernetes - -The Microsoft FHIR Server for Azure can be deployed in a Kubernetes cluster. This document describes how to deploy and configure [Azure Kubernetes Service (AKS)](https://azure.microsoft.com/services/kubernetes-service/) to be able to run the FHIR server in it. Specifically, it describes how to install [Azure Service Operator](https://github.com/Azure/azure-service-operator) in the cluster to allow easy deployment of managed databases (Azure SQL or Cosmos DB). The repo contains a [helm](https://helm.sh) chart that leverages the Azure Service Operator to deploy and configure both FHIR service and backend database. - -## Deploy and configure AKS cluster - -In order to provision the FHIR server in AKS, you need the following: - -1. [AKS cluster](https://docs.microsoft.com/azure/aks/kubernetes-walkthrough) -1. [Azure Service Operator](https://github.com/Azure/azure-service-operator) -1. [Cert Manager](https://cert-manager.io/) -1. [NGINX ingress controller](https://kubernetes.github.io/ingress-nginx/) - -You can use the [deploy-aks.sh](deploy-aks.sh) script included in this repo: - -```bash -./deploy-aks.sh --name --resource-group-name --location westus2 -``` - -If you prefer to install the components manually, use the script as a guide for the installation steps. - -## Deploying the FHIR service to AKS - -Once AKS has been deployed and configured, deploy the FHIR server with: - -```bash -helm install my-fhir-release helm/fhir-server/ \ - --set database.resourceGroup="my-database-resource-group" \ - --set database.location="westus2" -``` - -You will need to supply a resource group and location for the database. The AKS cluster service principal must have privileges (Contributor rights) to create database resources in this resource group. The service principal will have contributor permissions on the resource group where the cluster is deployed, but you can also create a different group as long as you grant the service principal permissions. If you have provisioned your cluster with the `deploy-aks.sh` script (see above), the service principal id can be found in a keyvault in the AKS resource group. - -The default settings will deploy the FHIR server with a cluster IP address, which is not accessible from the outside, but you can map a local port to the FHIR service with: - -```bash -kubectl port-forward service/my-fhir-release-fhir-server 8080:80 -``` - -And the access the FHIR server with: - -```bash -curl -s http://localhost:8080/Patient | jq . -``` - -If you would like the FHIR service to have a public IP address, you can use a LoadBalancer service: - -```bash -helm install my-fhir-release helm/fhir-server/ \ - --set database.resourceGroup="my-database-resource-group" \ - --set database.location="westus2" \ - --set service.type=LoadBalancer -``` - -and locate the public IP address with: - -```bash -kubectl get svc my-fhir-release-fhir-server -``` - -## Configuring FHIR server with ingress controller - -The cluster deployment script adds an nginx ingress controller to cluster. Use the ingress controller for directing traffic to specific FHIR instances and for SSL termination. The ingress controller needs an SSL certificate. You have two options: - -1. Supply an existing certificate in a secret. -1. Use cert-manager (also installed in the cluster) to get the certificate from an issuer like [Let's Encrypt](https://letsencrypt.org/). - - -### Use existing certificate - -To use an existing certificate with the FHIR server, first create a kubernetes secret to hold the certificate: - -```bash -kubectl create secret tls my-example-tls --key server.key --cert cert.pem -``` - -You are now ready to create the FHIR server using the certificate. We will use an `ingress-values.yaml` file to hold the ingress settings: - -We have to set a few values, so to make that easier, create an `ingress-values.yaml` file: - -```yaml -ingress: - enabled: true - annotations: - kubernetes.io/ingress.class: nginx - hosts: - - host: mytestfhir.example.com - paths: - - / - tls: - - secretName: my-example-tls - hosts: - - mytestfhir.example.com -``` - -Then deploy the FHIR server with: - -```bash -helm install myfhirserverrelease helm/fhir-server/ \ - -f ingress-values.yaml \ - --set database.dataStore="SqlServer" \ - --set database.location="westus2" \ - --set database.resourceGroup="mydatabaseresourcegroup" -``` - -## Use Let's Encrypt - -You can add an `Issuer` or `ClusterIssuer` resource to the cluster, which will take care of interacting with Let's Encrypt. Create a manifest (e.g. `letsencrypt-issuer.yaml`) for a `ClusterIssuer`: - -```yaml -apiVersion: cert-manager.io/v1alpha2 -kind: ClusterIssuer -metadata: - name: letsencrypt -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: YOUR-EMAIL-ADDRESS - privateKeySecretRef: - name: letsencrypt - solvers: - - http01: - ingress: - class: nginx -``` - -Add your own email address. Let's Encrypt will use that to send you emails regarding expiring certificates, etc. Then add the issuer to the cluster - -```bash -kubectl apply -f letsencrypt-issuer.yaml -``` - -If you want the issuer to only apply to a specific namespace, use `Issuer` instead. - -Next make sure that you have an A record pointing to the public IP address of the ingress controller. You can find this public IP address with: - -```bash -kubectl get svc -n ingress-controller -``` - -To test if your cert-manager is working correctly with Let's Encrypt, you can create a certificate with a manifest like: - -```yaml -apiVersion: cert-manager.io/v1alpha2 -kind: Certificate -metadata: - name: mytest-mydomainname -spec: - dnsNames: - - mytest.example.com - secretName: mytest-example-tls - issuerRef: - kind: ClusterIssuer - name: letsencrypt -``` - -If you add that to a file called `cert.yaml` you can then add it to the cluster with: - -```bash -kubectl apply -f cert.yaml -``` - -You can check with `kubectl get certificates` if your cert is ready. If the cert is not available within a few seconds, check `kubectl get certificaterequests` and use `kubectl describe certificaterequest ` to investigate any problems. - -If your certificate deploys succcessfully you are ready to deploy a FHIR service with ingress controller. We have to set a few values, so to make that easier, create an `ingress-values.yaml` file: - -```yaml -ingress: - enabled: true - annotations: - kubernetes.io/ingress.class: nginx - cert-manager.io/cluster-issuer: letsencrypt - hosts: - - host: mytestfhir.example.com - paths: - - / - tls: - - secretName: mytestfhir-tls - hosts: - - mytestfhir.example.com -``` - -Then deploy the FHIR server with: - -```bash -helm install myfhirserverrelease helm/fhir-server/ \ - -f ingress-values.yaml \ - --set database.dataStore="SqlServer" \ - --set database.location="westus2" \ - --set database.resourceGroup="mydatabaseresourcegroup" -``` - -## Configuring CORS - -The ingress controller can also be used to manage CORS settings, to enable CORS add the appropriate annotations, e.g. building on the `ingress-values.yaml` file from above: - -```yaml -ingress: - enabled: true - annotations: - kubernetes.io/ingress.class: nginx - cert-manager.io/cluster-issuer: letsencrypt - nginx.ingress.kubernetes.io/enable-cors: "true" - nginx.ingress.kubernetes.io/cors-allow-origin: "*" - nginx.ingress.kubernetes.io/cors-allow-methods: "*" - nginx.ingress.kubernetes.io/cors-allow-headers: "*" - nginx.ingress.kubernetes.io/cors-max-age: "1440" - hosts: - - host: mytestfhir.example.com - paths: - - / - tls: - - secretName: mytestfhir-tls - hosts: - - mytestfhir.example.com -``` - -## Prometheus Metrics - -The FHIR service can (optionally) expose [Prometheus](https://prometheus.io) metrics on a seperate port. In order to collect (scrape) the metrics, will need to install Prometheus in your cluster. This can be done with the [Prometheus Operator](https://github.com/coreos/prometheus-operator). - -You can enable this Prometheus metrics with the `serviceMonitor.enabled` parameter by adding a `serviceMonitor` section to your values: - -```yaml -serviceMonitor: - enabled: true - labels: - prometheus: monitor -``` - -The `label` has to match the `serviceMonitorSelector.matchLabels` for your `Prometheus` resource. You can find the match labels with: - -```bash -kubectl get -n Prometheus -o json | jq .items[0].spec.serviceMonitorSelector -``` - -which should have something like: - -```json -{ - "matchLabels": { - "prometheus": "monitor" - } -} -``` - -to work with the settings above. - -## Enabling `$export` - -To use the `$export` operation, the FHIR server must be configured with a [pod identity](https://github.com/Azure/aad-pod-identity) and the identity of the FHIR server must have access to an existing storage account. - -1. Ensure that AAD Pod Identity is deployed in your cluster. The [deploy-aks.sh](deploy-aks.sh) script does that. You can verify it with: - - ```bash - kubectl get pods | grep aad-pod-identity - ``` - - you should see pods with names like `aad-pod-identity-mic-XXXXX` and `aad-pod-identity-nmi-YYYYY`. - -2. Create an identity in a resource group where the AKS cluster has access: - - ```bash - # Some settings - RESOURCE_GROUP=$(kubectl get nodes -o json | jq -r '.items[0].metadata.labels."kubernetes.azure.com/cluster"') - LOCATION=$(kubectl get nodes -o json | jq -r '.items[0].metadata.labels."topology.kubernetes.io/region"') - SUBSCRIPTION_ID=$(az account show | jq -r .id) - IDENTITY_NAME="myfhirserveridentity" - - # Create identity - az identity create -g $RESOURCE_GROUP -n $IDENTITY_NAME --subscription $SUBSCRIPTION_ID - IDENTITY_CLIENT_ID="$(az identity show -g $RESOURCE_GROUP -n $IDENTITY_NAME --subscription $SUBSCRIPTION_ID --query clientId -otsv)" - IDENTITY_RESOURCE_ID="$(az identity show -g $RESOURCE_GROUP -n $IDENTITY_NAME --subscription $SUBSCRIPTION_ID --query id -otsv)" - ``` - -3. Create a storage account and assign role to identity: - - ```bash - STORAGE_ACCOUNT_NAME="myfhirstorage" - az storage account create -g $RESOURCE_GROUP -n $STORAGE_ACCOUNT_NAME - STORAGE_ACCOUNT_ID=$(az storage account show -g $RESOURCE_GROUP -n $STORAGE_ACCOUNT_NAME | jq -r .id) - BLOB_URI=$(az storage account show -g $RESOURCE_GROUP -n $STORAGE_ACCOUNT_NAME | jq -r .primaryEndpoints.blob) - az role assignment create --role "Storage Blob Data Contributor" --assignee $IDENTITY_CLIENT_ID --scope $STORAGE_ACCOUNT_ID - ``` - -4. Provision FHIR server: - - First create a `fhir-server-export-values.yaml` file: - - ```bash - cat > fhir-server-export-values.yaml <" - echo " [--resource-group-name ]" - echo " [--location ]" - echo " [--max-nodes ]" - echo " [--vm-size ]" - echo " [--help]" -} - -# Checking if we have the tools we need to run this script -command -v jq >/dev/null 2>&1 || { echo >&2 "'jq' is required but not installed. Aborting."; exit 1; } -command -v helm >/dev/null 2>&1 || { echo >&2 "'helm' (version 3) is required but not installed. Aborting."; exit 1; } -command -v az >/dev/null 2>&1 || { echo >&2 "'az' (Azure CLI) is required but not installed. Aborting."; exit 1; } -command -v kubectl >/dev/null 2>&1 || { echo >&2 "'kubectl' is required but not installed. Aborting."; exit 1; } - -# Settings -location="westus2" -maxNodes=5 -vmSize="Standard_DS2_v2" -clusterName="" -resourceGroupName="" - -# Parse command line arguments -while [ "$1" != "" ]; do - case $1 in - -n | --name ) shift - clusterName=$1 - ;; - -g | --resource-group-name ) shift - resourceGroupName=$1 - ;; - -l | --location ) shift - location=$1 - ;; - -m | --max-nodes ) shift - maxNodes=$1 - ;; - -v | --vm-size ) shift - vmSize=$1 - ;; - -h | --help ) usage - exit - ;; - * ) usage - exit 1 - esac - shift -done - -if [ -z "$clusterName" ]; then - echo "Please provide a cluster name" - usage - exit 1 -fi - -if [ -z "$resourceGroupName" ]; then - resourceGroupName="$clusterName" -fi - -keyvaultName="${clusterName}" - -# First create a resource group -az group create --name $resourceGroupName --location $location - -# Create a keyvault -az keyvault create -n $keyvaultName -g $resourceGroupName --enable-soft-delete true - -sshKeyFile=~/.ssh/${name}_rsa -setKeyVaultSshSecrets=false -sshPrivateKey=`az keyvault secret show --vault-name $keyvaultName --name ssh-private-key 2> /dev/null || true` - -if [ -n "$sshPrivateKey" ]; then - echo $sshPrivateKey | jq -r .value > $sshKeyFile -else - setKeyVaultSshSecrets=true -fi - -sshPublicKey=`az keyvault secret show --vault-name $keyvaultName --name ssh-public-key 2> /dev/null || true` -if [ -n "$sshPublicKey" ]; then - echo $sshPublicKey | jq -r .value > ${sshKeyFile}.pub -else - setKeyVaultSshSecrets=true -fi - -if [ ! -f $sshKeyFile ]; then - ssh-keygen -f $sshKeyFile -t rsa -N '' - setKeyVaultSshSecrets=true -fi - -if [ "$setKeyVaultSshSecrets" = true ]; then - az keyvault secret set --name "ssh-private-key" --vault-name $keyvaultName --file $sshKeyFile > /dev/null - az keyvault secret set --name "ssh-public-key" --vault-name $keyvaultName --file ${sshKeyFile}.pub > /dev/null -fi - -#We need to know if the cluster is already there: -clusterFound=`az aks list --query "[?(name=='${clusterName}'&&resourceGroup=='${resourceGroupName}')]" | jq '. | length'` - -if [ $clusterFound -eq 0 ] -then - # There is a problem with the automatic SP creation in az aks create, so we will make the SP first - # https://github.com/Azure/azure-cli/issues/9585 - - # First let's see if we have it service principal already - spId="" - spPass="" - - clientIdKeyvaultSecret=`az keyvault secret show --vault-name $keyvaultName --name service-principal-client-id 2> /dev/null || true` - clientSecretKeyvaultSecret=`az keyvault secret show --vault-name $keyvaultName --name service-principal-client-secret 2> /dev/null || true` - - if [ -n "$clientIdKeyvaultSecret" ] && [ -n "$clientSecretKeyvaultSecret" ]; then - spId=`echo $clientIdKeyvaultSecret | jq -r .value` - spPass=`echo $clientSecretKeyvaultSecret | jq -r .value` - else - subscription=$(az account show | jq -r .id) - sp=$(az ad sp create-for-rbac --scope /subscriptions/${subscription}/resourceGroups/${resourceGroupName} --role Contributor --output json) - spId=$(echo $sp | jq -r '.appId') - spPass=$(echo $sp | jq -r '.password') - - az keyvault secret set --name "service-principal-client-id" --vault-name $keyvaultName --value $spId - az keyvault secret set --name "service-principal-client-secret" --vault-name $keyvaultName --value $spPass - - sleep 30 # This is necessary make sure the service principal is available for the AKS deployment. - fi - - az aks create \ - --resource-group $resourceGroupName \ - --name $clusterName \ - --node-count 1 \ - --node-vm-size $vmSize \ - --vm-set-type VirtualMachineScaleSets \ - --load-balancer-sku standard \ - --enable-cluster-autoscaler \ - --min-count 1 \ - --max-count $maxNodes \ - --service-principal $spId \ - --client-secret $spPass \ - --ssh-key-value ${sshKeyFile}.pub \ - --kubernetes-version 1.18.2 -else - az aks update \ - --resource-group $resourceGroupName \ - --name $clusterName \ - --update-cluster-autoscaler \ - --min-count 1 \ - --max-count $maxNodes -fi - -# Get credentials for kubectl -az aks get-credentials --name $clusterName --resource-group $resourceGroupName - -# Add the official stable repository -helm repo add stable https://kubernetes-charts.storage.googleapis.com/ - -# Install nginx -foundIngressControllerNamespace=`kubectl get namespace -o json | jq '.items[] | select(.metadata.name == "ingress-controller")'` -if [ -z "$foundIngressControllerNamespace" ]; then - kubectl create namespace ingress-controller -fi - -# The specification of linux nodes here is not really necessary since that is all we have -# but if we add Windows nodes in the future, we will want to make sure nginx is on Linux -helm upgrade --install nginx-ingress stable/nginx-ingress \ - --namespace ingress-controller \ - --set controller.replicaCount=2 \ - --set controller.nodeSelector."kubernetes\.io/os"=linux \ - --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux - -# Set up cert-manager -foundCertManagerNamespace=`kubectl get namespace -o json | jq '.items[] | select(.metadata.name == "cert-manager")'` - -if [ -z "$foundCertManagerNamespace" ]; then - kubectl create namespace cert-manager - kubectl label namespace cert-manager cert-manager.io/disable-validation=true - kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.12.0/cert-manager.yaml - - # wait for deployments to complete - for i in $(kubectl get deployment --namespace cert-manager -o json | jq -r .items[].metadata.name); do - kubectl rollout status deployment $i --namespace cert-manager - done -fi - - -# Set up Azure Service Operators -accountDetails=$(az account show) - -# We need to get these details back out of the KV incase this is a re-deployment -clientIdKeyvaultSecret=`az keyvault secret show --vault-name $keyvaultName --name service-principal-client-id 2> /dev/null || true` -clientSecretKeyvaultSecret=`az keyvault secret show --vault-name $keyvaultName --name service-principal-client-secret 2> /dev/null || true` -spId=`echo $clientIdKeyvaultSecret | jq -r .value` -spPass=`echo $clientSecretKeyvaultSecret | jq -r .value` - -# Create location to manage helm chart for ASO -rm -rf install-aso -mkdir -p install-aso - -export HELM_EXPERIMENTAL_OCI=1 -helm chart pull mcr.microsoft.com/k8s/asohelmchart:latest -helm chart export mcr.microsoft.com/k8s/asohelmchart:latest --destination install-aso/ - -helm upgrade --install aso ./install-aso/azure-service-operator -n azureoperator-system --create-namespace \ - --set azureSubscriptionID=$(echo $accountDetails | jq -r .id) \ - --set azureTenantID=$(echo $accountDetails | jq -r .tenantId) \ - --set azureClientID=$spId \ - --set azureClientSecret=$spPass \ - --set createNamespace=true \ - --set image.repository="mcr.microsoft.com/k8s/azureserviceoperator:latest" - - -# Install Pod Identities (needed for export) -# see https://github.com/Azure/aad-pod-identity for details -helm repo add aad-pod-identity https://raw.githubusercontent.com/Azure/aad-pod-identity/master/charts -helm install aad-pod-identity aad-pod-identity/aad-pod-identity - diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/.helmignore b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/Chart.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/Chart.yaml deleted file mode 100644 index 7b31cae066..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/Chart.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v2 -name: fhir-server -description: A Helm chart for deploying the Microsoft FHIR Server for Azure - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -version: 0.2.0 diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/NOTES.txt b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/NOTES.txt deleted file mode 100644 index 38c847d42b..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/NOTES.txt +++ /dev/null @@ -1,21 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "fhir-server.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "fhir-server.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "fhir-server.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "fhir-server.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 -{{- end }} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/_helpers.tpl b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/_helpers.tpl deleted file mode 100644 index db523289f5..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/_helpers.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "fhir-server.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "fhir-server.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "fhir-server.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Common labels -*/}} -{{- define "fhir-server.labels" -}} -helm.sh/chart: {{ include "fhir-server.chart" . }} -{{ include "fhir-server.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Selector labels -*/}} -{{- define "fhir-server.selectorLabels" -}} -app.kubernetes.io/name: {{ include "fhir-server.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} - -{{/* -Selector labels for MSSQL -*/}} -{{- define "fhir-server-mssql.selectorLabels" -}} -app.kubernetes.io/name: {{ include "fhir-server.name" . }}-mssql -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} - -{{/* -Create the name of the service account to use -*/}} -{{- define "fhir-server.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "fhir-server.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azureidentity.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azureidentity.yaml deleted file mode 100644 index eda34552b9..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azureidentity.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.podIdentity.enabled -}} -apiVersion: "aadpodidentity.k8s.io/v1" -kind: AzureIdentity -metadata: - name: {{ include "fhir-server.fullname" . }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - type: 0 - resourceID: {{ .Values.podIdentity.identityResourceId }} - clientID: {{ .Values.podIdentity.identityClientId }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azureidentitybinding.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azureidentitybinding.yaml deleted file mode 100644 index d398c8dc5e..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azureidentitybinding.yaml +++ /dev/null @@ -1,9 +0,0 @@ -{{- if .Values.podIdentity.enabled -}} -apiVersion: "aadpodidentity.k8s.io/v1" -kind: AzureIdentityBinding -metadata: - name: {{ include "fhir-server.fullname" . }}-binding -spec: - azureIdentity: {{ include "fhir-server.fullname" . }} - selector: {{ include "fhir-server.fullname" . }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqldatabase.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqldatabase.yaml deleted file mode 100644 index 6545b845b8..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqldatabase.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if eq .Values.database.dataStore "SqlServer" }} -{{- $fullName := include "fhir-server.fullname" . -}} -apiVersion: azure.microsoft.com/v1beta1 -kind: AzureSqlDatabase -metadata: - name: {{ $fullName }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - location: {{ .Values.database.location }} - resourceGroup: {{ .Values.database.resourceGroup }} - edition: {{ .Values.database.sql.edition }} - server: {{ $fullName }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqlfirewallrule.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqlfirewallrule.yaml deleted file mode 100644 index a95b87964b..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqlfirewallrule.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if eq .Values.database.dataStore "SqlServer" }} -{{- $fullName := include "fhir-server.fullname" . -}} -apiVersion: azure.microsoft.com/v1beta1 -kind: AzureSqlFirewallRule -metadata: - name: {{ $fullName }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - resourceGroup: {{ .Values.database.resourceGroup }} - server: {{ $fullName }} - - # this IP range enables Azure Service access - startIpAddress: 0.0.0.0 - endIpAddress: 0.0.0.0 -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqlserver.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqlserver.yaml deleted file mode 100644 index 15e3e95b79..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/azuresqlserver.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if eq .Values.database.dataStore "SqlServer" }} -{{- $fullName := include "fhir-server.fullname" . -}} -apiVersion: azure.microsoft.com/v1beta1 -kind: AzureSqlServer -metadata: - name: {{ $fullName }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - location: {{ .Values.database.location }} - resourceGroup: {{ .Values.database.resourceGroup }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/cosmosdb.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/cosmosdb.yaml deleted file mode 100644 index 31a3483784..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/cosmosdb.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if eq .Values.database.dataStore "CosmosDb" }} -{{- $fullName := include "fhir-server.fullname" . -}} -apiVersion: azure.microsoft.com/v1alpha1 -kind: CosmosDB -metadata: - name: {{ $fullName }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - location: {{ .Values.database.location }} - resourceGroup: {{ .Values.database.resourceGroup }} - properties: - databaseAccountOfferType: Standard -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/deployment.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/deployment.yaml deleted file mode 100644 index 52bb5e2eab..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/deployment.yaml +++ /dev/null @@ -1,185 +0,0 @@ -{{- $fullName := include "fhir-server.fullname" . -}} -{{- $dbservicename := printf "%s-mssql" $fullName }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "fhir-server.fullname" . }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "fhir-server.selectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{- include "fhir-server.selectorLabels" . | nindent 8 }} - {{- if .Values.podIdentity.enabled }} - aadpodidbinding: {{ include "fhir-server.fullname" . }} - {{- end}} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "fhir-server.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - - name: ASPNETCORE_FORWARDEDHEADERS_ENABLED - value: "true" - {{- if .Values.export.enabled }} - - name: FhirServer__Operations__Export__Enabled - value: "true" - - name: FhirServer__Operations__Export__StorageAccountUri - value: {{ .Values.export.blobStorageUri | quote }} - {{- end }} - {{- if .Values.serviceMonitor.enabled }} - - name: PrometheusMetrics__enabled - value: "true" - - name: PrometheusMetrics__port - value: {{ .Values.serviceMonitor.port | quote }} - - name: PrometheusMetrics__dotnetRuntimeMetrics - value: {{ .Values.serviceMonitor.dotnetRuntimeMetrics | quote }} - - name: PrometheusMetrics__httpMetrics - value: {{ .Values.serviceMonitor.httpMetrics | quote }} - - name: PrometheusMetrics__systemMetrics - value: {{ .Values.serviceMonitor.systemMetrics | quote }} - {{- end }} - {{- if .Values.appInsights.secretName }} - - name: ApplicationInsights__InstrumentationKey - valueFrom: - secretKeyRef: - name: {{ .Values.appInsights.secretName }} - key: {{ .Values.appInsights.secretKey }} - {{- end }} - - name: FhirServer__Security__Enabled - value: {{ .Values.security.enabled | quote }} - - name: FhirServer__Security__EnableAadSmartOnFhirProxy - value: {{ .Values.security.enableAadSmartOnFhirProxy | quote }} - {{- if .Values.security.authority }} - - name: FhirServer__Security__Authentication__Authority - value: {{ .Values.security.authority | lower | quote }} - {{- end }} - {{- if .Values.security.audience }} - - name: FhirServer__Security__Authentication__Audience - value: {{ .Values.security.audience | lower | quote }} - {{- end }} - {{- if eq .Values.database.dataStore "SqlServer" }} - - name: DataStore - value: "SqlServer" - - name: SqlServer__AllowDatabaseCreation - value: "true" - - name: SqlServer__Initialize - value: "true" - - name: SqlServer__SchemaOptions__AutomaticUpdatesEnabled - value: {{ .Values.database.sql.schema.automaticUpdatesEnabled | quote }} - - name: DATABASESERVERNAME - valueFrom: - secretKeyRef: - name: {{ include "fhir-server.fullname" . }} - key: fullyQualifiedServerName - - name: DATABASEUSERNAME - valueFrom: - secretKeyRef: - name: {{ include "fhir-server.fullname" . }} - key: username - - name: DATABASEPASSWORD - valueFrom: - secretKeyRef: - name: {{ include "fhir-server.fullname" . }} - key: password - - name: DATABASENAME - value: {{ include "fhir-server.fullname" . }} - - name: MAX_POOL_SIZE - value: {{ .Values.database.sql.maxPoolSize | quote }} - - name: SqlServer__ConnectionString - value: "Server=tcp:$(DATABASESERVERNAME),1433;Initial Catalog=$(DATABASENAME);Persist Security Info=False;User ID=$(DATABASEUSERNAME);Password=$(DATABASEPASSWORD);MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Max Pool Size=$(MAX_POOL_SIZE)" - {{- end }} - {{- if eq .Values.database.dataStore "SqlContainer" }} - - name: DataStore - value: "SqlServer" - - name: SqlServer__AllowDatabaseCreation - value: "true" - - name: SqlServer__Initialize - value: "true" - - name: SqlServer__SchemaOptions__AutomaticUpdatesEnabled - value: {{ .Values.database.sql.schema.automaticUpdatesEnabled | quote }} - - name: DATABASEUSERNAME - value: {{ .Values.database.sqlContainer.userName }} - - name: DATABASEPASSWORD - valueFrom: - secretKeyRef: - name: {{ $dbservicename }} - key: sapassword - - name: DATABASENAME - value: {{ .Values.database.sqlContainer.databaseName }} - - name: DATABASESERVERNAME - value: {{ $dbservicename }} - - name: SqlServer__ConnectionString - value: "Server=tcp:$(DATABASESERVERNAME),1433;Initial Catalog=$(DATABASENAME);Persist Security Info=False;User ID=$(DATABASEUSERNAME);Password=$(DATABASEPASSWORD);MultipleActiveResultSets=False;Connection Timeout=30" - {{- end }} - {{- if eq .Values.database.dataStore "CosmosDb" }} - - name: DataStore - value: "CosmosDb" - - name: CosmosDb__Host - valueFrom: - secretKeyRef: - name: {{ include "fhir-server.fullname" . }} - key: primaryEndpoint - - name: CosmosDb__Key - valueFrom: - secretKeyRef: - name: {{ include "fhir-server.fullname" . }} - key: primaryMasterKey - - name: FhirServer__CosmosDb__InitialCollectionThroughput - value: {{ .Values.database.cosmosDb.initialCollectionThroughput | quote }} - {{- if .Values.database.cosmosDb.databaseId }} - - name: CosmosDb__DatabaseId - value: {{ .Values.database.cosmosDb.databaseId }} - {{- end }} - {{- if .Values.database.cosmosDb.collectionId }} - - name: FhirServer__CosmosDb__CollectionId - value: {{ .Values.database.cosmosDb.collectionId }} - {{- end }} - {{- end }} - ports: - - name: http - containerPort: 8080 - protocol: TCP - - name: metrics - containerPort: {{ .Values.serviceMonitor.port }} - protocol: TCP - livenessProbe: - httpGet: - path: /health/check - port: http - failureThreshold: 12 - periodSeconds: 20 - timeoutSeconds: 10 - readinessProbe: - httpGet: - path: /health/check - port: http - timeoutSeconds: 10 - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/ingress.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/ingress.yaml deleted file mode 100644 index 1b7f52b053..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/ingress.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "fhir-server.fullname" . -}} -{{- $svcPort := .Values.service.port -}} -{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} -{{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ . }} - backend: - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} - {{- end }} - {{- end }} -{{- end }} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/metricsservice.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/metricsservice.yaml deleted file mode 100644 index 76b3048c16..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/metricsservice.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.serviceMonitor.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "fhir-server.fullname" . }}-metrics - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - type: ClusterIP - ports: - - port: {{ .Values.serviceMonitor.port }} - targetPort: {{ .Values.serviceMonitor.port }} - protocol: TCP - name: metrics - selector: - {{- include "fhir-server.selectorLabels" . | nindent 4 }} -{{- end }} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/service.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/service.yaml deleted file mode 100644 index e2a73d20e1..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "fhir-server.fullname" . }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: 8080 - protocol: TCP - name: http - selector: - {{- include "fhir-server.selectorLabels" . | nindent 4 }} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/serviceaccount.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/serviceaccount.yaml deleted file mode 100644 index f8792f1fb6..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "fhir-server.serviceAccountName" . }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end -}} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/servicemonitor.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/servicemonitor.yaml deleted file mode 100644 index b699534926..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/servicemonitor.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "fhir-server.fullname" . }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} - {{- with .Values.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: metrics - interval: {{ .Values.serviceMonitor.interval }} - selector: - matchLabels: - {{- include "fhir-server.selectorLabels" . | nindent 6 }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerdeployment.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerdeployment.yaml deleted file mode 100644 index 4b52e6c7e1..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerdeployment.yaml +++ /dev/null @@ -1,67 +0,0 @@ -{{- if eq .Values.database.dataStore "SqlContainer" }} -{{- $fullName := include "fhir-server.fullname" . -}} -{{- $dbservicename := printf "%s-mssql" $fullName }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ $dbservicename }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.database.sqlContainer.replicaCount }} - selector: - matchLabels: - {{- include "fhir-server-mssql.selectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{- include "fhir-server-mssql.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "fhir-server.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.database.sqlContainer.securityContext | nindent 8 }} - containers: - - name: mssql - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.database.sqlContainer.image.repository }}:{{ .Values.database.sqlContainer.image.tag }}" - imagePullPolicy: {{ .Values.database.sqlContainer.image.pullPolicy }} - env: - - name: MSSQL_PID - value: {{ .Values.database.sqlContainer.edition | quote }} - - name: ACCEPT_EULA - value: {{ .Values.database.sqlContainer.acceptEula | upper | quote }} - - name: SA_PASSWORD - valueFrom: - secretKeyRef: - name: {{ $dbservicename }} - key: sapassword - ports: - - containerPort: 1433 - protocol: TCP - resources: - {{- toYaml .Values.database.sqlContainer.resources | nindent 12 }} - volumeMounts: - - name: mssqldb - mountPath: /var/opt/mssql - volumes: - - name: mssqldb - persistentVolumeClaim: - claimName: {{ $dbservicename }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerpvc.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerpvc.yaml deleted file mode 100644 index 1d472ff5c9..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerpvc.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if eq .Values.database.dataStore "SqlContainer" }} -{{- $fullName := include "fhir-server.fullname" . -}} -{{- $dbservicename := printf "%s-mssql" $fullName }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ $dbservicename }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} - {{- with .Values.database.sqlContainer.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - storageClassName: {{ .Values.database.sqlContainer.persistence.storageClass }} - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.database.sqlContainer.persistence.size }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainersecret.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainersecret.yaml deleted file mode 100644 index 643814bc0d..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainersecret.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if eq .Values.database.dataStore "SqlContainer" }} -{{- $fullName := include "fhir-server.fullname" . -}} -{{- $dbservicename := printf "%s-mssql" $fullName }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ $dbservicename }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -type: Opaque -data: - sapassword: {{ randAlphaNum 20 | b64enc | quote }} -{{- end }} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerservice.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerservice.yaml deleted file mode 100644 index 169e67d213..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/templates/sqlcontainerservice.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if eq .Values.database.dataStore "SqlContainer" }} -{{- $fullName := include "fhir-server.fullname" . -}} -{{- $dbservicename := printf "%s-mssql" $fullName }} -apiVersion: v1 -kind: Service -metadata: - name: {{ $dbservicename }} - labels: - {{- include "fhir-server.labels" . | nindent 4 }} -spec: - type: ClusterIP - ports: - - port: {{ .Values.database.sqlContainer.port }} - targetPort: 1433 - protocol: TCP - selector: - {{- include "fhir-server-mssql.selectorLabels" . | nindent 4 }} -{{- end }} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/values.yaml b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/values.yaml deleted file mode 100644 index 447818790a..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/kubernetes/helm/fhir-server/values.yaml +++ /dev/null @@ -1,145 +0,0 @@ -# Default values for fhir-server. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: healthplatformregistry.azurecr.io/r4_fhir-server - tag: master - pullPolicy: IfNotPresent - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -serviceAccount: - # Specifies whether a service account should be created - create: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: - -podIdentity: - enabled: false - # identityClientId: my-id - # identityResourceId: my-identity-resource-id - -export: - enabled: false - blobStorageUri: https://mystorageaccount.blob.core.windows.net - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - type: ClusterIP - port: 80 - -database: - # options: SqlServer, SqlContainer, CosmosDb - dataStore: "SqlServer" - resourceGroup: "" - location: "" - sql: - # 0: Basic - # 1: Business - # 2: BusinessCritical - # 3: DataWarehouse - # 4: Free - # 5: GeneralPurpose - # 6: Hyperscale - # 7: Premium - # More at https://godoc.org/github.com/Azure/azure-sdk-for-go/services/preview/sql/mgmt/2015-05-01-preview/sql#DatabaseEdition - edition: 5 - maxPoolSize: 100 - schema: - automaticUpdatesEnabled: false - cosmosDb: - initialCollectionThroughput: "400" - # databaseId: health - # collectionId: fhir - sqlContainer: - # Accept EULA when deploying with --set database.sqlContainer.acceptEula="Y" - acceptEula: "n" - edition: "Developer" - image: - repository: mcr.microsoft.com/mssql/server - tag: 2019-latest - pullPolicy: IfNotPresent - replicaCount: 1 - port: 1433 - databaseName: FHIR - userName: sa - resources: {} - persistence: - storageClass: default - size: 8Gi - annotations: {} - # "helm.sh/resource-policy": keep - securityContext: - # mssql container has user mssql defined with id 10001 - runAsUser: 10001 - runAsGroup: 10001 - fsGroup: 10001 - -appInsights: - secretKey: "instrumentationKey" -# secretName: "cluster-app-insights" - -serviceMonitor: - enabled: false - port: 1234 - labels: {} - # prometheus: monitor - interval: 30s - dotnetRuntimeMetrics: true - httpMetrics: true - systemMetrics: true - -security: - enabled: false - enableAadSmartOnFhirProxy: false - authority: null - audience: null - -ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: - - host: chart-example.local - paths: [] - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -resources: {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - -nodeSelector: {} - -tolerations: [] - -affinity: {} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/FhirServer.psd1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/FhirServer.psd1 deleted file mode 100644 index ac0baa265a..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/FhirServer.psd1 +++ /dev/null @@ -1,16 +0,0 @@ -# -# Module manifest for module 'FhirServer' -# -@{ - RootModule = 'FhirServer.psm1' - ModuleVersion = '0.0.1' - GUID = '8d82e68c-0121-478c-9e81-62bced8d2a68' - Author = 'Microsoft Healthcare NExT' - CompanyName = 'https://microsoft.com' - Description = 'PowerShell Module for managing Azure Active Directory registrations and users for Microsoft FHIR Server.' - PowerShellVersion = '3.0' - FunctionsToExport = 'Remove-FhirServerApplicationRegistration', 'New-FhirServerClientApplicationRegistration', 'New-FhirServerApiApplicationRegistration', 'Get-FhirServerAzureAdAccessToken', 'Set-FhirServerApiApplicationRoles','Set-FhirServerClientAppRoleAssignments','Set-FhirServerUserAppRoleAssignments','New-FhirServerSmartClientReplyUrl' - CmdletsToExport = @() - AliasesToExport = @() -} - \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/FhirServer.psm1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/FhirServer.psm1 deleted file mode 100644 index 3225dcefe7..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/FhirServer.psm1 +++ /dev/null @@ -1,10 +0,0 @@ -$Public = @( Get-ChildItem -Path "$PSScriptRoot\Public\*.ps1" ) -$Private = @( Get-ChildItem -Path "$PSScriptRoot\Private\*.ps1" ) - -@($Public + $Private) | ForEach-Object { - Try { - . $_.FullName - } Catch { - Write-Error -Message "Failed to import function $($_.FullName): $_" - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Private/.gitkeep b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Private/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerApiApplicationRegistration.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerApiApplicationRegistration.ps1 deleted file mode 100644 index d299d425f1..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerApiApplicationRegistration.ps1 +++ /dev/null @@ -1,81 +0,0 @@ -function New-FhirServerApiApplicationRegistration { - <# - .SYNOPSIS - Create an AAD Application registration for a FHIR server instance. - .DESCRIPTION - Create a new AAD Application registration for a FHIR server instance. - A FhirServiceName or FhirServiceAudience must be supplied. - .EXAMPLE - New-FhirServerApiApplicationRegistration -FhirServiceName "myfhiservice" -AppRoles globalReader,globalExporter - .EXAMPLE - New-FhirServerApiApplicationRegistration -FhirServiceAudience "https://myfhirservice.azurewebsites.net" -AppRoles globalReader,globalExporter - .PARAMETER FhirServiceName - Name of the FHIR service instance. - .PARAMETER FhirServiceAudience - Full URL of the FHIR service. - .PARAMETER WebAppSuffix - Will be appended to FHIR service name to form the FhirServiceAudience if one is not supplied, - e.g., azurewebsites.net or azurewebsites.us (for US Government cloud) - .PARAMETER AppRoles - Names of AppRoles to be defined in the AAD Application registration - #> - [CmdletBinding(DefaultParameterSetName='ByFhirServiceName')] - param( - [Parameter(Mandatory = $true, ParameterSetName = 'ByFhirServiceName' )] - [ValidateNotNullOrEmpty()] - [string]$FhirServiceName, - - [Parameter(Mandatory = $true, ParameterSetName = 'ByFhirServiceAudience' )] - [ValidateNotNullOrEmpty()] - [string]$FhirServiceAudience, - - [Parameter(Mandatory = $false, ParameterSetName = 'ByFhirServiceName' )] - [String]$WebAppSuffix = "azurewebsites.net", - - [Parameter(Mandatory = $false)] - [String[]]$AppRoles = "admin" - ) - - Set-StrictMode -Version Latest - - # Get current AzureAd context - try { - Get-AzureADCurrentSessionInfo -ErrorAction Stop | Out-Null - } - catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" - } - - if ([string]::IsNullOrEmpty($FhirServiceAudience)) { - $FhirServiceAudience = "https://$FhirServiceName.$WebAppSuffix" - } - - $desiredAppRoles = @() - foreach ($role in $AppRoles) { - $id = New-Guid - - $desiredAppRoles += @{ - AllowedMemberTypes = @("User", "Application") - Description = $role - DisplayName = $role - Id = $id - IsEnabled = "true" - Value = $role - } - } - - # Create the App Registration - $apiAppReg = New-AzureADApplication -DisplayName $FhirServiceAudience -IdentifierUris $FhirServiceAudience -AppRoles $desiredAppRoles - New-AzureAdServicePrincipal -AppId $apiAppReg.AppId | Out-Null - - $aadEndpoint = (Get-AzureADCurrentSessionInfo).Environment.Endpoints["ActiveDirectory"] - $aadTenantId = (Get-AzureADCurrentSessionInfo).Tenant.Id.ToString() - - #Return Object - @{ - AppId = $apiAppReg.AppId; - TenantId = $aadTenantId; - Authority = "$aadEndpoint$aadTenantId"; - Audience = $FhirServiceAudience; - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerClientApplicationRegistration.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerClientApplicationRegistration.ps1 deleted file mode 100644 index d4fe1fa274..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerClientApplicationRegistration.ps1 +++ /dev/null @@ -1,97 +0,0 @@ -function New-FhirServerClientApplicationRegistration { - <# - .SYNOPSIS - Create an AAD Application registration for a client application. - .DESCRIPTION - Create a new AAD Application registration for a client application that consumes an API. - .EXAMPLE - New-FhirServerClientApplicationRegistration -DisplayName "clientapplication" -ApiAppId 9125e524-1509-XXXX-XXXX-74137cc75422 - .PARAMETER ApiAppId - API AAD Application registration Id - .PARAMETER DisplayName - Display name for the client AAD Application registration - .PARAMETER ReplyUrl - Reply URL for the client AAD Application registration - .PARAMETER IdentifierUri - Identifier URI for the client AAD Application registration - .PARAMETER PublicClient - Switch to indicate if the client application should be a public client (desktop/mobile applications) - #> - param( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$ApiAppId, - - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$DisplayName, - - [Parameter(Mandatory = $false)] - [string]$ReplyUrl = "https://www.getpostman.com/oauth2/callback", - - [Parameter(Mandatory = $false)] - [string]$IdentifierUri = "https://$DisplayName", - - [Parameter(Mandatory = $false)] - [switch]$PublicClient - ) - - Set-StrictMode -Version Latest - - # Get current AzureAd context - try { - Get-AzureADCurrentSessionInfo -ErrorAction Stop | Out-Null - } - catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" - } - - $apiAppReg = Get-AzureADApplication -Filter "AppId eq '$ApiAppId'" - - # Some GUID values for Azure Active Directory - # https://blogs.msdn.microsoft.com/aaddevsup/2018/06/06/guid-table-for-windows-azure-active-directory-permissions/ - # Windows AAD Resource ID: - $windowsAadResourceId = "00000002-0000-0000-c000-000000000000" - # 'Sign in and read user profile' permission (scope) - $signInScope = "311a71cc-e848-46a1-bdf8-97ff7156d8e6" - - # Required App permission for Azure AD sign-in - $reqAad = New-Object -TypeName "Microsoft.Open.AzureAD.Model.RequiredResourceAccess" - $reqAad.ResourceAppId = $windowsAadResourceId - $reqAad.ResourceAccess = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList $signInScope, "Scope" - - # Required App Permission for the API application registration. - $reqApi = New-Object -TypeName "Microsoft.Open.AzureAD.Model.RequiredResourceAccess" - $reqApi.ResourceAppId = $apiAppReg.AppId #From API App registration above - - # Just add the first scope (user impersonation) - $reqApi.ResourceAccess = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList $apiAppReg.Oauth2Permissions[0].id, "Scope" - - if($PublicClient) - { - $clientAppReg = New-AzureADApplication -DisplayName $DisplayName -RequiredResourceAccess $reqAad, $reqApi -ReplyUrls $ReplyUrl -PublicClient $true - } - else - { - $clientAppReg = New-AzureADApplication -DisplayName $DisplayName -IdentifierUris $IdentifierUri -RequiredResourceAccess $reqAad, $reqApi -ReplyUrls $ReplyUrl - } - - # Create a client secret - $clientAppPassword = New-AzureADApplicationPasswordCredential -ObjectId $clientAppReg.ObjectId - - # Create Service Principal - New-AzureAdServicePrincipal -AppId $clientAppReg.AppId | Out-Null - - $securityAuthenticationAudience = $apiAppReg.IdentifierUris[0] - $aadEndpoint = (Get-AzureADCurrentSessionInfo).Environment.Endpoints["ActiveDirectory"] - $aadTenantId = (Get-AzureADCurrentSessionInfo).Tenant.Id.ToString() - $securityAuthenticationAuthority = "$aadEndpoint$aadTenantId" - - @{ - AppId = $clientAppReg.AppId; - AppSecret = $clientAppPassword.Value; - ReplyUrl = $clientAppReg.ReplyUrls[0] - AuthUrl = "$securityAuthenticationAuthority/oauth2/authorize?resource=$securityAuthenticationAudience" - TokenUrl = "$securityAuthenticationAuthority/oauth2/token" - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerSmartClientReplyUrl.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerSmartClientReplyUrl.ps1 deleted file mode 100644 index ad7074b70d..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/New-FhirServerSmartClientReplyUrl.ps1 +++ /dev/null @@ -1,61 +0,0 @@ -function New-FhirServerSmartClientReplyUrl { - <# - .SYNOPSIS - Adds a SMART on FHIR Proxy Reply URL to a client app - .DESCRIPTION - Adds a SMART on FHIR Proxy Reply URL to a client app - .EXAMPLE - New-FhirServerSmartClientReplyUrl -AppId 9125e524-1509-XXXX-XXXX-74137cc75422 -FhirServerUrl https://fhir-server -ReplyUrl https://app-server/my-app - #> - param( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$AppId, - - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$FhirServerUrl, - - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$ReplyUrl - ) - - Set-StrictMode -Version Latest - - # Get current AzureAd context - try { - $session = Get-AzureADCurrentSessionInfo -ErrorAction Stop - } - catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" - } - - - $appReg = Get-AzureADApplication -Filter "AppId eq '$AppId'" - if (!$appReg) { - Write-Host "Application with AppId = $AppId was not found." - return - } - - $origReplyUrls = $appReg.ReplyUrls - - # Form new reply URL: https://fhir-server//* - $bytes = [System.Text.Encoding]::UTF8.GetBytes($ReplyUrl) - $encodedText =[Convert]::ToBase64String($bytes) - $encodedText = $encodedText.TrimEnd('='); - $encodedText = $encodedText.Replace('/','_'); - $encodedText = $encodedText.Replace('+','-'); - - $newReplyUrl = $FhirServerUrl.TrimEnd('/') + "/AadSmartOnFhirProxy/callback/" + $encodedText - - # Add Reply URL if not already in the list - if ($origReplyUrls -NotContains $newReplyUrl) { - $origReplyUrls.Add($newReplyUrl) - Set-AzureADApplication -ObjectId $appReg.ObjectId -ReplyUrls $origReplyUrls - } - else - { - Write-Host "Skipping Reply URL add. Already added." - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Remove-FhirServerApplicationRegistration.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Remove-FhirServerApplicationRegistration.ps1 deleted file mode 100644 index 9389e932bc..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Remove-FhirServerApplicationRegistration.ps1 +++ /dev/null @@ -1,49 +0,0 @@ -function Remove-FhirServerApplicationRegistration { - <# - .SYNOPSIS - Remove (delete) an AAD Application registration - .DESCRIPTION - Deletes an AAD Application registration with a specific AppId - .EXAMPLE - Remove-FhirServerApplicationRegistration -AppId 9125e524-1509-XXXX-XXXX-74137cc75422 - #> - [CmdletBinding(DefaultParameterSetName='ByIdentifierUri')] - param( - [Parameter(Mandatory = $true, ParameterSetName = 'ByAppId' )] - [ValidateNotNullOrEmpty()] - [string]$AppId, - - [Parameter(Mandatory = $true, ParameterSetName = 'ByIdentifierUri' )] - [ValidateNotNullOrEmpty()] - [string]$IdentifierUri - ) - - Set-StrictMode -Version Latest - - # Get current AzureAd context - try { - $session = Get-AzureADCurrentSessionInfo -ErrorAction Stop - } - catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" - } - - $appReg = $null - - if ($AppId) { - $appReg = Get-AzureADApplication -Filter "AppId eq '$AppId'" - if (!$appReg) { - Write-Host "Application with AppId = $AppId was not found." - return - } - } - else { - $appReg = Get-AzureADApplication -Filter "identifierUris/any(uri:uri eq '$IdentifierUri')" - if (!$appReg) { - Write-Host "Application with IdentifierUri = $IdentifierUri was not found." - return - } - } - - Remove-AzureADApplication -ObjectId $appReg.ObjectId -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerApiApplicationRoles.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerApiApplicationRoles.ps1 deleted file mode 100644 index ad7b107926..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerApiApplicationRoles.ps1 +++ /dev/null @@ -1,89 +0,0 @@ -function Set-FhirServerApiApplicationRoles { - <# - .SYNOPSIS - Configures (create/update) the roles on the API application. - .DESCRIPTION - Configures (create/update) the roles of the API Application registration, specifically, it populates the AppRoles field of the application manifest. - .EXAMPLE - Set-FhirServerApiApplicationRoles -AppId -AppRoles globalReader,globalExporter - .PARAMETER ApiAppId - ApiId for the API application - .PARAMETER AppRoles - List of roles to be defined on the API App - #> - param( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [string]$ApiAppId, - - [Parameter(Mandatory = $true)] - [ValidateNotNull()] - [string[]]$AppRoles - ) - - Set-StrictMode -Version Latest - - # Get current AzureAd context - try { - Get-AzureADCurrentSessionInfo -ErrorAction Stop | Out-Null - } - catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" - } - - Write-Host "Persisting Roles to AAD application" - - $azureAdApplication = Get-AzureADApplication -Filter "AppId eq '$ApiAppId'" - - $appRolesToDisable = $false - $appRolesToEnable = $false - $desiredAppRoles = @() - - foreach ($role in $AppRoles) { - $existingAppRole = $azureAdApplication.AppRoles | Where-Object Value -eq $role - - if($existingAppRole) { - $id = $existingAppRole.Id - } - else { - $id = New-Guid - } - - $desiredAppRoles += @{ - AllowedMemberTypes = @("User", "Application") - Description = $role - DisplayName = $role - Id = $id - IsEnabled = "true" - Value = $role - } - } - - if (!($azureAdApplication.PsObject.Properties.Name -eq "AppRoles")) { - $appRolesToEnable = $true - } - else { - foreach ($diff in Compare-Object -ReferenceObject $desiredAppRoles -DifferenceObject $azureAdApplication.AppRoles -Property "Id") { - switch ($diff.SideIndicator) { - "<=" { - $appRolesToEnable = $true - } - "=>" { - ($azureAdApplication.AppRoles | Where-Object Id -eq $diff.Id).IsEnabled = $false - $appRolesToDisable = $true - } - } - } - } - - if ($appRolesToEnable -or $appRolesToDisable) { - if ($appRolesToDisable) { - Write-Host "Disabling old appRoles" - Set-AzureADApplication -ObjectId $azureAdApplication.objectId -appRoles $azureAdApplication.AppRoles | Out-Null - } - - # Update app roles - Write-Host "Updating appRoles" - Set-AzureADApplication -ObjectId $azureAdApplication.objectId -appRoles $desiredAppRoles | Out-Null - } -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerClientAppRoleAssignments.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerClientAppRoleAssignments.ps1 deleted file mode 100644 index 1b94360473..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerClientAppRoleAssignments.ps1 +++ /dev/null @@ -1,107 +0,0 @@ -function Set-FhirServerClientAppRoleAssignments { - <# - .SYNOPSIS - Set app role assignments for the given client application - .DESCRIPTION - Set AppRoles for a given client application. Requires Azure AD admin privileges. - .EXAMPLE - Set-FhirServerClientAppRoleAssignments -AppId -ApiAppId -AppRoles globalReader,globalExporter - .PARAMETER AppId - The AppId of the of the client application - .PARAMETER ApiAppId - The objectId of the API application that has roles that need to be assigned - .PARAMETER AppRoles - The collection of roles from the testauthenvironment.json for the client application - #> - param( - [Parameter(Mandatory = $true )] - [ValidateNotNullOrEmpty()] - [string]$AppId, - - [Parameter(Mandatory = $true )] - [ValidateNotNullOrEmpty()] - [string]$ApiAppId, - - [Parameter(Mandatory = $true )] - [AllowEmptyCollection()] - [string[]]$AppRoles - ) - - Set-StrictMode -Version Latest - - # Get current AzureAd context - try { - Get-AzureADCurrentSessionInfo -ErrorAction Stop | Out-Null - } - catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" - } - - # Get the collection of roles for the user - $apiApplication = Get-AzureAdServicePrincipal -Filter "appId eq '$ApiAppId'" - $aadClientServicePrincipal = Get-AzureAdServicePrincipal -Filter "appId eq '$AppId'" - $ObjectId = $aadClientServicePrincipal.ObjectId - - $existingRoleAssignments = Get-AzureADServiceAppRoleAssignment -ObjectId $apiApplication.ObjectId | Where-Object {$_.PrincipalId -eq $ObjectId} - - $expectedRoles = New-Object System.Collections.ArrayList - $rolesToAdd = New-Object System.Collections.ArrayList - $rolesToRemove = New-Object System.Collections.ArrayList - - foreach ($role in $AppRoles) { - $expectedRoles += @($apiApplication.AppRoles | Where-Object { $_.Value -eq $role }) - } - - foreach ($diff in Compare-Object -ReferenceObject @($expectedRoles | Select-Object) -DifferenceObject @($existingRoleAssignments | Select-Object) -Property "Id") { - switch ($diff.SideIndicator) { - "<=" { - $rolesToAdd += $diff.Id - } - "=>" { - $rolesToRemove += $diff.Id - } - } - } - - foreach ($role in $rolesToAdd) { - # This is known to report failure in certain scenarios, but will actually apply the permissions - try { - New-AzureADServiceAppRoleAssignment -ObjectId $ObjectId -PrincipalId $ObjectId -ResourceId $apiApplication.ObjectId -Id $role | Out-Null - } - catch { - #The role may have been assigned. Check: - $roleAssigned = Get-AzureADServiceAppRoleAssignment -ObjectId $apiApplication.ObjectId | Where-Object {$_.PrincipalId -eq $ObjectId -and $_.Id -eq $role} - if (!$roleAssigned) { - throw "Failure adding app role assignment for service principal." - } - } - } - - foreach ($role in $rolesToRemove) { - Remove-AzureADServiceAppRoleAssignment -ObjectId $ObjectId -AppRoleAssignmentId ($existingRoleAssignments | Where-Object { $_.Id -eq $role }).ObjectId | Out-Null - } - - $finalRolesAssignments = Get-AzureADServiceAppRoleAssignment -ObjectId $apiApplication.ObjectId | Where-Object {$_.PrincipalId -eq $ObjectId} - $rolesNotAdded = $() - $rolesNotRemoved = $() - foreach ($diff in Compare-Object -ReferenceObject @($expectedRoles | Select-Object) -DifferenceObject @($finalRolesAssignments | Select-Object) -Property "Id") { - switch ($diff.SideIndicator) { - "<=" { - $rolesNotAdded += $diff.Id - } - "=>" { - $rolesNotRemoved += $diff.Id - } - } - } - - if($rolesNotAdded -or $rolesNotRemoved) { - if($rolesNotAdded) { - Write-Host "The following roles were not added: $rolesNotAdded" - } - - if($rolesNotRemoved) { - Write-Host "The following roles were not removed: $rolesNotRemoved" - } - } -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerUserAppRoleAssignments.ps1 b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerUserAppRoleAssignments.ps1 deleted file mode 100644 index b5f85849de..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/PowerShell/FhirServer/Public/Set-FhirServerUserAppRoleAssignments.ps1 +++ /dev/null @@ -1,77 +0,0 @@ -function Set-FhirServerUserAppRoleAssignments { - <# - .SYNOPSIS - Set app role assignments for a user - .DESCRIPTION - Set AppRoles for a given user. Requires Azure AD admin privileges. - .EXAMPLE - Set-FhirServerUserAppRoleAssignments -UserPrincipalName -ApiAppId -AppRoles globalReader,globalExporter - .PARAMETER UserPrincipalName - The user principal name (e.g. myalias@contoso.com) of the of the user - .PARAMETER ApiAppId - The AppId of the API application that has roles that need to be assigned - .PARAMETER AppRoles - The array of roles for the client application - #> - param( - [Parameter(Mandatory = $true )] - [ValidateNotNullOrEmpty()] - [string]$UserPrincipalName, - - [Parameter(Mandatory = $true )] - [ValidateNotNullOrEmpty()] - [string]$ApiAppId, - - [Parameter(Mandatory = $true )] - [ValidateNotNull()] - [string[]]$AppRoles - ) - - Set-StrictMode -Version Latest - - # Get current AzureAd context - try { - Get-AzureADCurrentSessionInfo -ErrorAction Stop | Out-Null - } - catch { - throw "Please log in to Azure AD with Connect-AzureAD cmdlet before proceeding" - } - - $aadUser = Get-AzureADUser -Filter "UserPrincipalName eq '$UserPrincipalName'" - if (!$aadUser) - { - throw "User not found" - } - - $servicePrincipal = Get-AzureAdServicePrincipal -Filter "appId eq '$ApiAppId'" - - # Get the collection of roles for the user - $existingRoleAssignments = Get-AzureADUserAppRoleAssignment -ObjectId $aadUser.ObjectId | Where-Object {$_.ResourceId -eq $servicePrincipal.ObjectId} - - $expectedRoles = New-Object System.Collections.ArrayList - $rolesToAdd = New-Object System.Collections.ArrayList - $rolesToRemove = New-Object System.Collections.ArrayList - - foreach ($role in $AppRoles) { - $expectedRoles += @($servicePrincipal.AppRoles | Where-Object { $_.Value -eq $role }) - } - - foreach ($diff in Compare-Object -ReferenceObject @($expectedRoles | Select-Object) -DifferenceObject @($existingRoleAssignments | Select-Object) -Property "Id") { - switch ($diff.SideIndicator) { - "<=" { - $rolesToAdd += $diff.Id - } - "=>" { - $rolesToRemove += $diff.Id - } - } - } - - foreach ($role in $rolesToAdd) { - New-AzureADUserAppRoleAssignment -ObjectId $aadUser.ObjectId -PrincipalId $aadUser.ObjectId -ResourceId $servicePrincipal.ObjectId -Id $role | Out-Null - } - - foreach ($role in $rolesToRemove) { - Remove-AzureADUserAppRoleAssignment -ObjectId $aadUser.ObjectId -AppRoleAssignmentId ($existingRoleAssignments | Where-Object { $_.Id -eq $role }).ObjectId | Out-Null - } -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/bash/create-aad-api-application-registration.sh b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/bash/create-aad-api-application-registration.sh deleted file mode 100644 index dc6d9101f5..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/bash/create-aad-api-application-registration.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash - -FHIRSERVICENAME="" -AUDIENCE="" -WEBAPPSUFFIX="azurewebsites.net" - -usage () -{ - echo "Usage: " - echo " $0 -s | -a " - echo " [-w ]" - exit -} - -while [[ $# -gt 0 ]] -do -key="$1" - -case $key in - -s|--service-name) - FHIRSERVICENAME="$2" - shift # past argument - shift # past value - ;; - -a|--audience) - AUDIENCE="$2" - shift # past argument - shift # past value - ;; - -w|--web-app-suffix) - WEBAPPSUFFIX="$2" - shift # past argument - shift # past value - ;; - -h|--help) - usage - ;; - *) # unknown option - echo "Unknown argument $1" - usage - ;; -esac -done - -command -v jq >/dev/null 2>&1 || { echo >&2 "This script requires 'jq' to be installed."; exit 1; } - -[ -z $FHIRSERVICENAME ] && [ -z $AUDIENCE ] && echo "Please provide FHIR Service name or Audience" && usage - -if [[ -z $AUDIENCE ]]; then - AUDIENCE="https://${FHIRSERVICENAME}.${WEBAPPSUFFIX}" -fi - -context=$(az account show) -if [[ $? -ne 0 ]]; then - echo "Please log in with 'az login' and set an account with 'az account set'" - exit 1 -fi - -#Create the app registration for the FHIR API: -apiAppReg=$(az ad app create --display-name ${AUDIENCE} --identifier-uris ${AUDIENCE}) -apiAppId=$(echo $apiAppReg | jq -r .appId) -sp=$(az ad sp create --id ${apiAppId}) -aadTenantId=$(echo $context | jq -r .tenantId) -environmentName=$(echo $context | jq -r .environmentName) -aadEndpoint=$(az cloud show --name $environmentName | jq -r .endpoints.activeDirectory) - -#Return summary information -cat << EOF -{ - "AppId": "$apiAppId", - "TenantId": "$aadTenantId", - "Authority": "${aadEndpoint}/${aadTenantId}", - "Audience": "${AUDIENCE}" -} -EOF diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/bash/create-aad-client-application-registration.sh b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/bash/create-aad-client-application-registration.sh deleted file mode 100644 index 6af496788e..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/scripts/bash/create-aad-client-application-registration.sh +++ /dev/null @@ -1,114 +0,0 @@ -#!/bin/bash - -APIAPPID="" -DISPLAYNAME="" -REPLYURL="https://www.getpostman.com/oauth2/callback" -IDENTIFIERURI="" - -usage () -{ - echo "Usage: " - echo " $0 -a -d " - echo " [-r ] [-i ]" - exit -} - -while [[ $# -gt 0 ]] -do -key="$1" - -case $key in - -a|--api-app-id|--app-id) - APIAPPID="$2" - shift # past argument - shift # past value - ;; - -d|--display-name) - DISPLAYNAME="$2" - shift # past argument - shift # past value - ;; - -r|--reply-url) - REPLYURL="$2" - shift # past argument - shift # past value - ;; - -i|--identifier-uri) - IDENTIFIERURI="$2" - shift # past argument - shift # past value - ;; - -h|--help) - usage - ;; - *) # unknown option - echo "Unknown argument $1" - usage - ;; -esac -done - -command -v jq >/dev/null 2>&1 || { echo >&2 "This script requires 'jq' to be installed."; exit 1; } - -[ -z $APIAPPID ] && echo "Please provide FHIR Service API App ID" && usage -[ -z $DISPLAYNAME ] && echo "Please provide Display Name" && usage - -if [[ -z $IDENTIFIERURI ]]; then - IDENTIFIERURI="https://${DISPLAYNAME}" -fi - -context=$(az account show) -if [[ $? -ne 0 ]]; then - echo "Please log in with 'az login' and set an account with 'az account set'" - exit 1 -fi - -#Grab a few details we will need -apiAppReg=$(az ad app show --id $APIAPPID) -apiAppId=$(echo $apiAppReg | jq -r .appId) - -#There are discrepancies between versions of Azure CLI. -if [[ $(echo $apiAppReg | jq -r .additionalProperties) != "null" ]]; then - #Backwards compatibility - apiAppScopeId=$(echo $apiAppReg | jq -r .additionalProperties.oauth2Permissions[0].id) -else - apiAppScopeId=$(echo $apiAppReg | jq -r .oauth2Permissions[0].id) -fi - -# Some GUID values for Azure Active Directory -# https://blogs.msdn.microsoft.com/aaddevsup/2018/06/06/guid-table-for-windows-azure-active-directory-permissions/ -# Windows AAD Resource ID: -windowsAadResourceId="00000002-0000-0000-c000-000000000000" -# 'Sign in and read user profile' permission (scope) -signInScope="311a71cc-e848-46a1-bdf8-97ff7156d8e6" - -aadPermissions="{ \"resourceAppId\": \"${windowsAadResourceId}\", \"resourceAccess\": [{ \"id\": \"${signInScope}\", \"type\": \"Scope\"}]}" -apiPermissions="{ \"resourceAppId\": \"${apiAppId}\", \"resourceAccess\": [{ \"id\": \"${apiAppScopeId}\", \"type\": \"Scope\"}]}" - -apiPermissionsManifest="[${aadPermissions},${apiPermissions}]" - - -#Create app registration for client application -clientSecret=$(uuidgen | base64) -clientAppReg=$(az ad app create --display-name ${DISPLAYNAME} --password ${clientSecret} --identifier-uris "${IDENTIFIERURI}" --required-resource-access "${apiPermissionsManifest}" --reply-urls ${REPLYURL}) -clientAppId=$(echo $clientAppReg | jq -r .appId) -apiAppAudience=$(echo $apiAppReg | jq -r .identifierUris[0]) -aadTenantId=$(echo $context | jq -r .tenantId) -environmentName=$(echo $context | jq -r .environmentName) -aadEndpoint=$(az cloud show --name $environmentName | jq -r .endpoints.activeDirectory) -authUrl="${aadEndpoint}/${aadTenantId}/oauth2/authorize?resource=${apiAppAudience}" -tokenUrl="${aadEndpoint}/${aadTenantId}/oauth2/token" - -#Service principal for client application -sp=$(az ad sp create --id ${clientAppId}) - -#Return summary information -cat << EOF -{ - "AppId": "${clientAppId}", - "AppSecret": "${clientSecret}", - "ReplyUrl": "${REPLYURL}", - "AuthUrl": "${authUrl}", - "TokenUrl": "${tokenUrl}" -} -EOF diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-docker-sql.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-docker-sql.json deleted file mode 100644 index 94dcf29122..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-docker-sql.json +++ /dev/null @@ -1,421 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "serviceName": { - "type": "string", - "minLength": 3, - "maxLength": 24, - "metadata": { - "description": "Name of the FHIR service Web App." - } - }, - "appServicePlanResourceGroup": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Resource group containing App Service Plan. If empty, deployment resource group is used." - } - }, - "appServicePlanName": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Name of App Service Plan (existing or new). If empty, a name will be generated." - } - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "D1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3", - "P4" - ], - "defaultValue": "S1" - }, - "securityAuthenticationAuthority": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "OAuth Authority" - } - }, - "securityAuthenticationAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Audience (aud) to validate in JWT" - } - }, - "enableAadSmartOnFhirProxy": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Enable Azure AAD SMART on FHIR Proxy" - } - }, - "msdeployPackageUrl": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Webdeploy package to use as depoyment code. If blank, the latest code package will be deployed." - } - }, - "deployApplicationInsights": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Deploy Application Insights for the FHIR server." - } - }, - "applicationInsightsLocation": { - "type": "string", - "defaultValue": "eastus", - "allowedValues": [ - "southeastasia", - "northeurope", - "westeurope", - "eastus", - "southcentralus", - "westus2", - "usgovvirginia", - "usgovarizona" - ] - }, - "additionalFhirServerConfigProperties": { - "type": "object", - "defaultValue": { - }, - "metadata": { - "description": "Additional configuration properties for the FHIR server. In the form {\"path1\":\"value1\",\"path2\":\"value2\"}" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSqlServer", - "metadata": { - "description": "The type of the solution" - } - }, - "sqlAdminPassword": { - "type": "securestring", - "metadata": { - "description": "The password for the sql admin user if using SQL server." - } - }, - "sqlLocation": { - "type": "string", - "defaultValue": "[resourceGroup().location]", - "metadata": { - "description": "An override location for the sql server database." - } - }, - "fhirVersion": { - "type": "string", - "defaultValue": "R4", - "allowedValues": [ - "Stu3", - "R4", - "R5" - ], - "metadata": { - "description": "Only applies when MsdeployPackageUrl is not specified." - } - }, - "imageTag": { - "type": "string", - "defaultValue": "release", - "metadata": { - "description": "Tag of the docker image to deploy." - } - }, - "enableExport": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Determines whether export will be enabled for this fhir instance. If true, a storage account will be created as part of the deployment. You will need owner or user-administrator permissions for this." - } - }, - "sqlSchemaAutomaticUpdatesEnabled": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Determine whether the sql schema should be automatically upgraded on server startup" - } - } - }, - "variables": { - "isMAG": "[or(contains(resourceGroup().location,'usgov'),contains(resourceGroup().location,'usdod'))]", - "serviceName": "[toLower(parameters('serviceName'))]", - "keyvaultEndpoint": "[if(variables('isMAG'), concat('https://', variables('serviceName'), '.vault.usgovcloudapi.net/'), concat('https://', variables('serviceName'), '.vault.azure.net/'))]", - "appServicePlanResourceGroup": "[if(empty(parameters('appServicePlanResourceGroup')), resourceGroup().name, parameters('appServicePlanResourceGroup'))]", - "appServicePlanName": "[if(empty(parameters('appServicePlanName')),concat(variables('serviceName'),'-asp'),parameters('appServicePlanName'))]", - "appServiceResourceId": "[resourceId('Microsoft.Web/sites', variables('serviceName'))]", - "securityAuthenticationEnabled": "[and(not(empty(parameters('securityAuthenticationAuthority'))),not(empty(parameters('securityAuthenticationAudience'))))]", - "deployAppInsights": "[parameters('deployApplicationInsights')]", - "appInsightsName": "[concat('AppInsights-', variables('serviceName'))]", - "storageBlobDataContributerRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", - "blobStorageUri": "[if(variables('isMAG'), '.blob.core.usgovcloudapi.net', '.blob.core.windows.net')]", - "staticFhirServerConfigProperties": { - "APPINSIGHTS_PORTALINFO": "ASP.NETCORE", - "APPINSIGHTS_PROFILERFEATURE_VERSION": "1.0.0", - "APPINSIGHTS_SNAPSHOTFEATURE_VERSION": "1.0.0", - "WEBSITE_NODE_DEFAULT_VERSION": "6.9.4", - "KeyVault__Endpoint": "[variables('keyvaultEndpoint')]", - "FhirServer__Security__Enabled": "[variables('securityAuthenticationEnabled')]", - "FhirServer__Security__EnableAadSmartOnFhirProxy": "[parameters('enableAadSmartOnFhirProxy')]", - "FhirServer__Security__Authentication__Authority": "[parameters('securityAuthenticationAuthority')]", - "FhirServer__Security__Authentication__Audience": "[parameters('securityAuthenticationAudience')]", - "CosmosDb__ContinuationTokenSizeLimitInKb": "1", - "SqlServer__Initialize": "true", - "SqlServer__SchemaOptions__AutomaticUpdatesEnabled": "[parameters('sqlSchemaAutomaticUpdatesEnabled')]", - "DataStore": "SqlServer", - "FhirServer__Operations__Export__Enabled": "[parameters('enableExport')]", - "FhirServer__Operations__Export__StorageAccountUri": "[if(parameters('enableExport'), concat('https://', variables('storageAccountName'), variables('blobStorageUri')), 'null')]" - }, - "combinedFhirServerConfigProperties": "[union(variables('staticFhirServerConfigProperties'), parameters('additionalFhirServerConfigProperties'))]", - "computedSqlServerReference": "[concat('Microsoft.Sql/servers/', variables('serviceName'))]", - "storageAccountName": "[concat(substring(replace(variables('serviceName'), '-', ''), 0, min(11, length(replace(variables('serviceName'), '-', '')))), uniquestring(resourceGroup().id, variables('serviceName')))]", - "registryName": "healthplatformregistry.azurecr.io" - }, - "resources": [ - { - "condition": "[empty(parameters('appServicePlanResourceGroup'))]", - "apiVersion": "2019-08-01", - "name": "[variables('appServicePlanName')]", - "type": "Microsoft.Web/serverfarms", - "kind": "linux", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "name": "[variables('appServicePlanName')]", - "reserved": true - } - }, - { - "apiVersion": "2018-11-01", - "name": "[parameters('serviceName')]", - "type": "Microsoft.Web/sites", - "location": "[resourceGroup().location]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "identity": { - "type": "SystemAssigned" - }, - "properties": { - "name": "[parameters('serviceName')]", - "siteConfig": { - "appSettings": [ - { - "name": "DOCKER_REGISTRY_SERVER_URL", - "value": "[concat('https://', variables('registryName'))]" - }, - { - "name": "DOCKER_REGISTRY_SERVER_USERNAME", - "value": "" - }, - { - "name": "DOCKER_REGISTRY_SERVER_PASSWORD", - "value": "" - }, - { - "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", - "value": "true" - } - ] - }, - "serverFarmId": "[resourceId(variables('appServicePlanResourceGroup'), 'Microsoft.Web/serverfarms/', variables('appServicePlanName'))]", - "clientAffinityEnabled": false - }, - "dependsOn": [ - "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]" - ], - "resources": [ - { - "apiVersion": "2019-08-01", - "name": "appsettings", - "type": "config", - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]", - "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('serviceName'), 'SqlServer--ConnectionString')]" - ], - "properties": "[if(variables('deployAppInsights'), union(variables('combinedFhirServerConfigProperties'), json(concat('{\"ApplicationInsights__InstrumentationKey\": \"', reference(concat('Microsoft.Insights/components/', variables('appInsightsName'))).InstrumentationKey, '\"}'))), variables('combinedFhirServerConfigProperties'))]" - }, - { - "apiVersion": "2019-08-01", - "name": "web", - "type": "config", - "dependsOn": [ - "appsettings", - "[variables('appServiceResourceId')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]" - ], - "properties": { - "linuxFxVersion": "[concat('DOCKER|', variables('registryName'), '/', toLower(parameters('fhirVersion')), '_fhir-server',':', parameters('imageTag'))]", - "appCommandLine": "azure-fhir-api", - "alwaysOn": true - } - } - ] - }, - { - "apiVersion": "2015-05-01", - "name": "[variables('appInsightsName')]", - "type": "Microsoft.Insights/components", - "location": "[parameters('applicationInsightsLocation')]", - "condition": "[variables('deployAppInsights')]", - "kind": "web", - "tags": { - "[concat('hidden-link:', variables('appServiceResourceId'))]": "Resource", - "displayName": "AppInsightsComponent", - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "Application_Type": "web", - "ApplicationId": "[variables('serviceName')]" - } - }, - { - "name": "[variables('serviceName')]", - "type": "Microsoft.Sql/servers", - "apiVersion": "2015-05-01-preview", - "location": "[parameters('sqlLocation')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "administratorLogin": "fhirAdmin", - "administratorLoginPassword": "[parameters('sqlAdminPassword')]", - "version": "12.0" - }, - "resources": [ - { - "apiVersion": "2017-10-01-preview", - "dependsOn": [ - "[variables('serviceName')]" - ], - "location": "[parameters('sqlLocation')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "name": "FHIR", - "properties": { - "collation": "SQL_Latin1_General_CP1_CI_AS" - }, - "sku": { - "name": "Standard", - "tier": "Standard", - "capacity": 20 - }, - "type": "databases" - }, - { - "apiVersion": "2014-04-01", - "dependsOn": [ - "[variables('serviceName')]" - ], - "location": "[resourceGroup().location]", - "name": "AllowAllWindowsAzureIps", - "properties": { - "endIpAddress": "0.0.0.0", - "startIpAddress": "0.0.0.0" - }, - "type": "firewallrules" - } - ] - }, - { - "type": "Microsoft.KeyVault/vaults", - "name": "[variables('serviceName')]", - "apiVersion": "2015-06-01", - "location": "[resourceGroup().location]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "sku": { - "family": "A", - "name": "Standard" - }, - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "accessPolicies": [ - { - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "objectId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.principalId]", - "permissions": { - "secrets": [ - "get", - "list", - "set" - ] - } - } - ], - "enabledForDeployment": false - }, - "dependsOn": [ - "[variables('appServiceResourceId')]" - ] - }, - { - "type": "Microsoft.KeyVault/vaults/secrets", - "name": "[concat(variables('serviceName'), '/SqlServer--ConnectionString')]", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[concat('Server=tcp:', reference(variables('computedSqlServerReference'), '2015-05-01-preview').fullyQualifiedDomainName,',1433;Initial Catalog=FHIR;Persist Security Info=False;User ID=', reference(variables('computedSqlServerReference'), '2015-05-01-preview').administratorLogin,';Password=',parameters('sqlAdminPassword'),';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('serviceName'))]", - "[resourceId('Microsoft.Sql/servers', variables('serviceName'))]" - ] - }, - { - "name": "[variables('storageAccountName')]", - "type": "Microsoft.Storage/storageAccounts", - "apiVersion": "2019-06-01", - "location": "[resourceGroup().location]", - "properties": { - "supportsHttpsTrafficOnly": "true" - }, - "condition": "[parameters('enableExport')]", - "dependsOn": [], - "sku": { - "name": "Standard_LRS" - }, - "kind": "Storage", - "tags": {} - }, - { - "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments", - "apiVersion": "2018-09-01-preview", - "name": "[concat(variables('storageAccountName'), '/Microsoft.Authorization/', guid(variables('storageAccountName'), parameters('fhirVersion'), variables('serviceName')))]", - "condition": "[parameters('enableExport')]", - "dependsOn": [ - "[variables('storageAccountName')]", - "[variables('serviceName')]" - ], - "properties": { - "roleDefinitionId": "[variables('storageBlobDataContributerRoleId')]", - "principalId": "[reference(concat('Microsoft.Web/sites/', variables('serviceName')), '2018-11-01', 'full').identity.principalId]", - "principalType": "ServicePrincipal" - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-docker.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-docker.json deleted file mode 100644 index e4f9ea8f98..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-docker.json +++ /dev/null @@ -1,391 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "serviceName": { - "type": "string", - "minLength": 3, - "maxLength": 24, - "metadata": { - "description": "Name of the FHIR service Web App." - } - }, - "appServicePlanResourceGroup": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Resource group containing App Service Plan. If empty, deployment resource group is used." - } - }, - "appServicePlanName": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Name of App Service Plan (existing or new). If empty, a name will be generated." - } - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "D1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3", - "P4" - ], - "defaultValue": "S1" - }, - "securityAuthenticationAuthority": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "OAuth Authority" - } - }, - "securityAuthenticationAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Audience (aud) to validate in JWT" - } - }, - "enableAadSmartOnFhirProxy": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Enable Azure AAD SMART on FHIR Proxy" - } - }, - "msdeployPackageUrl": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Webdeploy package to use as depoyment code. If blank, the latest code package will be deployed." - } - }, - "cosmosDbAccountConsistencyPolicy": { - "type": "object", - "defaultValue": { - "defaultConsistencyLevel": "Strong" - }, - "metadata": { - "description": "An object representing the default consistency policy for the Cosmos DB account. See https://docs.microsoft.com/en-us/azure/templates/microsoft.documentdb/databaseaccounts#ConsistencyPolicy" - } - }, - "deployApplicationInsights": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Deploy Application Insights for the FHIR server." - } - }, - "applicationInsightsLocation": { - "type": "string", - "defaultValue": "eastus", - "allowedValues": [ - "southeastasia", - "northeurope", - "westeurope", - "eastus", - "southcentralus", - "westus2", - "usgovvirginia", - "usgovarizona" - ] - }, - "additionalFhirServerConfigProperties": { - "type": "object", - "defaultValue": { - }, - "metadata": { - "description": "Additional configuration properties for the FHIR server. In the form {\"path1\":\"value1\",\"path2\":\"value2\"}" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerCosmosDB", - "metadata": { - "description": "The type of the solution" - } - }, - "fhirVersion": { - "type": "string", - "defaultValue": "R4", - "allowedValues": [ - "Stu3", - "R4", - "R5" - ], - "metadata": { - "description": "Only applies when MsdeployPackageUrl is not specified." - } - }, - "imageTag": { - "type": "string", - "defaultValue": "release", - "metadata": { - "description": "Tag of the docker image to deploy." - } - }, - "enableExport": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Determines whether export will be enabled for this fhir instance. If true, a storage account will be created as part of the deployment. You will need owner or user-administrator permissions for this." - } - } - }, - "variables": { - "isMAG": "[or(contains(resourceGroup().location,'usgov'),contains(resourceGroup().location,'usdod'))]", - "serviceName": "[toLower(parameters('serviceName'))]", - "keyvaultEndpoint": "[if(variables('isMAG'), concat('https://', variables('serviceName'), '.vault.usgovcloudapi.net/'), concat('https://', variables('serviceName'), '.vault.azure.net/'))]", - "appServicePlanResourceGroup": "[if(empty(parameters('appServicePlanResourceGroup')), resourceGroup().name, parameters('appServicePlanResourceGroup'))]", - "appServicePlanName": "[if(empty(parameters('appServicePlanName')),concat(variables('serviceName'),'-asp'),parameters('appServicePlanName'))]", - "appServiceResourceId": "[resourceId('Microsoft.Web/sites', variables('serviceName'))]", - "securityAuthenticationEnabled": "[and(not(empty(parameters('securityAuthenticationAuthority'))),not(empty(parameters('securityAuthenticationAudience'))))]", - "deployAppInsights": "[parameters('deployApplicationInsights')]", - "appInsightsName": "[concat('AppInsights-', variables('serviceName'))]", - "storageBlobDataContributerRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", - "blobStorageUri": "[if(variables('isMAG'), '.blob.core.usgovcloudapi.net', '.blob.core.windows.net')]", - "staticFhirServerConfigProperties": { - "APPINSIGHTS_PORTALINFO": "ASP.NETCORE", - "APPINSIGHTS_PROFILERFEATURE_VERSION": "1.0.0", - "APPINSIGHTS_SNAPSHOTFEATURE_VERSION": "1.0.0", - "WEBSITE_NODE_DEFAULT_VERSION": "6.9.4", - "KeyVault__Endpoint": "[variables('keyvaultEndpoint')]", - "FhirServer__Security__Enabled": "[variables('securityAuthenticationEnabled')]", - "FhirServer__Security__EnableAadSmartOnFhirProxy": "[parameters('enableAadSmartOnFhirProxy')]", - "FhirServer__Security__Authentication__Authority": "[parameters('securityAuthenticationAuthority')]", - "FhirServer__Security__Authentication__Audience": "[parameters('securityAuthenticationAudience')]", - "CosmosDb__ContinuationTokenSizeLimitInKb": "1", - "DataStore": "CosmosDb", - "FhirServer__Operations__Export__Enabled": "[parameters('enableExport')]", - "FhirServer__Operations__Export__StorageAccountUri": "[if(parameters('enableExport'), concat('https://', variables('storageAccountName'), variables('blobStorageUri')), 'null')]" - }, - "combinedFhirServerConfigProperties": "[union(variables('staticFhirServerConfigProperties'), parameters('additionalFhirServerConfigProperties'))]", - "storageAccountName": "[concat(substring(replace(variables('serviceName'), '-', ''), 0, min(11, length(replace(variables('serviceName'), '-', '')))), uniquestring(resourceGroup().id, variables('serviceName')))]", - "registryName": "healthplatformregistry.azurecr.io" - }, - "resources": [ - { - "condition": "[empty(parameters('appServicePlanResourceGroup'))]", - "apiVersion": "2019-08-01", - "name": "[variables('appServicePlanName')]", - "type": "Microsoft.Web/serverfarms", - "kind": "linux", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "name": "[variables('appServicePlanName')]", - "reserved": true - } - }, - { - "apiVersion": "2018-11-01", - "type": "Microsoft.Web/sites", - "name": "[variables('serviceName')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "identity": { - "type": "SystemAssigned" - }, - "properties": { - "name": "[parameters('serviceName')]", - "siteConfig": { - "appSettings": [ - { - "name": "DOCKER_REGISTRY_SERVER_URL", - "value": "[concat('https://', variables('registryName'))]" - }, - { - "name": "DOCKER_REGISTRY_SERVER_USERNAME", - "value": "" - }, - { - "name": "DOCKER_REGISTRY_SERVER_PASSWORD", - "value": "" - }, - { - "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", - "value": "true" - } - ] - }, - "serverFarmId": "[resourceId(variables('appServicePlanResourceGroup'), 'Microsoft.Web/serverfarms/', variables('appServicePlanName'))]", - "clientAffinityEnabled": false - }, - "dependsOn": [ - "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]" - ], - "resources": [ - { - "apiVersion": "2019-08-01", - "name": "appsettings", - "type": "config", - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]", - "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('serviceName'), 'CosmosDb--Host')]" - ], - "properties": "[if(variables('deployAppInsights'), union(variables('combinedFhirServerConfigProperties'), json(concat('{\"ApplicationInsights__InstrumentationKey\": \"', reference(concat('Microsoft.Insights/components/', variables('appInsightsName'))).InstrumentationKey, '\"}'))), variables('combinedFhirServerConfigProperties'))]" - }, - { - "apiVersion": "2019-08-01", - "name": "web", - "type": "config", - "dependsOn": [ - "appsettings", - "[variables('appServiceResourceId')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]" - ], - "properties": { - "linuxFxVersion": "[concat('DOCKER|', variables('registryName'), '/', toLower(parameters('fhirVersion')), '_fhir-server',':', parameters('imageTag'))]", - "appCommandLine": "azure-fhir-api", - "alwaysOn": true - } - } - ] - }, - { - "apiVersion": "2015-05-01", - "name": "[variables('appInsightsName')]", - "type": "Microsoft.Insights/components", - "location": "[parameters('applicationInsightsLocation')]", - "condition": "[variables('deployAppInsights')]", - "kind": "web", - "tags": { - "[concat('hidden-link:', variables('appServiceResourceId'))]": "Resource", - "displayName": "AppInsightsComponent", - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "Application_Type": "web", - "ApplicationId": "[variables('serviceName')]" - } - }, - { - "apiVersion": "2015-04-08", - "type": "Microsoft.DocumentDB/databaseAccounts", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "name": "[variables('serviceName')]", - "location": "[resourceGroup().location]", - "properties": { - "name": "[variables('serviceName')]", - "databaseAccountOfferType": "Standard", - "consistencyPolicy": "[parameters('cosmosDbAccountConsistencyPolicy')]", - "locations": [ - { - "locationName": "[resourceGroup().location]", - "failoverPriority": 0 - } - ] - } - }, - { - "type": "Microsoft.KeyVault/vaults", - "name": "[variables('serviceName')]", - "apiVersion": "2015-06-01", - "location": "[resourceGroup().location]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "sku": { - "family": "A", - "name": "Standard" - }, - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "accessPolicies": [ - { - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "objectId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.principalId]", - "permissions": { - "secrets": [ - "get", - "list", - "set" - ] - } - } - ], - "enabledForDeployment": false - }, - "dependsOn": [ - "[variables('appServiceResourceId')]" - ] - }, - { - "type": "Microsoft.KeyVault/vaults/secrets", - "name": "[concat(variables('serviceName'), '/CosmosDb--Host')]", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[reference(concat('Microsoft.DocumentDb/databaseAccounts/', variables('serviceName'))).documentEndpoint]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('serviceName'))]", - "[resourceId('Microsoft.DocumentDb/databaseAccounts', variables('serviceName'))]" - ] - }, - { - "type": "Microsoft.KeyVault/vaults/secrets", - "name": "[concat(variables('serviceName'), '/CosmosDb--Key')]", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[listKeys(resourceId('Microsoft.DocumentDb/databaseAccounts', variables('serviceName')), '2015-04-08').primaryMasterKey]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('serviceName'))]", - "[resourceId('Microsoft.DocumentDb/databaseAccounts', variables('serviceName'))]" - ] - }, - { - "name": "[variables('storageAccountName')]", - "type": "Microsoft.Storage/storageAccounts", - "apiVersion": "2019-06-01", - "location": "[resourceGroup().location]", - "properties": { - "supportsHttpsTrafficOnly": "true" - }, - "condition": "[parameters('enableExport')]", - "dependsOn": [], - "sku": { - "name": "Standard_LRS" - }, - "kind": "Storage", - "tags": {} - }, - { - "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments", - "apiVersion": "2018-09-01-preview", - "name": "[concat(variables('storageAccountName'), '/Microsoft.Authorization/', guid(variables('storageAccountName'), parameters('fhirVersion'), variables('serviceName')))]", - "condition": "[parameters('enableExport')]", - "dependsOn": [ - "[variables('storageAccountName')]", - "[variables('serviceName')]" - ], - "properties": { - "roleDefinitionId": "[variables('storageBlobDataContributerRoleId')]", - "principalId": "[reference(concat('Microsoft.Web/sites/', variables('serviceName')), '2018-11-01', 'full').identity.principalId]", - "principalType": "ServicePrincipal" - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-sql.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-sql.json deleted file mode 100644 index 975a40a32e..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy-sql.json +++ /dev/null @@ -1,403 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "serviceName": { - "type": "string", - "minLength": 3, - "maxLength": 24, - "metadata": { - "description": "Name of the FHIR service Web App." - } - }, - "appServicePlanResourceGroup": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Resource group containing App Service Plan. If empty, deployment resource group is used." - } - }, - "appServicePlanName": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Name of App Service Plan (existing or new). If empty, a name will be generated." - } - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "D1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3", - "P4" - ], - "defaultValue": "S1" - }, - "securityAuthenticationAuthority": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "OAuth Authority" - } - }, - "securityAuthenticationAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Audience (aud) to validate in JWT" - } - }, - "enableAadSmartOnFhirProxy": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Enable Azure AAD SMART on FHIR Proxy" - } - }, - "msdeployPackageUrl": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Webdeploy package to use as depoyment code. If blank, the latest code package will be deployed." - } - }, - "deployApplicationInsights": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Deploy Application Insights for the FHIR server." - } - }, - "applicationInsightsLocation": { - "type": "string", - "defaultValue": "eastus", - "allowedValues": [ - "southeastasia", - "northeurope", - "westeurope", - "eastus", - "southcentralus", - "westus2", - "usgovvirginia", - "usgovarizona" - ] - }, - "additionalFhirServerConfigProperties": { - "type": "object", - "defaultValue": { - }, - "metadata": { - "description": "Additional configuration properties for the FHIR server. In the form {\"path1\":\"value1\",\"path2\":\"value2\"}" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSqlServer", - "metadata": { - "description": "The type of the solution" - } - }, - "sqlAdminPassword": { - "type": "securestring", - "metadata": { - "description": "The password for the sql admin user if using SQL server." - } - }, - "sqlLocation": { - "type": "string", - "defaultValue": "[resourceGroup().location]", - "metadata": { - "description": "An override location for the sql server database." - } - }, - "fhirVersion": { - "type": "string", - "defaultValue": "R4", - "allowedValues": [ - "Stu3", - "R4", - "R5" - ], - "metadata": { - "description": "Only applies when MsdeployPackageUrl is not specified." - } - }, - "enableExport": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Determines whether export will be enabled for this fhir instance. If true, a storage account will be created as part of the deployment. You will need owner or user-administrator permissions for this." - } - }, - "sqlSchemaAutomaticUpdatesEnabled": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Determine whether the sql schema should be automatically upgraded on server startup" - } - } - }, - "variables": { - "defaultMsdeployPackageUrl": "[concat('https://fhirserverforazure.blob.core.windows.net/builds/ci/Microsoft.Health.Fhir.', parameters('fhirVersion'),'.Web.zip')]", - "isMAG": "[or(contains(resourceGroup().location,'usgov'),contains(resourceGroup().location,'usdod'))]", - "serviceName": "[toLower(parameters('serviceName'))]", - "keyvaultEndpoint": "[if(variables('isMAG'), concat('https://', variables('serviceName'), '.vault.usgovcloudapi.net/'), concat('https://', variables('serviceName'), '.vault.azure.net/'))]", - "appServicePlanResourceGroup": "[if(empty(parameters('appServicePlanResourceGroup')), resourceGroup().name, parameters('appServicePlanResourceGroup'))]", - "appServicePlanName": "[if(empty(parameters('appServicePlanName')),concat(variables('serviceName'),'-asp'),parameters('appServicePlanName'))]", - "appServiceResourceId": "[resourceId('Microsoft.Web/sites', variables('serviceName'))]", - "securityAuthenticationEnabled": "[and(not(empty(parameters('securityAuthenticationAuthority'))),not(empty(parameters('securityAuthenticationAudience'))))]", - "msdeployPackageUrlToUse": "[if(empty(parameters('msdeployPackageUrl')),variables('defaultMsdeployPackageUrl'),parameters('msdeployPackageUrl'))]", - "deployAppInsights": "[parameters('deployApplicationInsights')]", - "appInsightsName": "[concat('AppInsights-', variables('serviceName'))]", - "storageBlobDataContributerRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", - "blobStorageUri": "[if(variables('isMAG'), '.blob.core.usgovcloudapi.net', '.blob.core.windows.net')]", - "staticFhirServerConfigProperties": { - "APPINSIGHTS_PORTALINFO": "ASP.NETCORE", - "APPINSIGHTS_PROFILERFEATURE_VERSION": "1.0.0", - "APPINSIGHTS_SNAPSHOTFEATURE_VERSION": "1.0.0", - "WEBSITE_NODE_DEFAULT_VERSION": "6.9.4", - "KeyVault:Endpoint": "[variables('keyvaultEndpoint')]", - "FhirServer:Security:Enabled": "[variables('securityAuthenticationEnabled')]", - "FhirServer:Security:EnableAadSmartOnFhirProxy": "[parameters('enableAadSmartOnFhirProxy')]", - "FhirServer:Security:Authentication:Authority": "[parameters('securityAuthenticationAuthority')]", - "FhirServer:Security:Authentication:Audience": "[parameters('securityAuthenticationAudience')]", - "CosmosDb:ContinuationTokenSizeLimitInKb": "1", - "SqlServer:Initialize": "true", - "SqlServer:SchemaOptions:AutomaticUpdatesEnabled": "[parameters('sqlSchemaAutomaticUpdatesEnabled')]", - "DataStore": "SqlServer", - "FhirServer:Operations:Export:Enabled": "[parameters('enableExport')]", - "FhirServer:Operations:Export:StorageAccountUri": "[if(parameters('enableExport'), concat('https://', variables('storageAccountName'), variables('blobStorageUri')), 'null')]" - }, - "combinedFhirServerConfigProperties": "[union(variables('staticFhirServerConfigProperties'), parameters('additionalFhirServerConfigProperties'))]", - "computedSqlServerReference": "[concat('Microsoft.Sql/servers/', variables('serviceName'))]", - "storageAccountName": "[concat(substring(replace(variables('serviceName'), '-', ''), 0, min(11, length(replace(variables('serviceName'), '-', '')))), uniquestring(resourceGroup().id, variables('serviceName')))]" - }, - "resources": [ - { - "condition": "[empty(parameters('appServicePlanResourceGroup'))]", - "apiVersion": "2015-08-01", - "name": "[variables('appServicePlanName')]", - "type": "Microsoft.Web/serverfarms", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "name": "[variables('appServicePlanName')]" - } - }, - { - "apiVersion": "2015-08-01", - "type": "Microsoft.Web/sites", - "name": "[variables('serviceName')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "identity": { - "type": "SystemAssigned" - }, - "properties": { - "clientAffinityEnabled": false, - "serverFarmId": "[resourceId(variables('appServicePlanResourceGroup'), 'Microsoft.Web/serverfarms/', variables('appServicePlanName'))]" - }, - "dependsOn": [ - "[if(empty(parameters('appServicePlanResourceGroup')), resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName')), resourceId('Microsoft.Sql/servers', variables('serviceName')))]" - ], - "resources": [ - { - "apiVersion": "2015-08-01", - "name": "appsettings", - "type": "config", - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[concat(variables('appServiceResourceId'), '/Extensions/MSDeploy')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]" - ], - "properties": "[if(variables('deployAppInsights'), union(variables('combinedFhirServerConfigProperties'), json(concat('{\"ApplicationInsights:InstrumentationKey\": \"', reference(concat('Microsoft.Insights/components/', variables('appInsightsName'))).InstrumentationKey, '\"}'))), variables('combinedFhirServerConfigProperties'))]" - }, - { - "apiVersion": "2015-08-01", - "type": "extensions", - "name": "MSDeploy", - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[concat(variables('appServiceResourceId'), '/siteextensions/AspNetCoreRuntime.3.1.x86')]" - ], - "properties": { - "packageUri": "[variables('msdeployPackageUrlToUse')]" - } - }, - { - "type": "siteextensions", - "name": "AspNetCoreRuntime.3.1.x86", - "apiVersion": "2015-04-01", - "location": "[resourceGroup().location]", - "properties": { - "version": "3.1.6" - }, - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]", - "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('serviceName'), 'SqlServer--ConnectionString')]" - ] - } - ] - }, - { - "apiVersion": "2015-05-01", - "name": "[variables('appInsightsName')]", - "type": "Microsoft.Insights/components", - "location": "[parameters('applicationInsightsLocation')]", - "condition": "[variables('deployAppInsights')]", - "kind": "web", - "tags": { - "[concat('hidden-link:', variables('appServiceResourceId'))]": "Resource", - "displayName": "AppInsightsComponent", - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "Application_Type": "web", - "ApplicationId": "[variables('serviceName')]" - } - }, - { - "name": "[variables('serviceName')]", - "type": "Microsoft.Sql/servers", - "apiVersion": "2015-05-01-preview", - "location": "[parameters('sqlLocation')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "administratorLogin": "fhirAdmin", - "administratorLoginPassword": "[parameters('sqlAdminPassword')]", - "version": "12.0" - }, - "resources": [ - { - "apiVersion": "2017-10-01-preview", - "dependsOn": [ - "[variables('serviceName')]" - ], - "location": "[parameters('sqlLocation')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "name": "FHIR", - "properties": { - "collation": "SQL_Latin1_General_CP1_CI_AS" - }, - "sku": { - "name": "Standard", - "tier": "Standard", - "capacity": 20 - }, - "type": "databases" - }, - { - "apiVersion": "2014-04-01", - "dependsOn": [ - "[variables('serviceName')]" - ], - "location": "[resourceGroup().location]", - "name": "AllowAllWindowsAzureIps", - "properties": { - "endIpAddress": "0.0.0.0", - "startIpAddress": "0.0.0.0" - }, - "type": "firewallrules" - } - ] - }, - { - "type": "Microsoft.KeyVault/vaults", - "name": "[variables('serviceName')]", - "apiVersion": "2015-06-01", - "location": "[resourceGroup().location]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "sku": { - "family": "A", - "name": "Standard" - }, - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "accessPolicies": [ - { - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "objectId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.principalId]", - "permissions": { - "secrets": [ - "get", - "list", - "set" - ] - } - } - ], - "enabledForDeployment": false - }, - "dependsOn": [ - "[variables('appServiceResourceId')]" - ] - }, - { - "type": "Microsoft.KeyVault/vaults/secrets", - "name": "[concat(variables('serviceName'), '/SqlServer--ConnectionString')]", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[concat('Server=tcp:', reference(variables('computedSqlServerReference'), '2015-05-01-preview').fullyQualifiedDomainName,',1433;Initial Catalog=FHIR;Persist Security Info=False;User ID=', reference(variables('computedSqlServerReference'), '2015-05-01-preview').administratorLogin,';Password=',parameters('sqlAdminPassword'),';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('serviceName'))]", - "[resourceId('Microsoft.Sql/servers', variables('serviceName'))]" - ] - }, - { - "name": "[variables('storageAccountName')]", - "type": "Microsoft.Storage/storageAccounts", - "apiVersion": "2019-06-01", - "location": "[resourceGroup().location]", - "properties": { - "supportsHttpsTrafficOnly": "true" - }, - "condition": "[parameters('enableExport')]", - "dependsOn": [], - "sku": { - "name": "Standard_LRS" - }, - "kind": "Storage", - "tags": {} - }, - { - "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments", - "apiVersion": "2018-09-01-preview", - "name": "[concat(variables('storageAccountName'), '/Microsoft.Authorization/', guid(uniqueString(variables('storageAccountName'), parameters('fhirVersion'), variables('serviceName'))))]", - "condition": "[parameters('enableExport')]", - "dependsOn": [ - "[variables('storageAccountName')]", - "[variables('serviceName')]" - ], - "properties": { - "roleDefinitionId": "[variables('storageBlobDataContributerRoleId')]", - "principalId": "[reference(concat('Microsoft.Web/sites/', variables('serviceName')), '2018-11-01', 'full').identity.principalId]", - "principalType": "ServicePrincipal" - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy.json deleted file mode 100644 index 8920e145af..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/scripts/fhir-server/samples/templates/default-azuredeploy.json +++ /dev/null @@ -1,387 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "serviceName": { - "type": "string", - "minLength": 3, - "maxLength": 24, - "metadata": { - "description": "Name of the FHIR service Web App." - } - }, - "appServicePlanResourceGroup": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Resource group containing App Service Plan. If empty, deployment resource group is used." - } - }, - "appServicePlanName": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Name of App Service Plan (existing or new). If empty, a name will be generated." - } - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "D1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3", - "P4" - ], - "defaultValue": "S1" - }, - "securityAuthenticationAuthority": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "OAuth Authority" - } - }, - "securityAuthenticationAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Audience (aud) to validate in JWT" - } - }, - "enableAadSmartOnFhirProxy": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Enable Azure AAD SMART on FHIR Proxy" - } - }, - "msdeployPackageUrl": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Webdeploy package to use as depoyment code. If blank, the latest code package will be deployed." - } - }, - "cosmosDbAccountConsistencyPolicy": { - "type": "object", - "defaultValue": { - "defaultConsistencyLevel": "Strong" - }, - "metadata": { - "description": "An object representing the default consistency policy for the Cosmos DB account. See https://docs.microsoft.com/en-us/azure/templates/microsoft.documentdb/databaseaccounts#ConsistencyPolicy" - } - }, - "cosmosDbFreeTier": { - "type": "string", - "allowedValues": [ - "Yes", - "No" - ], - "defaultValue": "No", - "metadata": { - "description": "Use Cosmos DB free tier." - } - }, - "deployApplicationInsights": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Deploy Application Insights for the FHIR server." - } - }, - "applicationInsightsLocation": { - "type": "string", - "defaultValue": "eastus", - "allowedValues": [ - "southeastasia", - "northeurope", - "westeurope", - "eastus", - "southcentralus", - "westus2", - "usgovvirginia", - "usgovarizona" - ] - }, - "additionalFhirServerConfigProperties": { - "type": "object", - "defaultValue": { - }, - "metadata": { - "description": "Additional configuration properties for the FHIR server. In the form {\"path1\":\"value1\",\"path2\":\"value2\"}" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerCosmosDB", - "metadata": { - "description": "The type of the solution" - } - }, - "fhirVersion": { - "type": "string", - "defaultValue": "R4", - "allowedValues": [ - "Stu3", - "R4", - "R5" - ], - "metadata": { - "description": "Only applies when MsdeployPackageUrl is not specified." - } - }, - "enableExport": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Determines whether export will be enabled for this fhir instance. If true, a storage account will be created as part of the deployment. You will need owner or user-administrator permissions for this." - } - } - }, - "variables": { - "defaultMsdeployPackageUrl": "[concat('https://fhirserverforazure.blob.core.windows.net/builds/ci/Microsoft.Health.Fhir.', parameters('fhirVersion'),'.Web.zip')]", - "isMAG": "[or(contains(resourceGroup().location,'usgov'),contains(resourceGroup().location,'usdod'))]", - "isCosmosDbFreeTier": "[equals(parameters('cosmosDbFreeTier'),'Yes')]", - "serviceName": "[toLower(parameters('serviceName'))]", - "keyvaultEndpoint": "[if(variables('isMAG'), concat('https://', variables('serviceName'), '.vault.usgovcloudapi.net/'), concat('https://', variables('serviceName'), '.vault.azure.net/'))]", - "appServicePlanResourceGroup": "[if(empty(parameters('appServicePlanResourceGroup')), resourceGroup().name, parameters('appServicePlanResourceGroup'))]", - "appServicePlanName": "[if(empty(parameters('appServicePlanName')),concat(variables('serviceName'),'-asp'),parameters('appServicePlanName'))]", - "appServiceResourceId": "[resourceId('Microsoft.Web/sites', variables('serviceName'))]", - "securityAuthenticationEnabled": "[and(not(empty(parameters('securityAuthenticationAuthority'))),not(empty(parameters('securityAuthenticationAudience'))))]", - "msdeployPackageUrlToUse": "[if(empty(parameters('msdeployPackageUrl')),variables('defaultMsdeployPackageUrl'),parameters('msdeployPackageUrl'))]", - "deployAppInsights": "[parameters('deployApplicationInsights')]", - "appInsightsName": "[concat('AppInsights-', variables('serviceName'))]", - "storageBlobDataContributerRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", - "blobStorageUri": "[if(variables('isMAG'), '.blob.core.usgovcloudapi.net', '.blob.core.windows.net')]", - "staticFhirServerConfigProperties": { - "APPINSIGHTS_PORTALINFO": "ASP.NETCORE", - "APPINSIGHTS_PROFILERFEATURE_VERSION": "1.0.0", - "APPINSIGHTS_SNAPSHOTFEATURE_VERSION": "1.0.0", - "WEBSITE_NODE_DEFAULT_VERSION": "6.9.4", - "KeyVault:Endpoint": "[variables('keyvaultEndpoint')]", - "FhirServer:CosmosDb:InitialCollectionThroughput": "[if(variables('isCosmosDbFreeTier'), '400', '1000')]", - "FhirServer:Security:Enabled": "[variables('securityAuthenticationEnabled')]", - "FhirServer:Security:EnableAadSmartOnFhirProxy": "[parameters('enableAadSmartOnFhirProxy')]", - "FhirServer:Security:Authentication:Authority": "[parameters('securityAuthenticationAuthority')]", - "FhirServer:Security:Authentication:Audience": "[parameters('securityAuthenticationAudience')]", - "CosmosDb:ContinuationTokenSizeLimitInKb": "1", - "DataStore": "CosmosDb", - "FhirServer:Operations:Export:Enabled": "[parameters('enableExport')]", - "FhirServer:Operations:Export:StorageAccountUri": "[if(parameters('enableExport'), concat('https://', variables('storageAccountName'), variables('blobStorageUri')), 'null')]" - }, - "combinedFhirServerConfigProperties": "[union(variables('staticFhirServerConfigProperties'), parameters('additionalFhirServerConfigProperties'))]", - "storageAccountName": "[concat(substring(replace(variables('serviceName'), '-', ''), 0, min(11, length(replace(variables('serviceName'), '-', '')))), uniquestring(resourceGroup().id, variables('serviceName')))]" - }, - "resources": [ - { - "condition": "[empty(parameters('appServicePlanResourceGroup'))]", - "apiVersion": "2015-08-01", - "name": "[variables('appServicePlanName')]", - "type": "Microsoft.Web/serverfarms", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "name": "[variables('appServicePlanName')]" - } - }, - { - "apiVersion": "2015-08-01", - "type": "Microsoft.Web/sites", - "name": "[variables('serviceName')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "identity": { - "type": "SystemAssigned" - }, - "properties": { - "clientAffinityEnabled": false, - "serverFarmId": "[resourceId(variables('appServicePlanResourceGroup'), 'Microsoft.Web/serverfarms/', variables('appServicePlanName'))]" - }, - "dependsOn": [ - "[if(empty(parameters('appServicePlanResourceGroup')), resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName')), resourceId('Microsoft.DocumentDB/databaseAccounts', variables('serviceName')))]" - ], - "resources": [ - { - "apiVersion": "2015-08-01", - "name": "appsettings", - "type": "config", - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[concat(variables('appServiceResourceId'), '/Extensions/MSDeploy')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]" - ], - "properties": "[if(variables('deployAppInsights'), union(variables('combinedFhirServerConfigProperties'), json(concat('{\"ApplicationInsights:InstrumentationKey\": \"', reference(concat('Microsoft.Insights/components/', variables('appInsightsName'))).InstrumentationKey, '\"}'))), variables('combinedFhirServerConfigProperties'))]" - }, - { - "apiVersion": "2015-08-01", - "type": "extensions", - "name": "MSDeploy", - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[concat(variables('appServiceResourceId'), '/siteextensions/AspNetCoreRuntime.3.1.x86')]", - "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('serviceName'), 'CosmosDb--Host')]" - ], - "properties": { - "packageUri": "[variables('msdeployPackageUrlToUse')]" - } - }, - { - "type": "siteextensions", - "name": "AspNetCoreRuntime.3.1.x86", - "apiVersion": "2015-04-01", - "location": "[resourceGroup().location]", - "properties": { - "version": "3.1.6" - }, - "dependsOn": [ - "[variables('appServiceResourceId')]", - "[if(variables('deployAppInsights'),concat('Microsoft.Insights/components/', variables('appInsightsName')),resourceId('Microsoft.KeyVault/vaults', variables('serviceName')))]" - ] - } - ] - }, - { - "apiVersion": "2015-05-01", - "name": "[variables('appInsightsName')]", - "type": "Microsoft.Insights/components", - "location": "[parameters('applicationInsightsLocation')]", - "condition": "[variables('deployAppInsights')]", - "kind": "web", - "tags": { - "[concat('hidden-link:', variables('appServiceResourceId'))]": "Resource", - "displayName": "AppInsightsComponent", - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "Application_Type": "web", - "ApplicationId": "[variables('serviceName')]" - } - }, - { - "apiVersion": "2015-04-08", - "type": "Microsoft.DocumentDB/databaseAccounts", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "name": "[variables('serviceName')]", - "location": "[resourceGroup().location]", - "properties": { - "name": "[variables('serviceName')]", - "databaseAccountOfferType": "Standard", - "consistencyPolicy": "[parameters('cosmosDbAccountConsistencyPolicy')]", - "locations": [ - { - "locationName": "[resourceGroup().location]", - "failoverPriority": 0 - } - ], - "enableFreeTier": "[variables('isCosmosDbFreeTier')]" - } - }, - { - "type": "Microsoft.KeyVault/vaults", - "name": "[variables('serviceName')]", - "apiVersion": "2015-06-01", - "location": "[resourceGroup().location]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "sku": { - "family": "A", - "name": "Standard" - }, - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "accessPolicies": [ - { - "tenantId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.tenantId]", - "objectId": "[reference(variables('appServiceResourceId'), '2015-08-01', 'Full').Identity.principalId]", - "permissions": { - "secrets": [ - "get", - "list", - "set" - ] - } - } - ], - "enabledForDeployment": false - }, - "dependsOn": [ - "[variables('appServiceResourceId')]" - ] - }, - { - "type": "Microsoft.KeyVault/vaults/secrets", - "name": "[concat(variables('serviceName'), '/CosmosDb--Host')]", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[reference(concat('Microsoft.DocumentDb/databaseAccounts/', variables('serviceName'))).documentEndpoint]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('serviceName'))]", - "[resourceId('Microsoft.DocumentDb/databaseAccounts', variables('serviceName'))]" - ] - }, - { - "type": "Microsoft.KeyVault/vaults/secrets", - "name": "[concat(variables('serviceName'), '/CosmosDb--Key')]", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[listKeys(resourceId('Microsoft.DocumentDb/databaseAccounts', variables('serviceName')), '2015-04-08').primaryMasterKey]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('serviceName'))]", - "[resourceId('Microsoft.DocumentDb/databaseAccounts', variables('serviceName'))]" - ] - }, - { - "name": "[variables('storageAccountName')]", - "type": "Microsoft.Storage/storageAccounts", - "apiVersion": "2019-06-01", - "location": "[resourceGroup().location]", - "properties": { - "supportsHttpsTrafficOnly": "true" - }, - "condition": "[parameters('enableExport')]", - "dependsOn": [], - "sku": { - "name": "Standard_LRS" - }, - "kind": "Storage", - "tags": {} - }, - { - "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments", - "apiVersion": "2018-09-01-preview", - "name": "[concat(variables('storageAccountName'), '/Microsoft.Authorization/', guid(uniqueString(variables('storageAccountName'), parameters('fhirVersion'), variables('serviceName'))))]", - "condition": "[parameters('enableExport')]", - "dependsOn": [ - "[variables('storageAccountName')]", - "[variables('serviceName')]" - ], - "properties": { - "roleDefinitionId": "[variables('storageBlobDataContributerRoleId')]", - "principalId": "[reference(concat('Microsoft.Web/sites/', variables('serviceName')), '2018-11-01', 'full').identity.principalId]", - "principalType": "ServicePrincipal" - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-aci-importer.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-aci-importer.json deleted file mode 100644 index 08c7404dfe..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-aci-importer.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "appName": { - "type": "string", - "metadata": { - "description": "The name of the function app." - } - }, - "storageAccountType": { - "type": "string", - "defaultValue": "Standard_LRS", - "allowedValues": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS" - ], - "metadata": { - "description": "Storage Account type" - } - }, - "location": { - "type": "string", - "defaultValue": "[resourceGroup().location]", - "metadata": { - "description": "Location for all resources." - } - }, - "aadAuthority": { - "type": "string", - "defaultValue": "https://login.microsoftonline.com/common", - "metadata": { - "description": "OAuth Authority" - } - }, - "aadAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "OAuth Audience, if blank, will be set to fhirServerUrl" - } - }, - "aadServiceClientId": { - "type": "string", - "metadata": { - "description": "AAD service client application id" - } - }, - "aadServiceClientSecret": { - "type": "securestring", - "metadata": { - "description": "AAD service client secret" - } - }, - "fhirServerUrl": { - "type": "string", - "metadata": { - "description": "FHIR Server URL (also Audience used for resource application)" - } - }, - "containerImage": { - "type": "string", - "defaultValue": "hansenms/fhirimporter", - "metadata": { - "description": "Container image" - } - }, - "cpuCores": { - "type": "int", - "defaultValue": 2, - "metadata": { - "description": "Number of CPU cores" - } - }, - "memoryGb": { - "type": "int", - "defaultValue": 4, - "metadata": { - "description": "Memory in GB" - } - }, - "maxDegreeOfParallelism": { - "type": "int", - "defaultValue": 16, - "metadata": { - "description": "Maximum number of concurrent HTTP requests in each function" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSamples", - "metadata": { - "description": "The type of the solution" - } - } - }, - "variables": { - "applicationInsightsName": "[parameters('appName')]", - "storageAccountName": "[replace(concat(toLower(parameters('appName')), 'sa'),'-','')]", - "storageAccountid": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]", - "aadAudience": "[if(empty(parameters('aadAudience')),parameters('fhirServerUrl'),parameters('aadAudience'))]" - }, - "resources": [ - { - "type": "Microsoft.Storage/storageAccounts", - "name": "[variables('storageAccountName')]", - "apiVersion": "2016-12-01", - "location": "[parameters('location')]", - "kind": "Storage", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "sku": { - "name": "[parameters('storageAccountType')]" - }, - "resources": [ - { - "type": "blobServices/containers", - "apiVersion": "2018-03-01-preview", - "name": "default/fhirimport", - "dependsOn": [ - "[variables('storageAccountName')]" - ], - "properties": { - "publicAccess": "None" - } - }, - { - "type": "blobServices/containers", - "apiVersion": "2018-03-01-preview", - "name": "default/fhirrejected", - "dependsOn": [ - "[variables('storageAccountName')]" - ], - "properties": { - "publicAccess": "None" - } - } - ] - }, - { - "apiVersion": "2018-05-01-preview", - "name": "[variables('applicationInsightsName')]", - "type": "Microsoft.insights/components", - "location": "East US", - "tags": { - "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('applicationInsightsName'))]": "Resource", - "FhirServerSolution": "[parameters('solutionType')]" - }, - "properties": { - "ApplicationId": "[variables('applicationInsightsName')]", - "Request_Source": "IbizaWebAppExtensionCreate" - } - }, - { - "name": "[parameters('appName')]", - "type": "Microsoft.ContainerInstance/containerGroups", - "apiVersion": "2018-02-01-preview", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "dependsOn": [ - "[resourceId('Microsoft.insights/components', variables('applicationInsightsName'))]", - "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" - ], - "properties": { - "containers": [ - { - "name": "fhirimporter", - "properties": { - "image": "[parameters('containerImage')]", - "environmentVariables": [ - { - "name": "APPINSIGHTS_INSTRUMENTATIONKEY", - "value": "[reference(resourceId('microsoft.insights/components/', variables('applicationInsightsName')), '2015-05-01').InstrumentationKey]" - }, - { - "name": "Audience", - "value": "[parameters('aadAudience')]" - }, - { - "name": "Authority", - "value": "[parameters('aadAuthority')]" - }, - { - "name": "AzureWebJobsDashboard", - "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]" - }, - { - "name": "AzureWebJobsStorage", - "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]" - }, - { - "name": "ClientId", - "value": "[parameters('aadServiceClientId')]" - }, - { - "name": "ClientSecret", - "value": "[parameters('aadServiceClientSecret')]" - }, - { - "name": "FhirServerUrl", - "value": "[parameters('fhirServerUrl')]" - }, - { - "name": "MaxDegreeOfParallelism", - "value": "[parameters('maxDegreeOfParallelism')]" - } - ], - "resources": { - "requests": { - "cpu": "[parameters('cpuCores')]", - "memoryInGB": "[parameters('memoryGb')]" - } - } - } - } - ], - "restartPolicy": "OnFailure", - "osType": "Linux" - } - } - ] -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-api.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-api.json deleted file mode 100644 index a63d4589e9..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-api.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "accessPolicies": { - "type": "array" - }, - "serviceName": { - "type": "string" - }, - "offerThroughput": { - "type": "int", - "defaultValue": 1000, - "allowedValues": [1000], - "metadata": { - "description": "CosmosDB throughput" - } - }, - "audience": { - "type": "string", - "metadata": { - "description": "OAuth Audience" - } - }, - "authority": { - "type": "string", - "metadata": { - "description": "OAuth Authority" - } - }, - "smartProxyEnabled": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Enable SMART on FHIR AAD proxy" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSamples", - "metadata": { - "description": "The type of the solution" - } - } - }, - "resources": [ - { - "type": "Microsoft.HealthcareApis/services", - "kind": "fhir", - "name": "[parameters('serviceName')]", - "apiVersion": "2018-08-20-preview", - "location": "[resourceGroup().location]", - "properties": { - "accessPolicies": "[parameters('accessPolicies')]", - "authenticationConfiguration": { - "audience": "[parameters('audience')]", - "authority": "[parameters('authority')]", - "smartProxyEnabled": "[parameters('smartProxyEnabled')]" - }, - "cosmosDbConfiguration": { - "offerThroughput": "[parameters('offerThroughput')]" - } - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-fhirdashboard-js.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-fhirdashboard-js.json deleted file mode 100644 index b3a78dc308..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-fhirdashboard-js.json +++ /dev/null @@ -1,253 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "siteName": { - "type": "string", - "metadata": { - "description": "Name of the FHIR dashboard web site." - } - }, - "appServicePlanResourceGroup": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Resource group containing App Service Plan. If empty, deployment resource group is used." - } - }, - "appServicePlanName": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Name of App Service Plan (existing or new). If empty, a name will be generated." - } - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "D1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3", - "P4" - ], - "defaultValue": "S1" - }, - "aadAuthority": { - "type": "string", - "defaultValue": "https://login.microsoftonline.com/common", - "metadata": { - "description": "OAuth Authority" - } - }, - "aadAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "OAuth Audience, if blank, will be set to fhirServerUrl" - } - }, - "aadClientId": { - "type": "string", - "metadata": { - "description": "AAD client application id" - } - }, - "aadClientSecret": { - "type": "string", - "metadata": { - "description": "AAD client secret" - } - }, - "fhirServerUrl": { - "type": "string", - "metadata": { - "description": "FHIR Server URL (also Audience used for resource application)" - } - }, - "repositoryUrl": { - "type": "string", - "defaultValue": "https://github.com/Microsoft/fhir-server-samples", - "metadata": { - "description": "Respository to pull source code from. If blank, source code will not be deployed." - } - }, - "repositoryBranch": { - "type": "string", - "defaultValue": "master", - "metadata": { - "description": "Source code branch to deploy." - } - }, - "repositoryProjectPath": - { - "type": "string", - "defaultValue": "src/FhirDashboardJS", - "metadata": { - "description": "Path within source code repository for FHIR Dashboard application" - } - }, - "deploySourceCode": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Deploy source code (if repo and branch are not blank)" - } - }, - "growthChartAppLaunchUrl": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Launch URL for Growth Chart SMART on FHIR App" - } - }, - "medicationsAppLaunchUrl": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Launch URL for medications SMART on FHIR App" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSamples", - "metadata": { - "description": "The type of the solution" - } - } - }, - "variables": { - "siteName": "[toLower(parameters('siteName'))]", - "appServicePlanResourceGroup": "[if(empty(parameters('appServicePlanResourceGroup')), resourceGroup().name, parameters('appServicePlanResourceGroup'))]", - "appServicePlanName": "[if(empty(parameters('appServicePlanName')),concat(variables('siteName'),'-asp'),parameters('appServicePlanName'))]", - "deploySourceCode": "[and(parameters('deploySourceCode'),and(not(empty(parameters('repositoryUrl'))),not(empty(parameters('repositoryBranch')))))]", - "isMAG": "[or(contains(resourceGroup().location,'usgov'),contains(resourceGroup().location,'usdod'))]", - "aadAudience": "[if(empty(parameters('aadAudience')),parameters('fhirServerUrl'),parameters('aadAudience'))]", - "configObject": { - "FhirServerUrl": "[parameters('fhirServerUrl')]", - "SmartOnFhirApps": [ - { - "DisplayName": "Growth Chart", - "LaunchUrl": "[parameters('growthChartAppLaunchUrl')]" - }, - { - "DisplayName": "Medications", - "LaunchUrl": "[parameters('medicationsAppLaunchUrl')]" - } - ] - }, - "configObjectString": "[string(variables('configObject'))]" - }, - "resources": [ - { - "condition": "[empty(parameters('appServicePlanResourceGroup'))]", - "apiVersion": "2019-08-01", - "name": "fhir-dashboard-nested-asp-template", - "type": "Microsoft.Resources/deployments", - "properties": { - "mode": "Incremental", - "template": { - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": {}, - "variables": {}, - "resources": [ - { - "apiVersion": "2015-08-01", - "name": "[variables('appServicePlanName')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "type": "Microsoft.Web/serverfarms", - "location": "[resourceGroup().location]", - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "name": "[variables('appServicePlanName')]" - } - } - ] - } - } - }, - { - "apiVersion": "2015-08-01", - "type": "Microsoft.Web/sites", - "name": "[variables('siteName')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "identity": { - "type": "SystemAssigned" - }, - "properties": { - "clientAffinityEnabled": false, - "serverFarmId": "[resourceId(variables('appServicePlanResourceGroup'), 'Microsoft.Web/serverfarms/', variables('appServicePlanName'))]" - }, - "dependsOn": [ - "fhir-dashboard-nested-asp-template" - ], - "resources": [ - { - "apiVersion": "2015-08-01", - "name": "appsettings", - "type": "config", - "dependsOn": [ - "[concat('Microsoft.Web/Sites/', variables('siteName'))]" - ], - "properties": { - "WEBSITE_NODE_DEFAULT_VERSION": "6.9.4", - "PROJECT": "[parameters('repositoryProjectPath')]", - "CONFIGFILESTRING": "[variables('configObjectString')]", - "COMMAND": "cd %PROJECT% && xcopy . D:\\home\\site\\wwwroot\\ /E /S /Y && @echo %CONFIGFILESTRING% >D:\\home\\site\\wwwroot\\config.json" - } - }, - { - "apiVersion": "2015-08-01", - "name": "authsettings", - "type": "config", - "dependsOn": [ - "[concat('Microsoft.Web/Sites/', variables('siteName'))]" - ], - "properties": { - "enabled": true, - "unauthenticatedClientAction": "redirectToLoginPage", - "tokenStoreEnabled": true, - "defaultProvider": "AzureActiveDirectory", - "clientId": "[parameters('aadClientId')]", - "clientSecret": "[parameters('aadClientSecret')]", - "issuer": "[parameters('aadAuthority')]", - "additionalLoginParams": [ - "[concat('resource=',variables('aadAudience'))]" - ], - "isAadAutoProvisioned": false - } - }, - { - "apiVersion": "2015-08-01", - "name": "web", - "type": "sourcecontrols", - "condition": "[variables('deploySourceCode')]", - "dependsOn": [ - "[resourceId('Microsoft.Web/Sites', variables('siteName'))]", - "[resourceId('Microsoft.Web/Sites/config', variables('siteName'), 'appsettings')]" - ], - "properties": { - "RepoUrl": "[parameters('repositoryUrl')]", - "branch": "[parameters('repositoryBranch')]", - "IsManualIntegration": true - } - } - ] - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-importer.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-importer.json deleted file mode 100644 index 141f6cc82d..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-importer.json +++ /dev/null @@ -1,277 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "appName": { - "type": "string", - "metadata": { - "description": "The name of the function app." - } - }, - "storageAccountType": { - "type": "string", - "defaultValue": "Standard_LRS", - "allowedValues": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS" - ], - "metadata": { - "description": "Storage Account type" - } - }, - "location": { - "type": "string", - "defaultValue": "[resourceGroup().location]", - "metadata": { - "description": "Location for all resources." - } - }, - "aadAuthority": { - "type": "string", - "defaultValue": "https://login.microsoftonline.com/common", - "metadata": { - "description": "OAuth Authority" - } - }, - "aadAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "OAuth Audience, if blank, will be set to fhirServerUrl" - } - }, - "aadServiceClientId": { - "type": "string", - "metadata": { - "description": "AAD service client application id" - } - }, - "aadServiceClientSecret": { - "type": "string", - "metadata": { - "description": "AAD service client secret" - } - }, - "fhirServerUrl": { - "type": "string", - "metadata": { - "description": "FHIR Server URL (also Audience used for resource application)" - } - }, - "repositoryUrl": { - "type": "string", - "defaultValue": "https://github.com/Microsoft/fhir-server-samples", - "metadata": { - "description": "Respository to pull source code from. If blank, source code will not be deployed." - } - }, - "repositoryBranch": { - "type": "string", - "defaultValue": "master", - "metadata": { - "description": "Source code branch to deploy." - } - }, - "repositoryProjectPath": { - "type": "string", - "defaultValue": "src/FhirImporter", - "metadata": { - "description": "Path within source code repository for FHIR Dashboard application" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSamples", - "metadata": { - "description": "The type of the solution" - } - } - }, - "variables": { - "functionAppName": "[parameters('appName')]", - "hostingPlanName": "[parameters('appName')]", - "applicationInsightsName": "[parameters('appName')]", - "storageAccountName": "[replace(concat(toLower(parameters('appName')), 'sa'),'-','')]", - "storageAccountid": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]", - "aadAudience": "[if(empty(parameters('aadAudience')),parameters('fhirServerUrl'),parameters('aadAudience'))]" - }, - "resources": [ - { - "type": "Microsoft.Storage/storageAccounts", - "name": "[variables('storageAccountName')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "apiVersion": "2016-12-01", - "location": "[parameters('location')]", - "kind": "Storage", - "sku": { - "name": "[parameters('storageAccountType')]" - }, - "resources": [ - { - "type": "blobServices/containers", - "apiVersion": "2018-03-01-preview", - "name": "[concat('default/', 'fhirimport')]", - "dependsOn": [ - "[variables('storageAccountName')]" - ], - "properties": { - "publicAccess": "None" - } - }, - { - "type": "blobServices/containers", - "apiVersion": "2018-03-01-preview", - "name": "[concat('default/', 'fhirrejected')]", - "dependsOn": [ - "[variables('storageAccountName')]" - ], - "properties": { - "publicAccess": "None" - } - } - ] - }, - { - "type": "Microsoft.Web/serverfarms", - "apiVersion": "2015-04-01", - "name": "[variables('hostingPlanName')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[parameters('location')]", - "properties": { - "name": "[variables('hostingPlanName')]", - "computeMode": "Dynamic", - "sku": "Dynamic" - } - }, - { - "apiVersion": "2015-08-01", - "type": "Microsoft.Web/sites", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "name": "[variables('functionAppName')]", - "location": "[parameters('location')]", - "kind": "functionapp", - "dependsOn": [ - "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", - "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" - ], - "properties": { - "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", - "siteConfig": { - "appSettings": [ - { - "name": "AzureWebJobsDashboard", - "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]" - }, - { - "name": "AzureWebJobsStorage", - "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]" - }, - { - "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", - "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]" - }, - { - "name": "WEBSITE_CONTENTSHARE", - "value": "[toLower(variables('functionAppName'))]" - }, - { - "name": "FUNCTIONS_EXTENSION_VERSION", - "value": "~2" - }, - { - "name": "WEBSITE_NODE_DEFAULT_VERSION", - "value": "8.11.1" - }, - { - "name": "FUNCTIONS_WORKER_RUNTIME", - "value": "dotnet" - }, - { - "name": "APPINSIGHTS_INSTRUMENTATIONKEY", - "value": "[reference(resourceId('microsoft.insights/components/', variables('applicationInsightsName')), '2015-05-01').InstrumentationKey]" - }, - { - "name": "APPINSIGHTS_PORTALINFO", - "value": "ASP.NETCORE" - }, - { - "name": "APPINSIGHTS_PROFILERFEATURE_VERSION", - "value": "1.0.0" - }, - { - "name": "APPINSIGHTS_SNAPSHOTFEATURE_VERSION", - "value": "1.0.0" - }, - { - "name": "PROJECT", - "value": "[parameters('repositoryProjectPath')]" - }, - { - "name": "ClientId", - "value": "[parameters('aadServiceClientId')]" - }, - { - "name": "ClientSecret", - "value": "[parameters('aadServiceClientSecret')]" - }, - { - "name": "Audience", - "value": "[variables('aadAudience')]" - }, - { - "name": "Authority", - "value": "[parameters('aadAuthority')]" - }, - { - "name": "FhirServerUrl", - "value": "[parameters('fhirServerUrl')]" - }, - { - "name": "WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT", - "value": "1" - }, - { - "name": "MaxDegreeOfParallelism", - "value": "16" - } - ] - } - }, - "resources": [ - { - "apiVersion": "2015-08-01", - "name": "web", - "type": "sourcecontrols", - "dependsOn": [ - "[resourceId('Microsoft.Web/Sites', variables('functionAppName'))]" - ], - "properties": { - "RepoUrl": "[parameters('repositoryUrl')]", - "branch": "[parameters('repositoryBranch')]", - "IsManualIntegration": true - } - } - ] - }, - { - "apiVersion": "2018-05-01-preview", - "name": "[variables('applicationInsightsName')]", - "type": "microsoft.insights/components", - "location": "East US", - "tags": { - "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('applicationInsightsName'))]": "Resource" - }, - "properties": { - "ApplicationId": "[variables('applicationInsightsName')]", - "Request_Source": "IbizaWebAppExtensionCreate" - } - } - ] -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-sandbox.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-sandbox.json deleted file mode 100644 index f1892197d1..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-sandbox.json +++ /dev/null @@ -1,470 +0,0 @@ -{ - "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "environmentName": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Name of the demo environment. Will be used as prefix for resources." - }, - "maxLength": 12 - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "D1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3", - "P4" - ], - "defaultValue": "S1", - "metadata": { - "description": "Shared App Service Plan for Dashboard and SMART on FHIR apps" - } - }, - "aadAuthority": { - "type": "string", - "defaultValue": "https://login.microsoftonline.com/common", - "metadata": { - "description": "OAuth Authority for FHIR server" - } - }, - "aadFhirServerAudience": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Audience (resource) of the FHIR API app registration" - } - }, - "aadDashboardClientId": { - "type": "string", - "metadata": { - "description": "AAD client application id for accessing FHIR server" - } - }, - "aadDashboardClientSecret": { - "type": "string", - "metadata": { - "description": "AAD client secret" - } - }, - "aadServiceClientId": { - "type": "string", - "metadata": { - "description": "AAD service client application id for accessing FHIR server" - } - }, - "aadServiceClientSecret": { - "type": "string", - "metadata": { - "description": "AAD service client secret" - } - }, - "smartAppClientId": { - "type": "string", - "defaultValue": "my_web_app", - "metadata": { - "description": "The client id for SMART on FHIR Apps" - } - }, - "fhirServerTemplateUrl": { - "type": "string", - "defaultValue": "https://raw.githubusercontent.com/Microsoft/fhir-server/master/samples/templates/default-azuredeploy.json", - "metadata": { - "description": "URL for FHIR Server template" - } - }, - "sqlAdminPassword": { - "type": "securestring", - "metadata": { - "description": "The password for the sql admin user if using SQL server." - } - }, - "fhirDashboardJSTemplateUrl": { - "type": "string", - "defaultValue": "https://raw.githubusercontent.com/Microsoft/fhir-server-samples/master/deploy/templates/azuredeploy-dashboard-js.json", - "metadata": { - "description": "URL for FHIR dashboard (JS edition) template" - } - }, - "fhirApiLocation": { - "type": "string", - "allowedValues": [ "westus2", "northcentralus", "ukwest", "uksouth", "southeastasia", "australiaeast", "westeurope" ], - "defaultValue": "westus2", - "metadata": { - "description": "Location of Azure API for FHIR" - } - }, - "fhirVersion": { - "type": "string", - "allowedValues": [ "Stu3", "R4"], - "defaultValue": "R4", - "metadata": { - "description": "FHIR version. Defaults to R4" - } - }, - "fhirImporterTemplateUrl": { - "type": "string", - "defaultValue": "https://raw.githubusercontent.com/Microsoft/fhir-server-samples/master/deploy/templates/azuredeploy-importer.json", - "metadata": { - "description": "URL for FHIR importer template" - } - }, - "smartAppTemplateUrl": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "URL for SMART on FHIR app template" - } - }, - "fhirDashboardRepositoryUrl": { - "type": "string", - "defaultValue": "https://github.com/Microsoft/fhir-server-samples", - "metadata": { - "description": "URL for FHIR dashboard repository" - } - }, - "fhirDashboardRepositoryBranch": { - "type": "string", - "defaultValue": "master", - "metadata": { - "description": "Repository branch for FHIR Dashboard" - } - }, - "deployDashboardSourceCode": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "If true, dashboard source code will be deployed from repo" - } - }, - "usePaaS": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Use Azure API for FHIR (PaaS). If false, OSS server will be deployed" - } - }, - "accessPolicies": { - "type": "array", - "defaultValue": [], - "metadata": { - "description": "Access policies for Azure API for FHIR PaaS service" - } - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSamples", - "metadata": { - "description": "The type of the solution" - } - }, - "enableExport": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Determines whether export will be enabled for this fhir instance. If true, a storage account will be created as part of the deployment. You will need owner or user-administrator permissions for this." - } - } - }, - "variables": { - "cosmosThroughPut": 1000, - "isMAG": "[or(contains(resourceGroup().location,'usgov'),contains(resourceGroup().location,'usdod'))]", - "appServicePlanName": "[concat(variables('environmentName'),'-asp')]", - "environmentName": "[if(empty(parameters('environmentName')), concat('fhirdemo', uniqueString(resourceGroup().id)), parameters('environmentName'))]", - "fhirServiceName": "[if(parameters('usePaaS'), variables('environmentName'), concat(variables('environmentName'),'srvr'))]", - "fhirImporterName": "[concat(variables('environmentName'),'imp')]", - "webAppsuffix": "[if(variables('isMAG'),'.azurewebsites.us','.azurewebsites.net')]", - "fhirServerUrlSuffix": "[if(parameters('usePaaS'),'.azurehealthcareapis.com', variables('webAppSuffix'))]", - "fhirServiceUrl": "[concat('https://', variables('fhirServiceName'), variables('fhirServerUrlSuffix'))]", - "fhirServiceKind": "[concat('fhir-', parameters('fhirVersion'))]", - "aadFhirServerAudience": "[if(empty(parameters('aadFhirServerAudience')), variables('fhirServiceUrl'), parameters('aadFhirServerAudience'))]", - "fhirDashboardJSName": "[concat(variables('environmentName'),'dash')]", - "growthChartName": "[concat(variables('environmentName'),'growth')]", - "medicationsName": "[concat(variables('environmentName'),'meds')]", - "baseUri": "[deployment().properties.templateLink.uri]", - "smartAppTemplateUrl": "[if(empty(parameters('smartAppTemplateUrl')), uri(variables('baseUri'), 'azuredeploy-smart-app.json'), parameters('smartAppTemplateUrl'))]", - "allowedOrigins": [ - "*" - ], - "ossBaseTemplateParameters": { - "serviceName": { - "value": "[variables('fhirServiceName')]" - }, - "securityAuthenticationAuthority": { - "value": "[parameters('aadAuthority')]" - }, - "securityAuthenticationAudience": { - "value": "[variables('aadFhirServerAudience')]" - }, - "enableAadSmartOnFhirProxy": { - "value": true - }, - "additionalFhirServerConfigProperties": { - "value": { - "FhirServer:Security:Authorization:Roles:0:name": "admin", - "FhirServer:Security:Authorization:Roles:0:resourcePermissions:0:actions:0": "Read", - "FhirServer:Security:Authorization:Roles:0:resourcePermissions:0:actions:1": "Write", - "FhirServer:Security:Authorization:Roles:0:resourcePermissions:0:actions:2": "HardDelete", - "FhirServer:Cors:Origins:0" : "*", - "FhirServer:Cors:Methods:0" : "*", - "FhirServer:Cors:Headers:0" : "*", - "FhirServer:Cors:MaxAge" : "1440" - } - }, - "fhirVersion": { - "value": "[parameters('fhirVersion')]" - }, - "enableExport": { - "value": "[parameters('enableExport')]" - } - }, - "ossSqlTemplateParameters": { - "sqlAdminPassword": { - "value": "[parameters('sqlAdminPassword')]" - } - }, - "ossTemplateParameters": "[if(contains(parameters('fhirServerTemplateUrl'),'sql'),union(variables('ossBaseTemplateParameters'),variables('ossSqlTemplateParameters')),variables('ossBaseTemplateParameters'))]", - "exportStorageAccountName": "[replace(concat(toLower(parameters('environmentName')), 'export'),'-','')]", - "storageBlobDataContributerRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]" - }, - "resources": [ - { - "apiVersion": "2015-08-01", - "name": "[variables('appServicePlanName')]", - "type": "Microsoft.Web/serverfarms", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "location": "[resourceGroup().location]", - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "name": "[variables('appServicePlanName')]" - } - }, - { - "name": "[variables('exportStorageAccountName')]", - "type": "Microsoft.Storage/storageAccounts", - "apiVersion": "2019-06-01", - "location": "[resourceGroup().location]", - "properties": { - "supportsHttpsTrafficOnly": "true" - }, - "condition": "[and(parameters('usePaaS'),parameters('enableExport'))]", - "dependsOn": [], - "sku": { - "name": "Standard_LRS" - }, - "kind": "Storage", - "tags": {} - }, - { - "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments", - "apiVersion": "2018-09-01-preview", - "name": "[concat(variables('exportStorageAccountName'), '/Microsoft.Authorization/', guid(uniqueString(variables('exportStorageAccountName'), parameters('fhirVersion'), variables('fhirServiceName'))))]", - "condition": "[and(parameters('usePaaS'),parameters('enableExport'))]", - "dependsOn": [ - "[variables('exportStorageAccountName')]", - "[if(parameters('usePaas'), variables('fhirServiceName'), concat(variables('fhirServiceName'),'-deploy'))]" - ], - "properties": { - "roleDefinitionId": "[variables('storageBlobDataContributerRoleId')]", - "principalId": "[if(parameters('usePaas'), reference(concat('Microsoft.HealthcareApis/services/', variables('fhirServiceName')), '2019-09-16', 'full').identity.principalId, '')]", - "principalType": "ServicePrincipal" - } - }, - { - "type": "Microsoft.HealthcareApis/services", - "kind": "[variables('fhirServiceKind')]", - "name": "[variables('fhirServiceName')]", - "apiVersion": "2019-09-16", - "location": "[parameters('fhirApiLocation')]", - "condition": "[parameters('usePaaS')]", - "identity": { - "type": "SystemAssigned" - }, - "properties": { - "accessPolicies": "[parameters('accessPolicies')]", - "authenticationConfiguration": { - "audience": "[variables('aadFhirServerAudience')]", - "authority": "[parameters('aadAuthority')]", - "smartProxyEnabled": true - }, - "corsConfiguration": { - "origins": ["*"], - "headers": ["*"], - "methods": ["DELETE", "GET", "OPTIONS", "PATCH", "POST", "PUT"], - "maxAge": 1440, - "allowCredentials": false - }, - "cosmosDbConfiguration": { - "offerThroughput": "[variables('cosmosThroughPut')]" - }, - "exportConfiguration": { - "storageAccountName": "[variables('exportStorageAccountName')]" - } - } - }, - { - "name": "[concat(variables('fhirServiceName'),'-deploy')]", - "type": "Microsoft.Resources/deployments", - "apiVersion": "2019-08-01", - "condition": "[not(parameters('usePaaS'))]", - "properties": { - "templateLink": { - "uri": "[parameters('fhirServerTemplateUrl')]", - "contentVersion": "1.0.0.0" - }, - "parameters": "[variables('ossTemplateParameters')]", - "mode": "incremental" - } - }, - { - "name": "[concat(variables('fhirImporterName'),'-deploy')]", - "type": "Microsoft.Resources/deployments", - "apiVersion": "2019-08-01", - "properties": { - "templateLink": { - "uri": "[parameters('fhirImporterTemplateUrl')]", - "contentVersion": "1.0.0.0" - }, - "parameters": { - "appName": { - "value": "[variables('fhirImporterName')]" - }, - "aadAuthority": { - "value": "[parameters('aadAuthority')]" - }, - "aadAudience": { - "value": "[variables('aadFhirServerAudience')]" - }, - "aadServiceClientId": { - "value": "[parameters('aadServiceClientId')]" - }, - "aadServiceClientSecret": { - "value": "[parameters('aadServiceClientsecret')]" - }, - "fhirServerUrl": { - "value": "[variables('fhirServiceUrl')]" - }, - "repositoryUrl": { - "value": "[parameters('fhirDashboardRepositoryUrl')]" - }, - "repositoryBranch": { - "value": "[parameters('fhirDashboardRepositoryBranch')]" - } - }, - "mode": "incremental" - } - }, - { - "name": "[concat(variables('fhirDashboardJSName'),'-deploy')]", - "type": "Microsoft.Resources/deployments", - "apiVersion": "2019-08-01", - "dependsOn": [ - "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]" - ], - "properties": { - "templateLink": { - "uri": "[parameters('fhirDashboardJSTemplateUrl')]", - "contentVersion": "1.0.0.0" - }, - "parameters": { - "siteName": { - "value": "[variables('fhirDashboardJSName')]" - }, - "appServicePlanName": { - "value": "[variables('appServicePlanName')]" - }, - "appServicePlanResourceGroup": { - "value": "[resourceGroup().name]" - }, - "aadAuthority": { - "value": "[parameters('aadAuthority')]" - }, - "aadClientId": { - "value": "[parameters('aadDashboardClientId')]" - }, - "aadClientSecret": { - "value": "[parameters('aadDashboardClientSecret')]" - }, - "fhirServerUrl": { - "value": "[variables('fhirServiceUrl')]" - }, - "repositoryUrl": { - "value": "[parameters('fhirDashboardRepositoryUrl')]" - }, - "repositoryBranch": { - "value": "[parameters('fhirDashboardRepositoryBranch')]" - }, - "growthChartAppLaunchUrl": { - "value": "[concat('https://', variables('growthChartName'), variables('webAppSuffix'), '/launch.html')]" - }, - "medicationsAppLaunchUrl": { - "value": "[concat('https://', variables('medicationsName'), variables('webAppSuffix'), '/launch.html')]" - } - }, - "mode": "incremental" - } - }, - { - "name": "[concat(variables('growthChartName'),'-deploy')]", - "type": "Microsoft.Resources/deployments", - "resourceGroup": "[concat(resourceGroup().name, '-sof')]", - "apiVersion": "2019-08-01", - "properties": { - "templateLink": { - "uri": "[variables('smartAppTemplateUrl')]", - "contentVersion": "1.0.0.0" - }, - "parameters": { - "siteName": { - "value": "[variables('growthChartName')]" - }, - "clientId": { - "value": "[parameters('smartAppClientId')]" - }, - "imageName": { - "value": "growth-chart-app:v1.0.0" - } - }, - "mode": "incremental" - } - }, - { - "name": "[concat(variables('medicationsName'),'-deploy')]", - "type": "Microsoft.Resources/deployments", - "resourceGroup": "[concat(resourceGroup().name, '-sof')]", - "apiVersion": "2019-08-01", - "properties": { - "templateLink": { - "uri": "[variables('smartAppTemplateUrl')]", - "contentVersion": "1.0.0.0" - }, - "parameters": { - "siteName": { - "value": "[variables('medicationsName')]" - }, - "clientId": { - "value": "[parameters('smartAppClientId')]" - }, - "imageName": { - "value": "medications-app:v1.0.0" - } - }, - "mode": "incremental" - } - } - ] -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-smart-app.json b/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-smart-app.json deleted file mode 100644 index 7166b27a19..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/fhir-server-samples/deploy/templates/azuredeploy-smart-app.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "siteName": { - "type": "string", - "metadata": { - "description": "Name of the SMART on FHIR web app" - } - }, - "clientId": { - "type": "string", - "metadata": { - "description": "Client Id" - } - }, - "imageName": { - "type": "string", - "metadata": { - "description": "Docker image name, e.g. growth-chart-app:v1.0.0" - } - }, - "appServicePlanSku": { - "type": "string", - "allowedValues": [ - "F1", - "B1", - "B2", - "B3", - "S1", - "S2", - "S3", - "P1", - "P2", - "P3" - ], - "defaultValue": "B1" - }, - "solutionType": { - "type": "string", - "defaultValue": "FhirServerSamples", - "metadata": { - "description": "The type of the solution" - } - } - }, - "variables": { - "lowerCaseServiceName": "[toLower(parameters('siteName'))]", - "registryName": "healthplatformregistry.azurecr.io", - "resourcesLocation": "[resourceGroup().location]", - "serverfarmName": "[concat(variables('lowerCaseServiceName'), '-plan')]" - }, - "resources": [ - { - "apiVersion": "2018-02-01", - "name": "[variables('serverfarmName')]", - "type": "Microsoft.Web/serverfarms", - "location": "[variables('resourcesLocation')]", - "kind": "linux", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "sku": { - "name": "[parameters('appServicePlanSku')]" - }, - "properties": { - "reserved": true - } - }, - { - "type": "Microsoft.Web/sites", - "apiVersion": "2018-11-01", - "name": "[variables('lowerCaseServiceName')]", - "location": "[variables('resourcesLocation')]", - "tags": { - "FhirServerSolution": "[parameters('solutionType')]" - }, - "dependsOn": [ - "[concat('Microsoft.Web/serverfarms/', variables('serverfarmName'))]" - ], - "properties": { - "name": "[variables('lowerCaseServiceName')]", - "siteConfig": { - "appSettings": [ - { - "name":"CLIENT_ID", - "value":"[parameters('clientId')]" - }, - { - "name": "DOCKER_REGISTRY_SERVER_URL", - "value": "[concat('https://', variables('registryName'))]" - }, - { - "name": "DOCKER_REGISTRY_SERVER_USERNAME", - "value": "" - }, - { - "name": "DOCKER_REGISTRY_SERVER_PASSWORD", - "value": "" - }, - { - "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", - "value": "false" - } - ], - "linuxFxVersion": "[concat('DOCKER|', variables('registryName'), '/', parameters('imageName'))]", - "alwaysOn": true - }, - "serverFarmId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourcegroups/', resourceGroup().name, '/providers/Microsoft.Web/serverfarms/', variables('serverfarmName'))]", - "clientAffinityEnabled": false, - "httpsOnly": true - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/README.md b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/README.md deleted file mode 100644 index a9c555ba7b..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# HL7 Ingest, Conversion Samples -This project contains fully functional sample deployments of ingest and conversion workflows powered by Microsoft's FHIR Converter. The goal of this project is to provide quick start examples that can be used to accelerate implementation of health data ingest into Azure Health Data Platform. - -The [FHIR Converter](https://github.com/microsoft/FHIR-Converter) is an open source project that enables healthcare organizations to convert legacy data (currently HL7 v2 messages) into FHIR bundles. Converting legacy data to FHIR expands the use cases for health data and enables interoperability. - - -## Overview -This repo provides reference architecture and sample deployments for the ingest and conversion to FHIR of HL7 messages and the de-identification of FHIR resources. -These samples demonstrate incorporating Microsoft's FHIR Converter into your enterprise HL7 messaging/FHIR infrastructure to enable end-to-end workflows for a variety of use cases. -The examples include: - + An HL7 ingest platform to consume HL7 Messages via MLLP and securely Transfer them to Azure via HL7overHTTPS and place in blob storage and produce a consumable event on a high speed ordered service bus for processing. - - + A workflow that performs orderly conversion from HL7 to FHIR via the conversion API and persists the message into a FHIR Server and publishes change events referencing FHIR resources to a high speed event hub to interested subscribers. - - -## HL7 Ingest - -Infrastructure deployment that will allow you to: -1. Consume MLLP HL7 Messages -2. Securely transfer them to Azure via [HL7overHTTPS](https://hapifhir.github.io/hapi-hl7v2/hapi-hl7overhttp/specification.html) -3. Place in blob storage for audit/errors -4. Produce a consumable event on a high speed ordered service bus for processing - - -![Converter Ingest](hl7ingest1.png) -### Deploying your own HL7 Ingest Platform -1. [Get or Obtain a valid Azure Subscription](https://azure.microsoft.com/en-us/free/) -2. [If you are running Windows 10 make sure you have enabled Windows Linux Subsystem](https://code.visualstudio.com/remote-tutorials/wsl/enable-wsl) and [Installed a Linux Distribution](https://code.visualstudio.com/remote-tutorials/wsl/install-linux) -3. [Install Azure CLI 2.0 on Linux based System or Windows Linux Subsystem](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-apt?view=azure-cli-latest) -4. [Download/Clone this repo](https://github.com/microsoft/health-architectures) -5. Open a bash shell into the Azure CLI 2.0 environment -6. Switch to the HL7Conversion subdirectory of this repo -7. Run the deployhl7ingest.bash script and follow the prompts -8. Send in an hl7 message via HL7 over HTTPS: - + Locate the sample message samplemsg.hl7 in the root directory of the repo - + Use a text editor to see contents - + From the linux command shell run the following command to test the hl7overhttps ingest - ``` - curl --trace-ascii - -H "Content-Type:text/plain" --data-binary @samplemsg.hl7 /api/hl7ingest?code= - ``` - + You should receive back an HL7 ACK message - + Congratulations!!! The sample hl7 message was accepted securely stored into blob storage and queued for further ingest processing on the deployed service bus queue -9. Send in HL7 messages using the local HL7 MLLP Relay. To run a local copy of the HL7 MLLP Relay: - + Make sure [Docker](https://www.docker.com/) is installed and running in your linux or windows environment - + From a command prompt run the runhl7relay.bash(linux) or runhl7relay.cmd(windows) passing in the hl7ingest Function App URL (Saved from Above) and the function app access key (Saved from above) as parameters. - ``` - runhl7relay https://" - ``` - + You can now point any HL7 MLLP Engine to the HL7 Relay listening port (default is 8079) and it will transfer messages to the hl7ingest function app over https - + An appropriate HL7 ACK will be sent to the engine from the relay listener - -## HL7toFHIR Conversion - -Infrastructure deployment that will create a logic app based workflow that performs orderly conversion from HL7 to FHIR via the [FHIR Converter](https://github.com/microsoft/FHIR-Converter), persists the message into an [Azure API for FHIR Server Instance](https://azure.microsoft.com/en-us/services/azure-api-for-fhir/) and publishes FHIR change events referencing FHIR resources to a high speed event hub to interested subscribers. -Features of the HL7toFHIR Conversion Platform: - + Highly Scalable, Secure and Flexible conversion process implementation - + FHIR Event Generator and Proxied FHIR Server Access. - + Custom Connectors to the FHIR Converter and FHIR Server for easy access to these resources via logic app workflows - + Defines a central ingest point and event bus to support virtually unlimited event driven workflow and orchestration scenarios. -![Converter Ingest](hl72fhir.png) - -### Deploying your own HL7toFHIR Conversion Workflow -1. [Deploy the HL7 Ingest Platform](#ingest) -2. [Deploy an Azure API for FHIR instance](https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-paas-portal-quickstart) -3. [Register a Service Client to Access the FHIR Server](https://docs.microsoft.com/en-us/azure/healthcare-apis/register-service-azure-ad-client-app). You will need the following information to configure the HL72FHIR services - + Client/Application ID for the Service Client - + The Client Secret for the Service Client - + The AAD Tenant ID for the FHIR Server/Service Client - + The Audience/Resource for the FHIR Server/Service Client typically https://azurehealthcareapis.com for Azure API for FHIR -4. [Find the Object Id for the Service Client and Register it with the FHIR Server](https://docs.microsoft.com/en-us/azure/healthcare-apis/find-identity-object-ids) -5. You will need the following information from the HL7 Ingest platform deployment (provided at the end of your deployment): - + The resource group name created - + The storage account name created - + The service bus namespace created - + The service bus destination queue name created -6. Open a shell or command window into the Azure CLI 2.0 environment -7. Switch to the Managed/HL7Conversion subdirectory of this repo -8. Run the deployhl72fhir.bash script and follow the prompts -9. After successful deployment your converter pipeline is now tied to your ingest platform from above. To test simply follow the test direction for HL7 Ingest above with the sample HL7 message and you should see resources from the bundle created in the destination FHIR Server - + You can also see execution from the HL7toFHIR Logic App Run History in the HL7toFHIR resource group. This will also provide you with detailed steps to see the transform process: - -![Sample Converter Run](samplerun.png) - - -FHIR is the registered trademark of HL7 and is used with the permission of HL7
    -HAPI is an open source tool set developed by [University Health Network](http://www.uhn.ca/) diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deid.png b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deid.png deleted file mode 100644 index 54935e3638..0000000000 Binary files a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deid.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl72fhir-hl7converter.bash b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl72fhir-hl7converter.bash deleted file mode 100644 index 64c11f3d2a..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl72fhir-hl7converter.bash +++ /dev/null @@ -1,311 +0,0 @@ -#!/bin/bash -set -euo pipefail -IFS=$'\n\t' - -# -e: immediately exit if any command has a non-zero exit status -# -o: prevents errors in a pipeline from being masked -# IFS new value is less likely to cause confusing bugs when looping arrays or arguments (e.g. $@) -# -#HL72FHIR Workf Setup --- Author Steve Ordahl Principal Architect Health Data Platform -# - -usage() { echo "Usage: $0 -i -g -l -p " 1>&2; exit 1; } - -function fail { - echo $1 >&2 - exit 1 -} - -function retry { - local n=1 - local max=5 - local delay=15 - while true; do - "$@" && break || { - if [[ $n -lt $max ]]; then - ((n++)) - echo "Command failed. Retry Attempt $n/$max in $delay seconds:" >&2 - sleep $delay; - else - fail "The command has failed after $n attempts." - fi - } - done -} -declare defsubscriptionId="" -declare subscriptionId="" -declare resourceGroupName="" -declare resourceGroupLocation="" -declare storageAccountNameSuffix="store"$RANDOM -declare storageConnectionString="" -declare evhubnamespaceName="fehub26073" -declare evhub="fhirevents" -declare evconnectionString="" -declare serviceplanSuffix="asp" -#declare faname=fhirevt$RANDOM -declare faname=fhirevt2503 -declare faresourceid="" -declare fakey="" -declare deployzip="../FHIR/FHIREventProcessor/distribution/publish.zip" -declare deployprefix="" -declare defdeployprefix="" -declare fsurl="" -declare fsclientid="" -declare fssecret="" -declare fstenant="" -declare fsaud="" -declare fsdefaud="https://azurehealthcareapis.com" -declare hl7storename="" -declare hl7rgname="" -declare hl7sbnamespace="" -declare hl7sbqueuename="" -declare hl7storekey="" -declare hl7sbconnection="" -declare hl7convertername="hl7conv" -declare hl7converterrg="" -declare uid=$(uuidgen) -declare hl7convertkey=${uid//-} -declare hl7converterinstance="" -declare stepresult="" -declare fahost="" -# Initialize parameters specified from command line -while getopts ":i:g:n:l:p" arg; do - case "${arg}" in - p) - deployprefix=${OPTARG:0:14} - deployprefix=${deployprefix,,} - deployprefix=${deployprefix//[^[:alnum:]]/} - ;; - i) - subscriptionId=${OPTARG} - ;; - g) - resourceGroupName=${OPTARG} - ;; - l) - resourceGroupLocation=${OPTARG} - ;; - esac -done -shift $((OPTIND-1)) -echo "Executing "$0"..." -echo "Checking Azure Authentication..." -#login to azure using your credentials -az account show 1> /dev/null - -if [ $? != 0 ]; -then - az login -fi - -defsubscriptionId=$(az account show --query "id" --out json | sed 's/"//g') - -#Prompt for parameters is some required parameters are missing -if [[ -z "$subscriptionId" ]]; then - echo "Enter your subscription ID ["$defsubscriptionId"]:" - read subscriptionId - if [ -z "$subscriptionId" ] ; then - subscriptionId=$defsubscriptionId - fi - [[ "${subscriptionId:?}" ]] -fi - -if [[ -z "$resourceGroupName" ]]; then - echo "This script will look for an existing resource group, otherwise a new one will be created " - echo "You can create new resource groups with the CLI using: az group create " - echo "Enter a resource group name" - read resourceGroupName - [[ "${resourceGroupName:?}" ]] -fi - -defdeployprefix=${resourceGroupName:0:14} -defdeployprefix=${defdeployprefix//[^[:alnum:]]/} -defdeployprefix=${defdeployprefix,,} - -if [[ -z "$resourceGroupLocation" ]]; then - echo "If creating a *new* resource group, you need to set a location " - echo "You can lookup locations with the CLI using: az account list-locations " - - echo "Enter resource group location:" - read resourceGroupLocation -fi -#Prompt for parameters is some required parameters are missing -if [[ -z "$deployprefix" ]]; then - echo "Enter your deployment prefix ["$defdeployprefix"]:" - read deployprefix - if [ -z "$deployprefix" ] ; then - deployprefix=$defdeployprefix - fi - deployprefix=${deployprefix:0:14} - deployprefix=${deployprefix//[^[:alnum:]]/} - deployprefix=${deployprefix,,} - [[ "${deployprefix:?}" ]] -fi -if [ -z "$subscriptionId" ] || [ -z "$resourceGroupName" ]; then - echo "Either one of subscriptionId, resourceGroupName is empty" - usage -fi -#Prompt for Converter Resource group to avoid function app conflicts -echo "Enter a resource group name to deploy the converter to ["$deployprefix$hl7convertername"]:" -read hl7converterrg -if [ -z "$hl7converterrg" ] ; then - hl7converterrg=$deployprefix$hl7convertername -fi -if [ "$hl7converterrg" = "$resourceGroupName" ]; then - echo "The converter resource group cannot be the same as the target resource group" - exit 1; -fi -if [ -z "$hl7converterrg" ] ; then - hl7converterrg=$deployprefix$hl7convertername -fi -#Prompt for HL7Ingest Storage and Service Bus -echo "Enter the name of the HL7 Ingest Resource Group:" -read hl7rgname -if [ -z "$hl7rgname" ] ; then - echo "You must provide the name of the resource group that contains the HL7 ingest platform" - exit 1; -fi -echo "Enter the name of the HL7 Ingest storage account:" -read hl7storename -if [ -z "$hl7storename" ] ; then - echo "You must provide the name of the storage account of the HL7 ingest platform" - exit 1; -fi -echo "Enter the name of the HL7 ServiceBus namespace:" -read hl7sbnamespace -if [ -z "$hl7sbnamespace" ] ; then - echo "You must provide the namespace name of the service bus of the HL7 ingest platform" - exit 1; -fi -echo "Enter the name of the HL7 ServiceBus destination queue:" -read hl7sbqueuename -if [ -z "$hl7sbqueuename" ] ; then - echo "You must provide the name of the service bus queue of the HL7 ingest platform" - exit 1; -fi -#Prompt for FHIR Server Parameters -echo "Enter the destination FHIR Server URL:" -read fsurl -if [ -z "$fsurl" ] ; then - echo "You must provide a destination FHIR Server URL" - exit 1; -fi -echo "Enter the FHIR Server Service Client Application ID:" -read fsclientid -if [ -z "$fsclientid" ] ; then - echo "You must provide a Service Client Application ID" - exit 1; -fi -echo "Enter the FHIR Server Service Client Secret:" -read fssecret -if [ -z "$fssecret" ] ; then - echo "You must provide a Service Client Secret" - exit 1; -fi -echo "Enter the FHIR Server/Service Client Audience/Resource ["$fsdefaud"]:" - read fsaud - if [ -z "$fsaud" ] ; then - fsaud=$fsdefaud - fi - [[ "${fsaud:?}" ]] -echo "Enter the FHIR Server/Service Client Tenant ID:" -read fstenant -if [ -z "$fstenant" ] ; then - echo "You must provide a FHIR Server/Service Client Tenant" - exit 1; -fi - -echo "Setting subscription id and checking resource groups..." -#set the default subscription id -az account set --subscription $subscriptionId - -set +e - -#Check for existing RG -if [ $(az group exists --name $resourceGroupName) = false ]; then - echo "Resource group with name" $resourceGroupName "could not be found. Creating new resource group.." - set -e - ( - set -x - az group create --name $resourceGroupName --location $resourceGroupLocation 1> /dev/null - ) -else - echo "Using existing resource group..." -fi - -if [ $(az group exists --name $hl7converterrg) = false ]; then - echo "Resource group with name" $hl7converterrg "could not be found. Creating new resource group.." - set -e - ( - set -x - az group create --name $hl7converterrg --location $resourceGroupLocation 1> /dev/null - ) -else - echo "Using existing resource group for converter deployment..." -fi -#Set up variables -faresourceid="/subscriptions/"$subscriptionId"/resourceGroups/"$resourceGroupName"/providers/Microsoft.Web/sites/"$faname -#Start deployment -echo "Starting HL72FHIR Workflow Platform deployment..." -( - #set -x - #Create Storage Account - #echo "Creating Storage Account["$deployprefix$storageAccountNameSuffix"]..." - #stepresult=$(az storage account create --name $deployprefix$storageAccountNameSuffix --resource-group $resourceGroupName --location $resourceGroupLocation --sku Standard_LRS --encryption-services blob --kind StorageV2) - #echo "Retrieving Storage Account Connection String..." - #storageConnectionString=$(az storage account show-connection-string -g $resourceGroupName -n $deployprefix$storageAccountNameSuffix --query "connectionString" --output tsv) - - #Create EventHub Bus Namespace and Hub - #echo "Creating FHIR Event Hub Namespace ["$evhubnamespaceName"]..." - #stepresult=$(az eventhubs namespace create --name $evhubnamespaceName --resource-group $resourceGroupName -l $resourceGroupLocation) - # Create eventhub for fhirevents - #echo "Creating FHIR Event Hub ["$evhub"]..." - #stepresult=$(az eventhubs eventhub create --name $evhub --resource-group $resourceGroupName --namespace-name $evhubnamespaceName) - #echo "Retrieving Event Hub Connection String..." - #evconnectionString=$(az eventhubs namespace authorization-rule keys list --resource-group $resourceGroupName --namespace-name $evhubnamespaceName --name RootManageSharedAccessKey --query primaryConnectionString --output tsv) - #Create FHIREventProcessor Function App - #Create Service Plan - #echo "Creating FHIREventProcessor Function App Service Plan["$deployprefix$serviceplanSuffix"]..." - #stepresult=$(az appservice plan create -g $resourceGroupName -n $deployprefix$serviceplanSuffix --number-of-workers 2 --sku B1) - #Create the Function App - #echo "Creating FHIREventProcessor Function App ["$faname"]..." - #fahost=$(az functionapp create --name $faname --storage-account $deployprefix$storageAccountNameSuffix --plan $deployprefix$serviceplanSuffix --resource-group $resourceGroupName --runtime dotnet --os-type Windows --functions-version 2 --query defaultHostName --output tsv) - #Add App Settings - #echo "Configuring FHIREventProcessor Function App ["$faname"]..." - #stepresult=$(az functionapp config appsettings set --name $faname --resource-group $resourceGroupName --settings FS_URL=$fsurl FS_TENANT_NAME=$fstenant FS_CLIENT_ID=$fsclientid FS_SECRET=$fssecret FS_RESOURCE=$fsaud EventHubConnection=$evconnectionString EventHubName=$evhub) - #echo "Deploying FHIREventProcessor Function App from repo to host ["$fahost"]..." - #deployment from git repo - #stepresult=$(retry az functionapp deployment source config-zip --name $faname --resource-group $resourceGroupName --src $deployzip) - - #Deploy HL7 FHIR Converter - hl7converterinstance=$deployprefix$hl7convertername$RANDOM - echo "Deploying FHIR Converter ["$hl7converterinstance"] to resource group ["$hl7converterrg"]..." - stepresult=$(az group deployment create -g $hl7converterrg --template-uri https://raw.githubusercontent.com/microsoft/FHIR-Converter/master/deploy/default-azuredeploy.json --parameters serviceName=$hl7converterinstance --parameters apiKey=$hl7convertkey) - echo "Deploying Custom Logic App Connector for FHIR Server..." - stepresult=$(az group deployment create -g $resourceGroupName --template-file hl7tofhir/LogicAppCustomConnectors/fhir_server_connect_template.json --parameters fhirserverproxyhost=$faname".azurewebsites.net") - echo "Deploying Custom Logic App Connector for FHIR Converter..." - stepresult=$(az group deployment create -g $resourceGroupName --template-file hl7tofhir/LogicAppCustomConnectors/fhir_converter_connect_template.json --parameters fhirconverterhost=$hl7converterinstance".azurewebsites.net") - echo "Loading HL7 Ingest connections/keys..." - hl7storekey=$(az storage account keys list -g $hl7rgname -n $hl7storename --query "[?keyName=='key1'].value" --output tsv) - hl7sbconnection=$(az servicebus namespace authorization-rule keys list --resource-group $hl7rgname --namespace-name $hl7sbnamespace --name RootManageSharedAccessKey --query primaryConnectionString --output tsv) - echo "Loading FHIREventProcessor Function Keys..." - fakey=$(retry az rest --method post --uri "https://management.azure.com"$faresourceid"/host/default/listKeys?api-version=2018-02-01" --query "functionKeys.default" --output tsv) - echo "Deploying HL72FHIR Logic App..." - stepresult=$(az group deployment create -g $resourceGroupName --template-file hl7tofhir/hl72fhir.json --parameters HL7FHIRConverter_1_api_key=$hl7convertkey azureblob_1_accountName=$hl7storename azureblob_1_accessKey=$hl7storekey FHIRServerProxy_1_api_key=$fakey servicebus_1_connectionString=$hl7sbconnection servicebus_1_queue=$hl7sbqueuename) - echo " " - echo "************************************************************************************************************" - echo "HL72FHIR Workflow Platform has successfully been deployed to group "$resourceGroupName" on "$(date) - echo "Please note the following reference information for future use:" - #echo "Your FHIR EventHub namespace is: "$evhubnamespaceName - #echo "Your FHIR EventHub name is: "$evhub - echo "Your HL7 FHIR Converter Host is: "$hl7converterinstance - echo "Your HL7 FHIR Converter Key is: "$hl7convertkey - echo "Your HL7 FHIR Converter Resource Group is: "$hl7converterrg - echo "************************************************************************************************************" - echo " " -) - -if [ $? == 0 ]; - then - echo "HL72FHIR Workflow Platform has successfully been deployed" -fi diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl72fhir.bash b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl72fhir.bash deleted file mode 100644 index b184177cb3..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl72fhir.bash +++ /dev/null @@ -1,308 +0,0 @@ -#!/bin/bash -set -euo pipefail -IFS=$'\n\t' - -# -e: immediately exit if any command has a non-zero exit status -# -o: prevents errors in a pipeline from being masked -# IFS new value is less likely to cause confusing bugs when looping arrays or arguments (e.g. $@) -# -#HL72FHIR Workf Setup --- Author Steve Ordahl Principal Architect Health Data Platform -# - -usage() { echo "Usage: $0 -i -g -l -p " 1>&2; exit 1; } - -function fail { - echo $1 >&2 - exit 1 -} - -function retry { - local n=1 - local max=5 - local delay=15 - while true; do - "$@" && break || { - if [[ $n -lt $max ]]; then - ((n++)) - echo "Command failed. Retry Attempt $n/$max in $delay seconds:" >&2 - sleep $delay; - else - fail "The command has failed after $n attempts." - fi - } - done -} -declare defsubscriptionId="" -declare subscriptionId="" -declare resourceGroupName="" -declare resourceGroupLocation="" -declare storageAccountNameSuffix="store"$RANDOM -declare storageConnectionString="" -declare evhubnamespaceName="fehub"$RANDOM -declare evhub="fhirevents" -declare evconnectionString="" -declare serviceplanSuffix="asp" -declare faname=fhirevt$RANDOM -declare faresourceid="" -declare fakey="" -declare deployzip="../FHIR/FHIREventProcessor/distribution/publish.zip" -declare deployprefix="" -declare defdeployprefix="" -declare fsurl="" -declare fsclientid="" -declare fssecret="" -declare fstenant="" -declare fsaud="" -declare fsdefaud="https://azurehealthcareapis.com" -declare hl7storename="" -declare hl7rgname="" -declare hl7sbnamespace="" -declare hl7sbqueuename="" -declare hl7storekey="" -declare hl7sbconnection="" -declare hl7convertername="hl7conv" -declare hl7converterrg="" -declare uid=$(uuidgen) -declare hl7convertkey=${uid//-} -declare hl7converterinstance="" -declare stepresult="" -declare fahost="" -# Initialize parameters specified from command line -while getopts ":i:g:n:l:p" arg; do - case "${arg}" in - p) - deployprefix=${OPTARG:0:14} - deployprefix=${deployprefix,,} - deployprefix=${deployprefix//[^[:alnum:]]/} - ;; - i) - subscriptionId=${OPTARG} - ;; - g) - resourceGroupName=${OPTARG} - ;; - l) - resourceGroupLocation=${OPTARG} - ;; - esac -done -shift $((OPTIND-1)) -echo "Executing "$0"..." -echo "Checking Azure Authentication..." -#login to azure using your credentials -az account show 1> /dev/null - -if [ $? != 0 ]; -then - az login -fi - -defsubscriptionId=$(az account show --query "id" --out json | sed 's/"//g') - -#Prompt for parameters is some required parameters are missing -if [[ -z "$subscriptionId" ]]; then - echo "Enter your subscription ID ["$defsubscriptionId"]:" - read subscriptionId - if [ -z "$subscriptionId" ] ; then - subscriptionId=$defsubscriptionId - fi - [[ "${subscriptionId:?}" ]] -fi - -if [[ -z "$resourceGroupName" ]]; then - echo "This script will look for an existing resource group, otherwise a new one will be created " - echo "You can create new resource groups with the CLI using: az group create " - echo "Enter a resource group name" - read resourceGroupName - [[ "${resourceGroupName:?}" ]] -fi - -defdeployprefix=${resourceGroupName:0:14} -defdeployprefix=${defdeployprefix//[^[:alnum:]]/} -defdeployprefix=${defdeployprefix,,} - -if [[ -z "$resourceGroupLocation" ]]; then - echo "If creating a *new* resource group, you need to set a location " - echo "You can lookup locations with the CLI using: az account list-locations " - - echo "Enter resource group location:" - read resourceGroupLocation -fi -#Prompt for parameters is some required parameters are missing -if [[ -z "$deployprefix" ]]; then - echo "Enter your deployment prefix ["$defdeployprefix"]:" - read deployprefix - if [ -z "$deployprefix" ] ; then - deployprefix=$defdeployprefix - fi - deployprefix=${deployprefix:0:14} - deployprefix=${deployprefix//[^[:alnum:]]/} - deployprefix=${deployprefix,,} - [[ "${deployprefix:?}" ]] -fi -if [ -z "$subscriptionId" ] || [ -z "$resourceGroupName" ]; then - echo "Either one of subscriptionId, resourceGroupName is empty" - usage -fi -#Prompt for Converter Resource group to avoid function app conflicts -echo "Enter a resource group name to deploy the converter to ["$deployprefix$hl7convertername"]:" -read hl7converterrg -if [ -z "$hl7converterrg" ] ; then - hl7converterrg=$deployprefix$hl7convertername -fi -if [ "$hl7converterrg" = "$resourceGroupName" ]; then - echo "The converter resource group cannot be the same as the target resource group" - exit 1; -fi -if [ -z "$hl7converterrg" ] ; then - hl7converterrg=$deployprefix$hl7convertername -fi -#Prompt for HL7Ingest Storage and Service Bus -echo "Enter the name of the HL7 Ingest Resource Group:" -read hl7rgname -if [ -z "$hl7rgname" ] ; then - echo "You must provide the name of the resource group that contains the HL7 ingest platform" - exit 1; -fi -echo "Enter the name of the HL7 Ingest storage account:" -read hl7storename -if [ -z "$hl7storename" ] ; then - echo "You must provide the name of the storage account of the HL7 ingest platform" - exit 1; -fi -echo "Enter the name of the HL7 ServiceBus namespace:" -read hl7sbnamespace -if [ -z "$hl7sbnamespace" ] ; then - echo "You must provide the namespace name of the service bus of the HL7 ingest platform" - exit 1; -fi -echo "Enter the name of the HL7 ServiceBus destination queue:" -read hl7sbqueuename -if [ -z "$hl7sbqueuename" ] ; then - echo "You must provide the name of the service bus queue of the HL7 ingest platform" - exit 1; -fi -#Prompt for FHIR Server Parameters -echo "Enter the destination FHIR Server URL:" -read fsurl -if [ -z "$fsurl" ] ; then - echo "You must provide a destination FHIR Server URL" - exit 1; -fi -echo "Enter the FHIR Server Service Client Application ID:" -read fsclientid -if [ -z "$fsclientid" ] ; then - echo "You must provide a Service Client Application ID" - exit 1; -fi -echo "Enter the FHIR Server Service Client Secret:" -read fssecret -if [ -z "$fssecret" ] ; then - echo "You must provide a Service Client Secret" - exit 1; -fi -echo "Enter the FHIR Server/Service Client Audience/Resource ["$fsdefaud"]:" - read fsaud - if [ -z "$fsaud" ] ; then - fsaud=$fsdefaud - fi - [[ "${fsaud:?}" ]] -echo "Enter the FHIR Server/Service Client Tenant ID:" -read fstenant -if [ -z "$fstenant" ] ; then - echo "You must provide a FHIR Server/Service Client Tenant" - exit 1; -fi - -echo "Setting subscription id and checking resource groups..." -#set the default subscription id -az account set --subscription $subscriptionId - -set +e - -#Check for existing RG -if [ $(az group exists --name $resourceGroupName) = false ]; then - echo "Resource group with name" $resourceGroupName "could not be found. Creating new resource group.." - set -e - ( - set -x - az group create --name $resourceGroupName --location $resourceGroupLocation 1> /dev/null - ) -else - echo "Using existing resource group..." -fi - -if [ $(az group exists --name $hl7converterrg) = false ]; then - echo "Resource group with name" $hl7converterrg "could not be found. Creating new resource group.." - set -e - ( - set -x - az group create --name $hl7converterrg --location $resourceGroupLocation 1> /dev/null - ) -else - echo "Using existing resource group for converter deployment..." -fi -#Set up variables -faresourceid="/subscriptions/"$subscriptionId"/resourceGroups/"$resourceGroupName"/providers/Microsoft.Web/sites/"$faname -#Start deployment -echo "Starting HL72FHIR Workflow Platform deployment..." -( - #set -x - #Create Storage Account - echo "Creating Storage Account["$deployprefix$storageAccountNameSuffix"]..." - stepresult=$(az storage account create --name $deployprefix$storageAccountNameSuffix --resource-group $resourceGroupName --location $resourceGroupLocation --sku Standard_LRS --encryption-services blob --kind StorageV2) - echo "Retrieving Storage Account Connection String..." - storageConnectionString=$(az storage account show-connection-string -g $resourceGroupName -n $deployprefix$storageAccountNameSuffix --query "connectionString" --output tsv) - #Create EventHub Bus Namespace and Hub - echo "Creating FHIR Event Hub Namespace ["$evhubnamespaceName"]..." - stepresult=$(az eventhubs namespace create --name $evhubnamespaceName --resource-group $resourceGroupName -l $resourceGroupLocation) - # Create eventhub for fhirevents - echo "Creating FHIR Event Hub ["$evhub"]..." - stepresult=$(az eventhubs eventhub create --name $evhub --resource-group $resourceGroupName --namespace-name $evhubnamespaceName) - echo "Retrieving Event Hub Connection String..." - evconnectionString=$(az eventhubs namespace authorization-rule keys list --resource-group $resourceGroupName --namespace-name $evhubnamespaceName --name RootManageSharedAccessKey --query primaryConnectionString --output tsv) - #Create FHIREventProcessor Function App - #Create Service Plan - echo "Creating FHIREventProcessor Function App Service Plan["$deployprefix$serviceplanSuffix"]..." - stepresult=$(az appservice plan create -g $resourceGroupName -n $deployprefix$serviceplanSuffix --number-of-workers 2 --sku B1) - #Create the Function App - echo "Creating FHIREventProcessor Function App ["$faname"]..." - fahost=$(az functionapp create --name $faname --storage-account $deployprefix$storageAccountNameSuffix --plan $deployprefix$serviceplanSuffix --resource-group $resourceGroupName --runtime dotnet --os-type Windows --functions-version 2 --query defaultHostName --output tsv) - #Add App Settings - echo "Configuring FHIREventProcessor Function App ["$faname"]..." - stepresult=$(az functionapp config appsettings set --name $faname --resource-group $resourceGroupName --settings FS_URL=$fsurl FS_TENANT_NAME=$fstenant FS_CLIENT_ID=$fsclientid FS_SECRET=$fssecret FS_RESOURCE=$fsaud EventHubConnection=$evconnectionString EventHubName=$evhub) - echo "Deploying FHIREventProcessor Function App from repo to host ["$fahost"]..." - #deployment from git repo - stepresult=$(retry az functionapp deployment source config-zip --name $faname --resource-group $resourceGroupName --src $deployzip) - #Deploy HL7 FHIR Converter - hl7converterinstance=$deployprefix$hl7convertername$RANDOM - echo "Deploying FHIR Converter ["$hl7converterinstance"] to resource group ["$hl7converterrg"]..." - stepresult=$(az group deployment create -g $hl7converterrg --template-uri https://raw.githubusercontent.com/microsoft/FHIR-Converter/master/deploy/default-azuredeploy.json --parameters serviceName=$hl7converterinstance --parameters apiKey=$hl7convertkey) - echo "Deploying Custom Logic App Connector for FHIR Server..." - stepresult=$(az group deployment create -g $resourceGroupName --template-file hl7tofhir/LogicAppCustomConnectors/fhir_server_connect_template.json --parameters fhirserverproxyhost=$faname".azurewebsites.net") - echo "Deploying Custom Logic App Connector for FHIR Converter..." - stepresult=$(az group deployment create -g $resourceGroupName --template-file hl7tofhir/LogicAppCustomConnectors/fhir_converter_connect_template.json --parameters fhirconverterhost=$hl7converterinstance".azurewebsites.net") - echo "Loading HL7 Ingest connections/keys..." - hl7storekey=$(az storage account keys list -g $hl7rgname -n $hl7storename --query "[?keyName=='key1'].value" --output tsv) - hl7sbconnection=$(az servicebus namespace authorization-rule keys list --resource-group $hl7rgname --namespace-name $hl7sbnamespace --name RootManageSharedAccessKey --query primaryConnectionString --output tsv) - echo "Loading FHIREventProcessor Function Keys..." - fakey=$(retry az rest --method post --uri "https://management.azure.com"$faresourceid"/host/default/listKeys?api-version=2018-02-01" --query "functionKeys.default" --output tsv) - echo "Deploying HL72FHIR Logic App..." - stepresult=$(az group deployment create -g $resourceGroupName --template-file hl7tofhir/hl72fhir.json --parameters HL7FHIRConverter_1_api_key=$hl7convertkey azureblob_1_accountName=$hl7storename azureblob_1_accessKey=$hl7storekey FHIRServerProxy_1_api_key=$fakey servicebus_1_connectionString=$hl7sbconnection servicebus_1_queue=$hl7sbqueuename) - echo " " - echo "************************************************************************************************************" - echo "HL72FHIR Workflow Platform has successfully been deployed to group "$resourceGroupName" on "$(date) - echo "Please note the following reference information for future use:" - echo "Your FHIR EventHub namespace is: "$evhubnamespaceName - echo "Your FHIR EventHub name is: "$evhub - echo "Your HL7 FHIR Converter Host is: "$hl7converterinstance - echo "Your HL7 FHIR Converter Key is: "$hl7convertkey - echo "Your HL7 FHIR Converter Resource Group is: "$hl7converterrg - echo "************************************************************************************************************" - echo " " -) - -if [ $? == 0 ]; - then - echo "HL72FHIR Workflow Platform has successfully been deployed" -fi diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl7ingest.bash b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl7ingest.bash deleted file mode 100644 index 53df3e048c..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/deployhl7ingest.bash +++ /dev/null @@ -1,203 +0,0 @@ -#!/bin/bash -set -euo pipefail -IFS=$'\n\t' - -# -e: immediately exit if any command has a non-zero exit status -# -o: prevents errors in a pipeline from being masked -# IFS new value is less likely to cause confusing bugs when looping arrays or arguments (e.g. $@) -# -#HL7 Ingest Setup --- Author Steve Ordahl Principal Architect Health Data Platform -# - -usage() { echo "Usage: $0 -i -g -l -p " 1>&2; exit 1; } - -function fail { - echo $1 >&2 - exit 1 -} - -function retry { - local n=1 - local max=5 - local delay=15 - while true; do - "$@" && break || { - if [[ $n -lt $max ]]; then - ((n++)) - echo "Command failed. Retry Attempt $n/$max in $delay seconds:" >&2 - sleep $delay; - else - fail "The command has failed after $n attempts." - fi - } - done -} -declare defsubscriptionId="" -declare subscriptionId="" -declare resourceGroupName="" -declare resourceGroupLocation="" -declare storageAccountNameSuffix="store"$RANDOM -declare storageConnectionString="" -declare busnamespaceName="hlsb"$RANDOM -declare busqueue="hl7ingest" -declare sbconnectionString="" -declare serviceplanSuffix="asp" -declare serviceplansku="B1" -declare faname=hl7ingest$RANDOM -declare deployzip="hl7ingest/distribution/publish.zip" -declare deployprefix="" -declare defdeployprefix="" -declare storecontainername="hl7" -declare stepresult="" -declare fahost="" -declare fakey="" -declare faresourceid="" -# Initialize parameters specified from command line -while getopts ":i:g:n:l:p" arg; do - case "${arg}" in - p) - deployprefix=${OPTARG:0:14} - deployprefix=${deployprefix,,} - deployprefix=${deployprefix//[^[:alnum:]]/} - ;; - i) - subscriptionId=${OPTARG} - ;; - g) - resourceGroupName=${OPTARG} - ;; - l) - resourceGroupLocation=${OPTARG} - ;; - esac -done -shift $((OPTIND-1)) -echo "Executing "$0"..." -echo "Checking Azure Authentication..." -#login to azure using your credentials -az account show 1> /dev/null - -if [ $? != 0 ]; -then - az login -fi - -defsubscriptionId=$(az account show --query "id" --out json | sed 's/"//g') - -#Prompt for parameters is some required parameters are missing -if [[ -z "$subscriptionId" ]]; then - echo "Enter your subscription ID ["$defsubscriptionId"]:" - read subscriptionId - if [ -z "$subscriptionId" ] ; then - subscriptionId=$defsubscriptionId - fi - [[ "${subscriptionId:?}" ]] -fi - -if [[ -z "$resourceGroupName" ]]; then - echo "This script will look for an existing resource group, otherwise a new one will be created " - echo "You can create new resource groups with the CLI using: az group create " - echo "Enter a resource group name" - read resourceGroupName - [[ "${resourceGroupName:?}" ]] -fi - -defdeployprefix=${resourceGroupName:0:14} -defdeployprefix=${defdeployprefix//[^[:alnum:]]/} -defdeployprefix=${defdeployprefix,,} - -if [[ -z "$resourceGroupLocation" ]]; then - echo "If creating a *new* resource group, you need to set a location " - echo "You can lookup locations with the CLI using: az account list-locations " - - echo "Enter resource group location:" - read resourceGroupLocation -fi -#Prompt for parameters is some required parameters are missing -if [[ -z "$deployprefix" ]]; then - echo "Enter your deployment prefix ["$defdeployprefix"]:" - read deployprefix - if [ -z "$deployprefix" ] ; then - deployprefix=$defdeployprefix - fi - deployprefix=${deployprefix:0:14} - deployprefix=${deployprefix//[^[:alnum:]]/} - deployprefix=${deployprefix,,} - [[ "${deployprefix:?}" ]] -fi -if [ -z "$subscriptionId" ] || [ -z "$resourceGroupName" ]; then - echo "Either one of subscriptionId, resourceGroupName is empty" - usage -fi - -#set the default subscription id -az account set --subscription $subscriptionId - -set +e - -#Check for existing RG -if [ $(az group exists --name $resourceGroupName) = false ]; then - echo "Resource group with name" $resourceGroupName "could not be found. Creating new resource group.." - set -e - ( - set -x - az group create --name $resourceGroupName --location $resourceGroupLocation 1> /dev/null - ) - else - echo "Using existing resource group..." -fi -#Set up variables -faresourceid="/subscriptions/"$subscriptionId"/resourceGroups/"$resourceGroupName"/providers/Microsoft.Web/sites/"$faname -#Start deployment -echo "Starting HL7 Ingest Platform deployment..." -( - #set -x - #Create Storage Account - echo "Creating Storage Account ["$deployprefix$storageAccountNameSuffix"]..." - stepresult=$(az storage account create --name $deployprefix$storageAccountNameSuffix --resource-group $resourceGroupName --location $resourceGroupLocation --sku Standard_LRS --encryption-services blob) - echo "Retrieving Storage Account Connection String..." - storageConnectionString=$(az storage account show-connection-string -g $resourceGroupName -n $deployprefix$storageAccountNameSuffix --query "connectionString" --out tsv) - echo "Creating Storage Account Container ["$storecontainername"]..." - stepresult=$(az storage container create -n $storecontainername --connection-string $storageConnectionString) - #Create Service Bus Namespace and Queue - echo "Creating Service Bus Namespace ["$busnamespaceName"]..." - stepresult=$(az servicebus namespace create --resource-group $resourceGroupName --name $busnamespaceName --location $resourceGroupLocation) - #Create hl7 ingest queue - echo "Creating Queue ["$busqueue"]..." - stepresult=$(az servicebus queue create --resource-group $resourceGroupName --namespace-name $busnamespaceName --name $busqueue) - echo "Retrieving ServiceBus Connection String..." - sbconnectionString=$(az servicebus namespace authorization-rule keys list --resource-group $resourceGroupName --namespace-name $busnamespaceName --name RootManageSharedAccessKey --query primaryConnectionString --output tsv) - #Create HL7OverHTTPS Ingest Functions App - #Create Service Plan - echo "Creating hl7ingest Function App Serviceplan["$deployprefix$serviceplanSuffix"]..." - stepresult=$(az appservice plan create -g $resourceGroupName -n $deployprefix$serviceplanSuffix --number-of-workers 2 --sku $serviceplansku) - #Create the Transform Function App - echo "Creating hl7ingest Function App ["$faname"]..." - fahost=$(az functionapp create --name $faname --storage-account $deployprefix$storageAccountNameSuffix --plan $deployprefix$serviceplanSuffix --resource-group $resourceGroupName --runtime dotnet --os-type Windows --functions-version 2 --query defaultHostName --output tsv) - echo "Retrieving Function App Host Key..." - fakey=$(retry az rest --method post --uri "https://management.azure.com"$faresourceid"/host/default/listKeys?api-version=2018-02-01" --query "functionKeys.default" --output tsv) - #Add App Settings - #StorageAccount - echo "Configuring hl7ingest Function App ["$faname"]..." - stepresult=$(az functionapp config appsettings set --name $faname --resource-group $resourceGroupName --settings StorageAccount=$storageConnectionString StorageAccountBlobContainer=$storecontainername ServiceBusConnection=$sbconnectionString QueueName=$busqueue) - #deeployment from devops repo - echo "Deploying hl7ingest Function App from source repo to ["$fahost"]..." - stepresult=$(retry az functionapp deployment source config-zip --name $faname --resource-group $resourceGroupName --src $deployzip) - echo " " - echo "************************************************************************************************************" - echo "HL7 Ingest Platform has successfully been deployed to group "$resourceGroupName" on "$(date) - echo "Please note the following reference information for future use:" - echo "Your ingest host is: https://"$fahost - echo "Your ingest host key is: "$fakey - echo "Your hl7 ingest service bus namespace is: "$busnamespaceName - echo "Your hl7 ingest service bus destination queue is: "$busqueue - echo "Your hl7 storage account name is: "$deployprefix$storageAccountNameSuffix - echo "Your hl7 storage account container is: "$storecontainername - echo "************************************************************************************************************" - echo " " -) - -if [ $? != 0 ]; - then - echo "Health Data Ingest had errors. Consider deleting resource group "$resourceGroupName" and trying again..." -fi diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl72fhir.png b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl72fhir.png deleted file mode 100644 index a062bd719a..0000000000 Binary files a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl72fhir.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7ingest1.png b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7ingest1.png deleted file mode 100644 index 2251e83339..0000000000 Binary files a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7ingest1.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/LogicAppCustomConnectors/fhir_converter_connect_template.json b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/LogicAppCustomConnectors/fhir_converter_connect_template.json deleted file mode 100644 index ed4e13a854..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/LogicAppCustomConnectors/fhir_converter_connect_template.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "customApis_HL7ConversionAPI_name": { - "defaultValue": "HL7FHIRConverter", - "type": "String" - }, - "fhirconverterhost":{ - "defaultValue": "", - "type": "String" - }, - "connectorLocation": { - "type": "string", - "minLength": 1, - "allowedValues": [ - "[resourceGroup().location]", - "eastasia", - "southeastasia", - "centralus", - "eastus", - "eastus2", - "westus", - "northcentralus", - "southcentralus", - "northeurope", - "westeurope", - "japanwest", - "japaneast", - "brazilsouth", - "australiaeast", - "australiasoutheast", - "southindia", - "centralindia", - "westindia", - "canadacentral", - "canadaeast", - "uksouth", - "ukwest", - "westcentralus", - "westus2", - "koreacentral", - "koreasouth", - "francecentral", - "francesouth", - "southafricanorth", - "southafricawest" - ], - "defaultValue": "[resourceGroup().location]" - } - }, - "variables": {}, - "resources": [ - { - "type": "Microsoft.Web/customApis", - "apiVersion": "2016-06-01", - "name": "[parameters('customApis_HL7ConversionAPI_name')]", - "location": "[parameters('connectorLocation')]", - "properties": { - "connectionParameters": { - "api_key": { - "type": "securestring", - "uiDefinition": { - "displayName": "Conversion API Key", - "description": "The Conversion API Key for this api", - "tooltip": "Provide your Conversion API Key", - "constraints": { - "tabIndex": 2, - "clearText": false, - "required": "true" - } - } - } - }, - "backendService": { - "serviceUrl": "[concat('https://',parameters('fhirconverterhost'))]" - }, - "swagger":{ - "swagger": "2.0", - "info": { - "title": "HL7 FHIR Converter Connector", - "description": "HL7 FHIR Converter Connector", - "version": "1.0" - }, - "host": "[parameters('fhirconverterhost')]", - "basePath": "/", - "schemes": [ - "https" - ], - "consumes": [ - "text/plain" - ], - "produces": [ - "application/json" - ], - "paths": { - "/api/convert/{template}": { - "post": { - "responses": { - "default": { - "description": "default", - "schema": { - "type": "object" - } - } - }, - "summary": "ConvertHL7WithTemplate", - "description": "Convert an HL7 Message to FHIR with a specified template name", - "operationId": "ConvertHL7ToFHIR", - "parameters": [ - { - "name": "template", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "message", - "in": "body", - "schema": { - "type": "string" - }, - "required": true - }, - { - "name": "Content-Type", - "in": "header", - "required": true, - "type": "string", - "default": "text/plain" - }, - { - "name": "Accept", - "in": "header", - "required": false, - "type": "string" - } - ] - } - } - }, - "definitions": {}, - "parameters": {}, - "responses": {}, - "securityDefinitions": { - "API Key": { - "type": "apiKey", - "in": "header", - "name": "X-MS-CONVERSION-API-KEY" - } - }, - "tags": [] - }, - "description": "HL7 FHIR Converter Connector", - "displayName": "[parameters('customApis_HL7ConversionAPI_name')]", - "iconUri": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxESEhUTExIVFRUWGBUXFxgWFhcXFxYgGRcXFxgdFxYYHSggGBolGxcVITIhJSkrLi4uHiAzODMtNygtLisBCgoKDg0OGxAQGy0lICYyLS8vLy0tLS0vLzU3LS8uMDItLS0tLS0tLTItNy8tLS0tLS0tNS4tLS0tLS0tLy0tLf/AABEIAOEA4QMBEQACEQEDEQH/xAAcAAEAAwEBAQEBAAAAAAAAAAAABQYHBAMBAgj/xABCEAABAgIGBgcGBAYABwAAAAABAAIDEQQFEiExQQYTUWFxgQciMpGhscEUI0JS0eFicoKSJDNzorLwNUNTY4PC8f/EABsBAQADAQEBAQAAAAAAAAAAAAAEBQYDAgEH/8QANxEAAgECAwQIBQQCAwEBAAAAAAECAwQFERIhMUFRE2FxgaGxwdEiMpHh8AYUI0Jy8TM0UiQV/9oADAMBAAIRAxEAPwDcUAQBAEAQBAEAQBAEAQBAEAQHBXlZCjQjGd2Wuhh+5rntY48g61LOS8TlpWZItaDr1OjW9p5dqTfjuO5pBExeCvZHayBKA+oAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgIDT1oNX0mYn7snuII8QFyr/APGywwltXlPLmRXRXXevomqcZvo8mbyw/wAs8gC39O9eLaeqOXImY9adDcdJHdPb38ffvLhSDJjjuPkus3lFspYLOSPRezyEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEBA6df8PpP9Jy5V/+NlhhX/cp9qMi0Arj2Wmw3E9SJ7p/B5EjycGnhNQaM9M0zZYva/uLWSW9bV3fbM3SnmUKIfwO8ip1d5UpPqfkYGks6ke1HrDwHALotx4e8/S+nwIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAqvSfGDaujD5jDaOcRp8gVwuHlTZbYHHVew6s34MwshVxvzd6krf2qrWRCZucwQn7bU9U48yZ8wpVaeu2efH4frsPz+5tv2984LcnqXZv8AsWdTiqCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAzfpnp0oUCAMXPdEPBgsifEv8FEu5bFE036ao51J1eSy+u308TKlCNeaH0UUp7rVHl1NayNPeGmYPNkIr4puVSFHm9T7vvkZrH6cY5VuOlx8fuzWlcmPCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAwLTuuBS6bEe0zY2UOGdrWTvG4uLiNxCq609U2z9Dwm1dtaxi972vtf2yRXlzLIv+hdJ9kj0OGbjHc4xJ/jaWwx+6xzBUWxqdJeSqcF8K/O0z2J0/wBzRqzX9csu57fDM19aIxYQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEBTOk3SP2Wj6qG6UaOC0SN7G4PduN9kcSclHuKmmOS3su8EsP3FbpJr4Y+L4L1f3MUVebkmNHKr18Vsx1GkudsIEpDmfAFQb+56Cm8t72L86vYh3dx0UHlve4+VlW06WI4vEN7CzhDcCJcSCea6WNLoKMU9+99v5sPtK2/+fon/AGTz70f0MCtEfmx9QBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQHmIoJLReRjLK6YB3yvl9RP5metLSzZxV/XEKiQHRopubgM3uPZa3efqcAvM5qCzZ3tLWdzVVKG9+C5swCuq1i0qM+NFM3OOAwaBg1uwD75qslJyebP0S2toW9JUobl49bONjCSABMkgADEk3ABeG0lmzs2ks2XamN9goQYD72JdMbTe4jc0XDfLas9Sf7671f1j+L6lLT/8ArudX9V+eJRnC5aJ7S8W8/pOpo1ujwXn4oUN2M8WA45q2g84pn5hcx0Vpx5N+Z2L0cQgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCArdLr50eO6iUMze3+fGlNkAX3Cdz4uQF4BnOciFxdTVLRDvfIs6dmqNJXFwtj+WPGXtH8W9Ml3Og0WAXOdZhw2lznOJcdriSZlziZnMknaV02Qj1ENKpcVUks5PYlu+yXgkYdplpPEp0a1e2E2Yhs2D5nD5z4YbzW1ajm8+BvMNw+FnTy3ye9+i6v9lfXMsS8aE1CWgUiIJEj3YOQOLjxGG6/NZ3Fr7V/BT7/b3KTEbvP+KHf7EXprS9ZEYchaDeHVv5/RTcKpdHTa47MyThsNEX3FbKtSyP6L0Zn7HRpynqYM5YdhqtafyLsPzW9y/c1Mv/UvM5dDNIG06jNi3B7epFaMA4ATl+EzBHGWRXmlU1xzOuJWTtK7hw3rs9+BOrqQAgCAIAgCAIAgCAIAgCAIAgCAIAgCA+OcACSZAXknAcUPqTbyRmukWl0amxvYaunJxsvjC6Y+ItI7MMDF2JwGU4dSs5vRTNPZ4ZStKX7q84bo+WfN9XDj1XXR+poNBo4hMkA0WnvMhaMus52zDkBuUinBU45Ioru6qXdZzlx3LlySMn6QNMDTIhhQjKjsdd/3SLrZ/DsHM33CFWq63ktxr8IwtWsOkn878Ort5/TtqC4F0WTQ7R40h+tiD3LDgf8AmEZflGfdtlU4piHQR6OD+J+C59vL6lbiF70MdEfmfh+cPqXSu6VIatuJ7Ushs5+XFUFpSzeuXcUtvDN6mUDSftMG5x7yPotNYbYyZfWPyyZCyJuAmTcBtU8nZ5bWf0nR4QgQGsBMoUMNmbzJjZTMhfhsVslpjkfmE5OrVcuMn5sxTo5r40SlNtGUKNZhxNgJ7DuTj3Equt6mmXabnGbP9zbvL5o7V6r6eKRuyszAhAEAQBAEAQBAEAQBAEAQBAEAQBAeVKpLITHRIjg1jQS5xuAAXxtJZs906cqklGKzbMb0201i012ogWmwJ2QBO3HM5CYxDZ4Nzz2CvrVnPYt3mbXDMJhaR6Wrlr8I/fm/p16DoFoqKDBm+RjxJGIfl2Madgz2nkpVGloW3eZzFcRd3Uyj8i3e/wCcCp9KOltomhQXXA+/cMz/ANMHYPi7tq43FXP4F3lvgWG6Urmov8V6+315GbKIacltG6jfS4lkTDGyL3bBsH4jl3qFfXsbWnqe1vcvzgRLy7jbwz4vcvzgahFLKPCDWNAAFljR/vM/dY6OuvUcpvtZmI6q025PtZX3gkkm8m8qzTyWSJ62LJFP0mfOPL5WtHm71CvcPX8OfNv2LiyWVLPmz7olQtdTaPD2xWuPBnvHeDSrGmtU0j5iFXorWpPqfjsXmbdpfS9VQqS+ciITwDvcLLfEhWNV5QbMJh1PpLqnHrXufz1LJVZ+kG+aB1z7XQ4b3Gb2e7ifmbK88Wlruas6M9UEfnmK2v7a5lFbntXY/Z7CwrqVwQBAEAQBAEAQBAEAQBAEAQBAeFOpkODDdFiuDGME3OOA+pylmvjaSzZ0pUp1ZqEFm2YfprpdEp0SQmyA09RmZ/G/a7YMu8mtq1XUfUbvDMMhZwze2b3v0XV5lp6KdFxL22K3aIIIwyMT0HM5hd7al/d9xU49iO39tTf+Xt7li6RNJvY4FmGffxQQz8A+J/Kchv4Fda9XRHJb2VuD4f8Auq2qXyR39fJe/UYeq43h1VVV0SkRWwoYvOJyaM3O3D6DNcLi4hQpupPcvHqRyr140YOcv9muVZV8KiwQxlzW3knFxzJ2k/QLEXFxUuauuW/yMjWrTuKmqW/yIulRTEdaPIbApNNKEckSoRUFkeJYveZ7zM5p0fWRHv8AmcSOGXhJa6jT6OnGHJGjpQ0QUeReuh2rLceLSCLobbDfzPvMjtDR/cp1rHOTkZ/9R3GmlGkuLzfYvv5Fg6X6wsURkEG+NEF34YfWP92r710upZRy5ld+naGu4dThFeL2eWZjygm0L70QVrq6S+jk9WM2bb/iZM3De0u/aFJtZZSy5mf/AFFb66CqrfF+D+/mbAp5jAgCAIAgCAIAgCAIAgCAIAgCAxXpE0uNLiamEf4eGcQf5rh8R/CLwBnjslXV6ut5LcbjB8MVtDpKi+N+C5dvP6dsXoVo8adSQwg6pnWikfLk0Ha43cJnJeKVPXLLgS8TvlaUHJfM9i7efd7G6UqPCo0Fz3SZDhMncLg1owA4CQCsm1FZ8EYGEJ16iitspPxZ/Ptf1vEpcd8eJi43DJjR2WjgO8zOaq5zc5Zs/RrS1hbUlShw8XxZwQ2FxDWgkuIAAxJJkAN814bSWbO7aSze41zRWoBRIUjIxXyMR3k0bh43lZK/uHc1M/6rcvXvMjfXjuKma+Vbvc9axjWjZGA8SoUYqJ5oxyWbOOwveZ3zIfSml6qA4Ayc/qN59o90+8Kww2j0tdN7lt9vEl2VPpKq5LaUBagvzftBqlNEocOG4SiOnEifmdkeAst5Kzow0QyPzzFLv9zcymty2LsXvv7zMelOtNdTSwHqwGiGNlo9Z58Wt/SodxLVPLkarArforVSe+W3u3L37ynrgXJ11TTzR48KMJ+7e192YB6w5iY5r7GWlpnG4oqtSlTfFNe3if0ixwIBF4N4VufmbWTyZ9Q+BAEAQBAEAQBAEAQBAEAQFD6U9JTAhCjQzKLGBtEYsZgebrxwDtyi3NXStK4l/gVgq1Tppr4Y7ut/bf8AQx4D/QoJtDe9BdH/AGKitY4e9f14p3kXN4NEhxmc1Z0aeiPWfn2KXv7qu5L5VsXZz795UOl3SCZbQmG4WXxpbcWMPg79qj3VT+iLn9PWWSdzLsj6v0+pmaiGoNA6OagkPaogxmIQOzAv53gc9oVPiVxn/FHv9jP4veZvoId/t7lzp0WyJDE+Co6j0opqUdTzZF2FHzJeYsJmMzONKKy18Y2TNjJtbLA/MeZ8AFrcOtuho7d72v0Ro7Kh0VPbve1kx0Z1AaTShFcPdQCHnY52LG8j1jwG1W1vT1Sz4Ig43eqhQ0RfxS2d3F+n+jX68rEUaBEjG+w0kD5jg0c3EDmp1SahFyZjLWg69aNNcX/vwP5+isLnFzjNziXOO0kzJ5klUutn6JFqKUY7lsR+dQvms+6z5qAmsazdNBaXraBRycWs1Z/8ZLL+IaDzVxby1U0zBYpT6O7mubz+u0nl2IAQBAEAQBAEAQBAEAQBAeceM1jXPcZNaC4nYAJk9y+NpLNnqEXKSit7MDr2mOpUeJHeL3m4H4Wi5reQlPfM5qkqVnOTkfoNrSVvRjSjw8Xxf5wJjo7qIR6Y1zh1IPvDvM5Qx+7rfpXa1Wup1IhYxeOlbOK3y2d3Hw2d5r9ZU1sCE+K/ssaXHaZDAbzgrSclGLk+BjqNKVWoqcd7eRgNPiujRHxX9uI4udzyG4YDcFRyqOTbZ+hUoxpQVOO5LI6KiqU0mO2FgMXnY0drngBvIXKrW0RbOd1ddBSc+PDtNeaxrGgAANaAABgABIAKilszlIyGblLbvZGRTaJJVVOep5kyK0rI/NheMz1mQWldY6qHq2nrxBK7FrcCeJvA57FZ4ZbdJU1y3LxZNsqOuep7l5lHo1AdEe2GxtpziGtAzJuHAb8lp4tyeS3lzOsoRc5PYtrN30aqVlDo7ILbyL3uwtuPad9NgAGSuqVNQjpMDe3Urqs6ku5clwX5xKb0n1rac2itNzZPicSOo08AbXNqrsQr7VTXa/z84F1gltpTry47F6v0+pQ9Uq7UX+oapNQ1DVJqGo03osjfw8VnyxJjcHNb6h3erbD55wa5My+Ox/mjLmvJl1VgUgQBAEAQBAEAQBAEAQBAVfpEppZRdWMYrgz9I6zu+QHNQcQq6KWXPYWuEUtdfU/67e/h79xlmpVHrNXrNQ6OKv1dFtyviuLuTeq0eDjzV5h8MqWrmZXGa/SV9PCK+/27jj6T6wIhMo7T/MNp/wCVpEgeLr/0rxiFXTFQ5nfBKOc5VXw2Ltf28zN9UqnUaXUX7QSrNXCMUjrRDdua2YHeZnuUWvLU8ihxOvrqKC3LzJymu+HmVT31TLKC7yHSXE5LKrczvmeFNpDYTC92A7ycgN660aUqs1CJ7pwc5aUZ7TYror3Pdi48hsA3ALVUoRpQUI7kXtNKEVFGhdHWjurb7TEHXeJQwfhac+LvLiVeWNDJdJLe93YZzGL7pJdDB7Fv639vMtNdVk2jwXRXXyHVHzOPZHf4TKlV6ypQc2VVtQdeooL8RjlIc57nPeZucS5x2kmZWZlUcm5PezaQShFRjuR56tfNR61DVpqGoatNQ1F16MTKJHbtaw/tLh/7K0wuXxSXZ6lHjazhB9b9DQFcmeCAIAgCAIAgCAIAgCAICgdIkQujQ2ZMZPm9xn4MaqDFqv8ALGPJef8Ao0ODx00pS5vy/wBlTMFVOst9RsdX0YQoTIYwY1re4SWypQUIKK4Ixdao6lSU3xeZl+mNJ1tLiHJh1Y/Tcf7rSzt9V115dWz87zVYdT6O3iue36/bIiIVGLnBoxcQ0cSZBRdRMlNRTb4GpwILYbGtHZY0AcAJLnLJJyZlpSc5NvezhfeZrMVKjnJyfElLYsj8kBeN59KVXdOMZ93Yb2R6nefJaOzoKjDbve/2Li3pKnHrO7RCoPaYtp490yRdsccm+p3cVcWNv00838q8er3I2IXvQU8o/M93V1+xqYWiMoZrpfW3tEWy0+7hzDfxHN3oN3FZnELvpammPyrx6/Y0+HW3QU85fM/Dq9/sQGrUDUWGZ01dQtZEDcsTwGP05rjXr9HBs51auiLZzCGu2o6ZjVpqGZZ+j1sqS7+k7/OH91aYTLOs+z1RV4u86C7V5M0JaEzgQBAEAQBAEAQBAEAQBAZ3pcCaVE3BgH7AfMlZDFaj/dSXLLyzNJh+y3j3+ZF0WDN7Btc0eIUOjLVUiuteZLnPKLfUzVY0Sy0uOQJ7hNbqTyTZkox1NIx14LiScSSTxN5WJdTU83xNmskskSejNGtUlmxs3dwu8ZL3TeciNe1NNF9ewu9LMm8VHxOeijlz2FJTWbOFZwkkPpHS7LdWMXY8Pv8AVWFhSzlrfDzJdpTzlqfAr1Gojoj2saJucQB/uxXVNSqSUI72Tp1Ywi5S3I1aqKvbR4TYTcsT8xOJPNa+hRjRpqCMlcV5VqjmyH0wrfVs1LD13jrH5W/U4cJ7lXYre9FDoo/M/Bfcm4dba5dJLcvFlE1azOo0GYsJqGZZqkoGrZacOs7HcMh6qtupSqSyW5FbcVtcsluRWbCstRZZiwmoZlj0EZ/EO/pO/wA2K3wV5132eqKzFX/Cu1eTL4tMZ8IAgCAIAgCAIAgCAIAgKXphC9+DtY3zcPosjj3w3CfNLzZeYdL+LLr9iJokPrs/M3zCqraX80O1eZNqP4H2MvtdD+Hjf0on+BW7u/8Arz/xfkZ22/5odq8zMNWsRqNVmTmiML3rjsYfFzVKtPikyDiEv40ussNON4G5V2My/kjDks/r/ogUd2ZzFU2R2KlTYmse5203cBcPBXlJKnBRLSmtEUi06EVZIOjuF5m1nD4jzN3I7VpsFt/hdZ8di9fzqKjFLjNqku1+hYa0pzYMMvdwA+Y5BWl3cxt6TqS7utldQourNRRnNJiOiPc9xm5xmf8Adiw9WvKrNzlvZpoRUIqMdyPKwueo9ZkvU1WTIiOFw7I27zuR5tES4r5fDEnXi48CvHRkFPaUsMXvUXOYsJqGZZ9BoXXiu2NaO8k+i0GALOU32epVYpL4YrtLetKUwQBAEAQBAEAQBAEAQBAV7S2jzDH7JtPO8eRWZ/UdP4YVO1eq8mWeHTyco95XdWsqpZPNFnmXinC3AePmhu34tK/SK38lvLLjF+KM/S+CrHqa8zOLC/P9Rp8yc0TEnv8Ayjz+6ssOecpEC/8AlRMUkdY8vJQcQhquJd3kRKb+Ejq2dZhO2nq9+PhNRY0knmSaCzmiCoVDMSI1gxcQOG08hMqbb0pV6saceJNq1VTg5PgaRAgtY0Nbc1oAHJb6nCNOCjHcjMTk5ycnvZSa+rAx4l3YbMN37TzWKxS//c1co/Kt3uX1pQVGG3e95GWFV6iVmSVV1Zb6zuzkPm+ykUqbltZGr19Pwx3k8GrvoIGZ50q5jjsa7yXyUclmeobZJFTsKDqLbMWE1DMt+iECzCc75neAEvOa2GA02rdzfF/nqUuIzzqJckTVIjNY0ucZBomVcVakacHOW5EGEHOSiuJ9gkloJxIBK9QbcU2JJJvI/a9HkIAgCAIAgCAIAgCA5K0o+shObniOIv8AsoGJWzuLacFv3rtW37Ha3qaKiZUdWvzjMvMy21W+3BbPZZPK5fouF1ems4N8svpsKS4Wmq/qUSJBsktOIJHdcsLUThNxfB5GhUs1miT0buikbWnzB+qsMKl/M11ES9208+sm47esV0uqf80vzgQoP4SFr34W8T6D1UCutORNteLOjRGi9dz/AJRIcT9h4q6/T1HVUlVfBZfX88TliNTKCjzJjSGkWIJGb+qOePhNW+M3PQ2slxls+u/wIVnT11U+W0p1hYPMvMzsq6gawzPZGO/cpVtR6R5vccK1bQtm8nw1Wmgr8z7ZTSMzkrQyhO3yHeVwuPhptnWhtqIr1hVGZZZiwmYzL3VtH1cJjMwL+JvPiSv0eyodDbwp8lt7ePiZ2vPXUciDrqm66I2C09W0A4jMzl3Dz4LP4neq5rxtafy5pN8/svPsLC1o9FB1Zb8iyrVFUEAQBAEAQBAEAQBAEAQFbraiWHkjB149Qvz7HLP9tcuS+WW1eq/OZbW1XXDbvR21BFucz9Q8j6K3/TNznGdB8Nq8n6fUj3sdqkQteUazGdsd1hzx8Zqrxmj0V3Lk9v1++ZOtKmqkurYeNWusxWHfLvu9VFsaui4g+vL67DpXWqm0WSMy9aC5p/yZlXB7CBrpvXH5R5lUV/sqJdRY2z+Am9GoNmDP5nE913otXgFPTaKX/pt+noV19LOrlyOHSaJN7W/KJ95+wVR+pK2daFPks/r/AKJNhHKDlzIqFBLiGjErP0oOpNRXEmymorNlhgQQxoaMAtJToqEVFFZKbk82fuS9aTzmJJpGZG1065rd5Pdd6qtxKWmMY8yVara2RVhU+ZMzO6pqHbijY3rHlgO/1Vtg1q7i6XKO1+nj4Zke6q6Kb5vYSNc1riyGfzOHkPqrfF8ZUc6NB7eLXkvf8UW1tf7z+hw1BR5xgcmgn0HmqzAaXSXal/5TfoSLyeVJrmWtbspggCAIAgCAIAgCAIAgCA8KZRhEbLPEHYVBxGxjeUHTe/enyf5vOlKo6csyEorzDiAm6RkfVYKxrzsLxOossnlJdXH3LKpFVIbDr0hotpoeMW48D9D5lan9Q2vSUVXjvjv7H7PzZHsqmmTg+JXbCxeZaZlmo8S2xrs5X8c1tKU1cUIVfr28SpnHRNxIeuGe85D1WdxVaa/cidbP4CwVS2UFg3T771tcLjps6a6vPaVly86siBri+M7kPALGY3PVfT6svJFla7KSPWqIGLuQ9fRdcJo56qj7F6ni5nuiScldaSJmJJpGYkmkZkHWD7TzuuHL7zWXv6uuu8uGz87yworTBHPZULM65nsyO5rC1t0+0czu4KZTvZ0qLpU9me98X1dn37Dm6cZS1PhuPGyoeZ0zLBo/R7LC7Nx8B95rb/p226O3dV75PwX3z8CrvamqenkSq0JDCAIAgCAIAgCAIAgCAIAgOCsqFbFpvaHj91nscwn91HpaS+NeK9+X05Em3raPhe4VbFD2FjsQJEHMYfZfcDu43Ns7ervjsafFbvs/uLiDhPUiDptEMNxblkdoWTxGylaVnTe7g+a/N5Y0qqqRzOyposiWHO8cc/DyVpgV0tToS47V28fDyOF1DNa0fmuoXWadol3H7rxj9PTVhLmsvo/ufbSXwtEzV38pn5QtbhjztKX+KIFf/kl2kDWbfev4+gWFxnZfVO30RZ27/jRI0Bkobe/vV/h1LTbQ69v1ItaWc2e8lN0nLMSTSMzxpcWy0nPAcVEva6t6Lnx3Lt/Np7px1SyIOysXmWWYspmMxZTMZnrRqOXuDRn4bVKs7aVzWjSjx8FxZ4qVNEXJlphsAAAwAkF+nU6cacVCO5bEUrbbzZ+l7PgQBAEAQBAEAQBAEAQBAEAQHJHo0nW2drMfNt5qnusPcKyu7ZfHxXCS49j9du87wqZx0T3eQpVHbGZvyOw5gr1e2lLErdOO/g+T4p+TXsKdR0ZkAWOY7YQe5fn7VW2q5PZKLLPNSXUySpxESEHjFpv3TuPjJaXEpxvcPjcQ3xe3qz2NfXLuIlFOnVcXxO2q3ThN3THiVeYJUU7Gn1Zr6Nke4WVRkXW8OUQ7wD6eiyf6ip6L1vmk/T0JlrLOmSFGHUbwHktFZLO3p5f+V5Eap8zPSSk6TwJJpBE02LbdIXgYSzWOxO6d1W0U9qWxZceb9uonUo6I5s+exENLn3DZmfon/wCXKlSda4eSXDi3wXV4jpk3pic0lU5nYSTMZk5VVDsC0R1j4DYt/gWG/taXSVF8cvBcvf7Fbc1tbyW5Her4jBAEAQBAEAQBAEAQBAEAQBAEAQHwBeVFJtrifczlp1CEQbHDA+hVViuEwvYZrZNbn6Pq8jtRrOm+oioLjDJa4XG5w9QsfbValjVlQuE1GWyS9V2E2SVRKUd63EhVBlaYcjMbwdnctH+nm6calvLg81yaa3rq2Z95FutuUjzruH2Xcj5j1UX9U2+ynWXWn5r1PdpLfE9aAZw293cVOwmWuzg+76PI8VllNnvJWORyDmzuXmVNSTi9zPqeR+QxrRcABnkuUaVG3i3FKK48PqfXKUnzImm0m2bsBh9VjMUxH91PKPyLd19fsTqVPQtu85lVHUlKtoGD3jgPUrYYJgji1cXC7F6v0RCr3H9YkqtcQggCAIAgCAIAgCAIAgCAIAgCAIAgCAIDxpNGa8SPI5hQb7D6N5DTUXY+K/OR0p1ZQeaI9jHQXC1e3C0NhyOzas5Sp1sKrxdZZw3KS5Pg+W3auvc9rJTca0dm/kSFLhW2EbrvRaPEbb91azpre1s7d6ItKeiaZwVS/FvMeR9Fnf05W+GdCW9bV5P0+pKuY7pEhJafSRDwj0tjc5nYL/8A4q26xO2t085Zvktr+3edYUpSIulUlz9w2fXasjf4lXu3k9keS9eZMp0ow7Tzg0dzzJon5d6i2tjXuZaaUc/Jdr3HudSMVtZLUOrgy83u8BwW0wzAaVq1UqfFPwXZ7+CINW4c9i2I7lfkYIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgPjgDcV5lGMk4yWaYTy3H5hss3DDLd9lzo0VSjoju4Ll1Lq5cuzJL1KWe1kfSaO5r7TAb77hOW1Zu9sK9C66a2T25vYs8nx+u//AESqdSMoaZnm6DGdjPvAHco9S0xOv8+p96S+ma8j2p0o7j6yrHZkDxXqn+naz+aSX1ft5nx3UeB1QqtYMZu44dwVpQwC1p7Z5yfXu+i9czjK5m92w62tAuAkrqEIwWmKyXUcG2959Xo+BAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQBAEAQH//2Q==" - } - } - ] -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/LogicAppCustomConnectors/fhir_server_connect_template.json b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/LogicAppCustomConnectors/fhir_server_connect_template.json deleted file mode 100644 index 804091a07c..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/LogicAppCustomConnectors/fhir_server_connect_template.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "customApis_FHIR_Server_Proxy_name": { - "defaultValue": "FHIRServerProxy", - "type": "String" - }, - "fhirserverproxyhost":{ - "defaultValue": "", - "type": "String" - }, - "connectorLocation": { - "type": "string", - "minLength": 1, - "allowedValues": [ - "[resourceGroup().location]", - "eastasia", - "southeastasia", - "centralus", - "eastus", - "eastus2", - "westus", - "northcentralus", - "southcentralus", - "northeurope", - "westeurope", - "japanwest", - "japaneast", - "brazilsouth", - "australiaeast", - "australiasoutheast", - "southindia", - "centralindia", - "westindia", - "canadacentral", - "canadaeast", - "uksouth", - "ukwest", - "westcentralus", - "westus2", - "koreacentral", - "koreasouth", - "francecentral", - "francesouth", - "southafricanorth", - "southafricawest" - ], - "defaultValue": "[resourceGroup().location]" - } - }, - "variables": {}, - "resources": [ - { - "type": "Microsoft.Web/customApis", - "apiVersion": "2016-06-01", - "name": "[parameters('customApis_FHIR_Server_Proxy_name')]", - "location": "[parameters('connectorLocation')]", - "properties": { - "connectionParameters": { - "api_key": { - "type": "securestring", - "uiDefinition": { - "displayName": "Function Key", - "description": "The Function Key for this api", - "tooltip": "Provide your Function Key", - "constraints": { - "tabIndex": 2, - "clearText": false, - "required": "true" - } - } - } - }, - "backendService": { - "serviceUrl": "[concat('https://',parameters('fhirserverproxyhost'))]" - }, - "swagger": { - "swagger": "2.0", - "info": { - "title": "FHIR Proxy Connector", - "description": "Logic App Custom Connector to FHIR Proxy", - "version": "1.0" - }, - "host": "[parameters('fhirserverproxyhost')]", - "basePath": "/", - "schemes": [ - "https" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": { - "/api/fhir/{resource}/{id}": { - "get": { - "responses": { - "default": { - "description": "default", - "schema": {}, - "headers": { - "Content-Type": { - "description": "Content-Type", - "type": "string" - }, - "Accept": { - "description": "Accept", - "type": "string" - } - } - } - }, - "summary": "Get individual resource from FHIR Server", - "description": "Get an individual resource from the FHIR Server", - "operationId": "GetIndividualResource", - "parameters": [ - { - "name": "resource", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ] - } - }, - "/api/import": { - "post": { - "responses": { - "default": { - "description": "default", - "schema": {} - } - }, - "summary": "Import Bundle to FHIR Server", - "description": "Import Bundle to FHIR Server", - "operationId": "ImportBundle", - "parameters": [ - { - "name": "message", - "in": "body", - "schema": { - "type": "object" - }, - "required": true - }, - { - "name": "Content-Type", - "in": "header", - "required": false, - "type": "string" - }, - { - "name": "Accept", - "in": "header", - "required": false, - "type": "string" - } - ] - } - } - }, - "definitions": {}, - "parameters": {}, - "responses": {}, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "in": "header", - "name": "x-functions-key" - } - }, - "tags": [] - }, - "description": "Logic App Custom Connector to FHIR Server Proxy", - "displayName": "[parameters('customApis_FHIR_Server_Proxy_name')]", - "iconUri": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAqACoAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCABoAHMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACsDxZ8UdA8DoTquqWtlx0kbGadq/iKO51QabDKBKxxJtPzJXwb+3d4rvL74sm2MsiwxwKuzPBI71+Z+JHiA+GsreNw8FUlzKKT2v8ALsfd8EcHf25j1ha03CNubTe3/BPrmX9sbwPHOUGs2RGcbhJ/9aut8K/Gvwr42nWLS9bsbyYgHZGxJH6V+UlaXhzxfqPhO8E+n3c1rID1jbFfgGX/AEls0jWX1zDQlDra6fy1t95+xYzwLwEqT+rV5KfS9rfM/XKivlT9jz9s8+K5odA1+QC7xiKUnO8D1J7816j+05+0xY/A/wAL7kZZdRuVIt4+o3YzzjoK/o/LPEfJMbkss9jV5aUV7194vtbv27n4hj+CM1wuaLKXTvUltbZrv6Hofijx5o/gqDzdV1C3sY/70pxXC6l+2B4GsboxrrljMB/EsnB/Svz6+JHxs174manNNfX05ilYsId5KL9K5Gv58zv6SuLddxyrDR9mtnO9392h+zZV4GYf2KlmFd8/aNrL7z9TvCf7Q3hDxk6x2euWMkzHAjVyT/Ku1RxIuRyK/IjR9fvNAuVms7iW3kU5DI2DX1z+xh+2LcarqEPh3X5d8j4WGZzksB6mvsOAfH2hm2Ljl+b01SnPSMk/db7O+1z5rjDweq5dh5YzLZupGOrT3t3Vj6/opscgljVhyGGQadX9Hn4gFFFFABVXW9SXR9Iurp/u28TSn6AE1arhf2ivEH/COfCzUpc48yJ4/wA1IrgzXGLCYOriX9iLf3I7MvwzxOJp0F9ppHz98Df2iIfGX7T9+DN/o+qXAWBS3TFcr/wUc+F8+neNYtfihIsZoki344Ld6+ctC8SXPhfxEl/auyTwyFlYHGDmv0N+C/iuw/aH+DcF1rlovl2Z2MZo8D5RjPNfyFwhmMeOMmxfDeOny4hzdWEum93fyV3+B/SXEmCfCeZ4fPMJHmo8qpyj18vvPzr0/QrrVI2aCFpAvXHaq0kZhcqwwR1Ffd/ij9qT4U/CvUn0k6NHctAdhkgtlZW/HFV7Hxv8JP2hofsy2kWlGTjcyLCa+WqeEuWTn9UwmcUZ4haOGq17Xue/DxGx8Y/WMRltSNF/a3072sfEOiazPoGpw3Vu5SWFgwI9jmtz4n/FXVPiprIvNSneVgqqAe2BivcPjn+wdceH7STVfDMq3unjkAPvc+mMV84appNzot40F1DJBKhwVdcGvz/iDIc84f5sux8XCEmnp8ErbNPZ7n2WTZvlOc8uNwjUpxVv70b7p9UV6KKK+QPpQq74e1ibQdYguoHKSROCCPrVKhThqunOUJKcXZomcVOLjLZn6k/s6fEUfEv4X2F//EqiE891AFd3Xz5/wTuv5Lz4LxB+08n86+g6/wBNeBczqZhkGExlXWUoRb9bH8H8WYCGCzjEYan8MZO33hRRRX1h86FeU/tjgH4MXmeMNn9DXq1cr8aPDKeK/hnrFs67v9ElZf8AeCHFeNxFg3i8sr4aO8otfgerkeJjh8wo15bRkn+J+UySrPLuU5Bb+tfdzan/AMIl+yRnTXK+dEQ5X3QZr855tUuvA+v3FjeKf3MhBBHI5r71/Y+8c2Xxw/Z21PQHdZNQSOUxx55AxgHFfxX4TYeph8wxmX7VKtKSg/NdPVn9XeJ9H/Y8Ljbc1OnUi5ej6/I+NZ52uJS7nLNyTSwTtbTLIh2upyCO1avjzwfc+BfFN3pl0hWW1fYcjrWPX4fXpVKNWVKqrSi7Pumj9Mo1IVaanT1i1p6H0B+zn+2xq/w9vIbDV5pL7TT8gEj8Rr0r2b4y/s7+Hf2mfCR8R+F2iXUSm/Ea8zn+6fzr4ZBxX0j/AME99d8SXPj2S1sLjOnRhDdJJl8Jn+HnjnFftnh9xlUzWUOFc9pvEUKukes4Pun2X9dj8q4z4Yhl6lxBlM1Rq09ZfyzXZrzPBfGvgi/8B63LY6hA0MsbFcEdcVkV9g/8FIJPDrafCIRD/bYZM+XgfLnnIxXx9X59x5wzTyDOquW0aiqRjs/Xo/NH2fCGfTzjK6eOqQ5JPdfqvJhUllF9ovIk/vuF/M1XuLuO1TMjhR716d+xz8KH+OXxLi/dOdKsX/0hx68Ec15PD+Q4vN8dTwWEjeU2l/wfketm2ZUcvwdTGYh2jBXPtn9k3wp/wgfhSHTMYzCtxj/fANew1h+FtIt4JBPb/dSFbYf8A4rcr/S7h7LY5fl9PB0/hgrL0P4RzvHPGYyeJlvLV+oUUUV7R5QUy4gW6geNxuR1KsD3Bp9FG+gbH5b/APBST4JH4b/GO41SGLy7LV5CYlUfKuK4z9jf48T/AAO+K1rc+YRa3ZWCUZ4VSeTX6G/tw/s6p8ePhbcLBFv1SzjJtSBk5NflH4h0K58K65cWVyrRz2sjRnPByDiv458Q8nxPDfEf9pYVWhKXPF+fVff+B/Yfh7nGG4j4d/s3Fu8orkkvLo/66n39+3B8F4viF4Qi8e+FkW5R4zLKE/5a5J5OMntXxT/wnEdvI0dwhjkQlWXB4Ir6M/YD/bLXQing3xTIsmmTgRQSSEbYlxjBznPJr0D4w/8ABMaz8d/EW31jQLuC30e+ZZJISGYnPJOR65p8R8E4bi+nHPsih+9lZVYLRqX83ozz8k4hfC1aWSZ9JqnG7pVN04/yvzR8cx+ObBgMyMD/ALtdb8MP2lLj4P6hPPpV5NA9woWTZxuA5qL9tD9n7T/2efHVjplhdxXS3ELSSbCf3ZBAwc15t4b+G+u+MImk0zTLq9RRlmjXOK/Jp8NYvKczdCk5Rr039l3adulvJn6bSxOXZpl0cROzo1F9rRPXrfzR2Pjb44zeOdZkvr+5lupmJwX5wPSuWvviDLKCscaqPXNVIfh9rU+sjT0065a9JwIQPmr6Y/Zh/wCCamtePri31HxPG2m2AIaS1mQq7j0BFduT8FY/OcY40KUqk29XK+nm2zHNM9yjJcL7XEVIxglol19Ejx/4D/AnxH+0X4whsbZJ/suQ00hGAqZ5IJGDX6O/C/4e+H/2UfCFroOlrFcavdoASRhrgjglsd65X4ifGjwB+xV4HOm6LHBPqe3YsMbDzVYjqcjpmqH7HOg+IPjV4jb4geKd+1mEmmRsNoVGHPGcHmv6Q4M4dy/h/FRy/CWrY2XxSXw049fn+b7H4Fxhn+Oz3Cyx+JTo4KPwxejqS6fL8kfTGh2a2WnIFG3zP3hHoTyauUDiiv6AjHlVkfgkpOT5mFFFFMkKKKKAEIyK+E/+Cjn7GTz3D+LPD9sOmJ4ox+LNgd6+7ar6ppkGs2EttcRiSGZSjqR1Br5nizhfC59gJYLE77xfZ9z6XhTifE5Fj443D+kl3XY/DWKSbS7wMN8M0TZ5GCpr6X+GP/BTLxT4B+HB0N4ILyRFKxzysS46Ac/hXaft0f8ABP8Au9C1K68SeFrZp7SUmWWCJP8AV+2fwr4xuLd7S4eKRSrxsVYHsR1r+O8XSz3g/HzoQk6bd1dbSXdf1of2Fg6uRcX4CFecVUS1s94vs/61Ot1DxbqPxq+KVvdatcGSS9u0yHfIQMwBAzX60fBz4D+Gvh74HsrWz0+1fdCrPIUG5yQDzX42WF42nX0M6HDwSLIp9CDmvuP4Ff8ABVOHQfBkNhr9k091aptEzSBd4GABivsvCXifKsDi8RUziXvzs1OSv3v958d4scMZrjsJh6eTx9yF04xdu1vuPpn4zz/Dz4A6G3ifWdHsoiriNZIoN0hY9P1r46/aJ/4Kd6j4utpdN8KJ9ksWBVZwGjlUe1cL+2T+2zc/tJlbG3gks9MjYN5ZfcHYHg1m/sl/sb6z+0F4ht5nt5INF3AyXBXKba9LifjrH5vmTyjhZWpy0vGNm31d+i8zzeGeBsBlGXLN+KXepHW0pXSXRJdWbn7Jv7PniL9qH4kQ6rrElzcWNvIJXknJ+faeRz1r9PfDPhu18I6Hb6fZRLDbWy7I0UYCisj4VfCvS/hH4Tt9K0uBIY4lG8qPvtjk101ftXAfBdPIcJ775q09Zy8+y8j8W464zqZ9i/cXLRhpCPl39Qooor7w+ECiiigAooooAKKKKAIr2xi1G2aGeNZY3GGVhkGvkP8AbF/4JzWnjsXGveGES3v1XdJDnajAegHfmvsGivB4h4awGdYZ4XHQuuj6p90z3uH+JMfk2JWJwM7PqujXZo/ELxv8PNW+Hury2eqWc9tJG23LoVDe4rKsNNn1W5WG2hknlc4VEXcT+FfsV8b/ANl7wt8dNOZdV0+3e7xhLhlyyVxXwK/4J9eD/g7qBvJraDVLxG3QyvHtMRz2r+ccX4FZkseqWHqJ0X9p7pea7n9F4Txzy54B1cRTarL7K2b9ex8ufsi/8E5NR+IFxb6z4kRrbTUYOIidsjHqMg9q/QbwN4C034e6HFY6bbRW8US7fkQDP1rXggW2hWNBtRBgAdhT6/e+EuCMu4focmFjeb3k93/kj8G4s42zHP6/PipWgtorZf5sKKKK+xPjwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//2Q==" - } - } - ] -} diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/hl72fhir.json b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/hl72fhir.json deleted file mode 100644 index 4fd489271b..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/hl7tofhir/hl72fhir.json +++ /dev/null @@ -1,316 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "HL7FHIRConverter_1_Connection_Name": { - "type": "string", - "defaultValue": "HL7FHIRConverter-1" - }, - "HL7FHIRConverter_1_Connection_DisplayName": { - "type": "string", - "defaultValue": "HL7FHIRConverter" - }, - "HL7FHIRConverter_1_api_key": { - "type": "securestring", - "metadata": { - "description": "The Conversion API Key for this api" - } - }, - "azureblob_1_Connection_Name": { - "type": "string", - "defaultValue": "hl7blobstorage" - }, - "azureblob_1_Connection_DisplayName": { - "type": "string", - "defaultValue": "hl7blobstorage" - }, - "azureblob_1_accountName": { - "type": "string", - "metadata": { - "description": "Name of the storage account the connector should use." - } - - }, - "azureblob_1_accessKey": { - "type": "securestring", - "metadata": { - "description": "Specify a valid primary/secondary storage account access key." - } - }, - "FHIRServerProxy_1_Connection_Name": { - "type": "string", - "defaultValue": "FHIRServerProxy-1" - }, - "FHIRServerProxy_1_Connection_DisplayName": { - "type": "string", - "defaultValue": "FHIR Server" - }, - "FHIRServerProxy_1_api_key": { - "type": "securestring", - "metadata": { - "description": "The Function Key for this api" - } - }, - "servicebus_1_Connection_Name": { - "type": "string", - "defaultValue": "HL7ServiceBus" - }, - "servicebus_1_Connection_DisplayName": { - "type": "string", - "defaultValue": "HL7ServiceBus" - }, - "servicebus_1_connectionString": { - "type": "securestring", - "metadata": { - "description": "Azure Service Bus Connection String" - } - }, - "servicebus_1_queue": { - "type": "string", - "metadata": { - "description": "Azure Service Bus Queue Name" - } - }, - "LogicAppLocation": { - "type": "string", - "minLength": 1, - "allowedValues": [ - "[resourceGroup().location]", - "eastasia", - "southeastasia", - "centralus", - "eastus", - "eastus2", - "westus", - "northcentralus", - "southcentralus", - "northeurope", - "westeurope", - "japanwest", - "japaneast", - "brazilsouth", - "australiaeast", - "australiasoutheast", - "southindia", - "centralindia", - "westindia", - "canadacentral", - "canadaeast", - "uksouth", - "ukwest", - "westcentralus", - "westus2", - "koreacentral", - "koreasouth", - "francecentral", - "francesouth", - "southafricanorth", - "southafricawest" - ], - "defaultValue": "[resourceGroup().location]" - }, - "LogicAppName": { - "type": "string", - "minLength": 1, - "defaultValue": "HL7toFHIR" - } - }, - "variables": {}, - "resources": [ - { - "properties": { - "state": "Enabled", - "definition": { - "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#", - "actions": { - "ConvertHL7WithTemplate": { - "type": "ApiConnection", - "inputs": { - "host": { - "connection": { - "name": "@parameters('$connections')['HL7FHIRConverter']['connectionId']" - } - }, - "method": "post", - "body": "@{base64ToString(body('Get_blob_content')['$content'])}", - "headers": { - "Content-Type": "text/plain" - }, - "path": "/api/convert/@{encodeURIComponent(concat('hl7v2/',json(base64ToString(triggerBody()?['ContentData'])).msgtype,'_',json(base64ToString(triggerBody()?['ContentData'])).msgevent,'.hbs'))}" - }, - "runAfter": { - "Get_blob_content": [ - "Succeeded" - ] - } - }, - "Get_blob_content": { - "type": "ApiConnection", - "inputs": { - "host": { - "connection": { - "name": "@parameters('$connections')['azureblob']['connectionId']" - } - }, - "method": "get", - "path": "/datasets/default/files/@{encodeURIComponent(encodeURIComponent(concat(json(base64ToString(triggerBody()?['ContentData'])).container,'/',json(base64ToString(triggerBody()?['ContentData'])).filename)))}/content", - "queries": { - "inferContentType": true - } - }, - "runAfter": {} - }, - "Import_Bundle_to_FHIR_Server": { - "type": "ApiConnection", - "inputs": { - "host": { - "connection": { - "name": "@parameters('$connections')['FHIRServerProxy_1']['connectionId']" - } - }, - "method": "post", - "body": "@body('ConvertHL7WithTemplate')['fhirResource']", - "path": "/api/import" - }, - "runAfter": { - "ConvertHL7WithTemplate": [ - "Succeeded" - ] - } - } - }, - "parameters": { - "$connections": { - "defaultValue": {}, - "type": "Object" - } - }, - "triggers": { - "When_a_message_is_received_in_a_queue_(auto-complete)": { - "type": "ApiConnection", - "inputs": { - "host": { - "connection": { - "name": "@parameters('$connections')['servicebus']['connectionId']" - } - }, - "method": "get", - "path": "[concat('/@{encodeURIComponent(encodeURIComponent(''',parameters('servicebus_1_queue'),'''))}/messages/head')]", - "queries": { - "queueType": "Main" - } - }, - "recurrence": { - "frequency": "Second", - "interval": 30 - } - } - }, - "contentVersion": "1.0.0.0", - "outputs": {} - }, - "parameters": { - "$connections": { - "value": { - "HL7FHIRConverter": { - "id": "[resourceId('Microsoft.Web/customApis', 'HL7FHIRConverter')]", - "connectionId": "[resourceId('Microsoft.Web/connections', parameters('HL7FHIRConverter_1_Connection_Name'))]", - "connectionName": "[parameters('HL7FHIRConverter_1_Connection_Name')]" - }, - "azureblob": { - "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'azureblob')]", - "connectionId": "[resourceId('Microsoft.Web/connections', parameters('azureblob_1_Connection_Name'))]", - "connectionName": "[parameters('azureblob_1_Connection_Name')]" - }, - "FHIRServerProxy_1": { - "id": "[resourceId('Microsoft.Web/customApis', 'FHIRServerProxy')]", - "connectionId": "[resourceId('Microsoft.Web/connections', parameters('FHIRServerProxy_1_Connection_Name'))]", - "connectionName": "[parameters('FHIRServerProxy_1_Connection_Name')]" - }, - "servicebus": { - "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'servicebus')]", - "connectionId": "[resourceId('Microsoft.Web/connections', parameters('servicebus_1_Connection_Name'))]", - "connectionName": "[parameters('servicebus_1_Connection_Name')]" - } - } - } - } - }, - "name": "[parameters('LogicAppName')]", - "type": "Microsoft.Logic/workflows", - "location": "[parameters('LogicAppLocation')]", - "tags": { - "displayName": "LogicApp" - }, - "apiVersion": "2016-06-01", - "dependsOn": [ - "[resourceId('Microsoft.Web/connections', parameters('HL7FHIRConverter_1_Connection_Name'))]", - "[resourceId('Microsoft.Web/connections', parameters('azureblob_1_Connection_Name'))]", - "[resourceId('Microsoft.Web/connections', parameters('FHIRServerProxy_1_Connection_Name'))]", - "[resourceId('Microsoft.Web/connections', parameters('servicebus_1_Connection_Name'))]" - ] - }, - { - "type": "MICROSOFT.WEB/CONNECTIONS", - "apiVersion": "2018-07-01-preview", - "name": "[parameters('HL7FHIRConverter_1_Connection_Name')]", - "location": "[parameters('LogicAppLocation')]", - "properties": { - "api": { - "id": "[resourceId('Microsoft.Web/customApis', 'HL7FHIRConverter')]" - }, - "displayName": "[parameters('HL7FHIRConverter_1_Connection_DisplayName')]", - "parameterValues": { - "api_key": "[parameters('HL7FHIRConverter_1_api_key')]" - } - } - }, - { - "type": "MICROSOFT.WEB/CONNECTIONS", - "apiVersion": "2018-07-01-preview", - "name": "[parameters('azureblob_1_Connection_Name')]", - "location": "[parameters('LogicAppLocation')]", - "properties": { - "api": { - "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'azureblob')]" - }, - "displayName": "[parameters('azureblob_1_Connection_DisplayName')]", - "parameterValues": { - "accountName": "[parameters('azureblob_1_accountName')]", - "accessKey": "[parameters('azureblob_1_accessKey')]" - } - } - }, - { - "type": "MICROSOFT.WEB/CONNECTIONS", - "apiVersion": "2018-07-01-preview", - "name": "[parameters('FHIRServerProxy_1_Connection_Name')]", - "location": "[parameters('LogicAppLocation')]", - "properties": { - "api": { - "id": "[resourceId('Microsoft.Web/customApis', 'FHIRServerProxy')]" - }, - "displayName": "[parameters('FHIRServerProxy_1_Connection_DisplayName')]", - "parameterValues": { - "api_key": "[parameters('FHIRServerProxy_1_api_key')]" - } - } - }, - { - "type": "MICROSOFT.WEB/CONNECTIONS", - "apiVersion": "2018-07-01-preview", - "name": "[parameters('servicebus_1_Connection_Name')]", - "location": "[parameters('LogicAppLocation')]", - "properties": { - "api": { - "id": "[concat(subscription().id, '/providers/Microsoft.Web/locations/', parameters('LogicAppLocation'), '/managedApis/', 'servicebus')]" - }, - "displayName": "[parameters('servicebus_1_Connection_DisplayName')]", - "parameterValues": { - "connectionString": "[parameters('servicebus_1_connectionString')]" - } - } - } - ], - "outputs": {} -} \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/runhl7relay.bash b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/runhl7relay.bash deleted file mode 100644 index e46d805b71..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/runhl7relay.bash +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -set -euo pipefail -IFS=$'\n\t' - -declare functionurl="" -declare functionkey="" -declare hl7relayports="8079" -declare hl7relayimage="stodocker/hl7overhttp-relay" -usage() { echo "Usage: $0 " 1>&2; exit 1; } - -if [ "$#" -ne 2 ]; then - usage -fi -functionurl=$1 -functionkey=$2 - -#Start deploy -echo "Starting HL7Relay..." -( - set -x - #Run HL7 Relay - docker run -itd --rm -p $hl7relayports:$hl7relayports -e HL7OVERHTTPHEADERS=x-functions-key=$functionkey -e HL7OVERHTTPDEST=$functionurl $hl7relayimage -) - -if [ $? == 0 ]; - then - echo "HL7 Relay Started..." -fi diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/runhl7relay.cmd b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/runhl7relay.cmd deleted file mode 100644 index 65f86c2d61..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/runhl7relay.cmd +++ /dev/null @@ -1,10 +0,0 @@ -@echo off -setlocal enableextensions enabledelayedexpansion -set argC=0 -for %%x in (%*) do Set /A argC+=1 -if not %argC% == 2 ( - echo Usage %~n0: [HL7FunctionAppURL] [HL7FunctionAppKey] - exit /b -) -echo Running hl7relay.... -docker run -it --rm -p 8079:8079 -e HL7OVERHTTPHEADERS=x-functions-key=%2 -e HL7OVERHTTPDEST=%1 stodocker/hl7overhttp-relay diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/samplemsg.hl7 b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/samplemsg.hl7 deleted file mode 100644 index 91d5492f2b..0000000000 --- a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/samplemsg.hl7 +++ /dev/null @@ -1,5 +0,0 @@ -MSH|^~\&|ADT1|GOOD HEALTH HOSPITAL|GHH LAB, INC.|GOOD HEALTH HOSPITAL|198808181126|SECURITY|ADT^A01^ADT_A01|MSG00001|P|2.8|| -EVN|A01|200708181123|| -PID|1||PATID1234^5^M11^ADT1^MR^GOOD HEALTH HOSPITAL~123456789^^^USSSA^SS||EVERYMAN^ADAM^A^III||19610615|M||C|2222 HOME STREET^^GREENSBORO^NC^27401-1020|GL|(555) 555-2004|(555)555-2004||S||PATID12345001^2^M10^ADT1^AN^A|444333333|987654^NC| -NK1|1|NUCLEAR^NELDA^W|SPO^SPOUSE||||NK^NEXT OF KIN -PV1|1|I|2000^2012^01||||004777^ATTEND^AARON^A|||SUR||||ADM|A0| \ No newline at end of file diff --git a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/samplerun.png b/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/samplerun.png deleted file mode 100644 index 2232ae8a6c..0000000000 Binary files a/027-FHIRPoweredHealthcare/Student/Resources/heath-architectures/HL7Conversion/samplerun.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/HealthArchitecture.png b/027-FHIRPoweredHealthcare/images/HealthArchitecture.png index a3738f6630..771dd79a77 100644 Binary files a/027-FHIRPoweredHealthcare/images/HealthArchitecture.png and b/027-FHIRPoweredHealthcare/images/HealthArchitecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/JavaScriptSPA-ImplicitFlow.jpg b/027-FHIRPoweredHealthcare/images/JavaScriptSPA-ImplicitFlow.jpg index 607345db82..d4221fee53 100644 Binary files a/027-FHIRPoweredHealthcare/images/JavaScriptSPA-ImplicitFlow.jpg and b/027-FHIRPoweredHealthcare/images/JavaScriptSPA-ImplicitFlow.jpg differ diff --git a/027-FHIRPoweredHealthcare/images/JavaScriptSPA-auth-code-flow.png b/027-FHIRPoweredHealthcare/images/JavaScriptSPA-auth-code-flow.png new file mode 100644 index 0000000000..d7f1170143 Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/JavaScriptSPA-auth-code-flow.png differ diff --git a/027-FHIRPoweredHealthcare/images/MicrosoftHealthArchitecture.png b/027-FHIRPoweredHealthcare/images/MicrosoftHealthArchitecture.png deleted file mode 100644 index 8785a8ffef..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/MicrosoftHealthArchitecture.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/architecture.jpg b/027-FHIRPoweredHealthcare/images/architecture.jpg deleted file mode 100644 index e3b5cdc4f2..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/architecture.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/challenge01-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge01-architecture.jpg index 00250cb871..3848efe781 100644 Binary files a/027-FHIRPoweredHealthcare/images/challenge01-architecture.jpg and b/027-FHIRPoweredHealthcare/images/challenge01-architecture.jpg differ diff --git a/027-FHIRPoweredHealthcare/images/challenge01-architecture.png b/027-FHIRPoweredHealthcare/images/challenge01-architecture.png new file mode 100644 index 0000000000..538cf574dc Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenge01-architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/challenge02-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge02-architecture.jpg index e552839df5..bad02dcbe4 100644 Binary files a/027-FHIRPoweredHealthcare/images/challenge02-architecture.jpg and b/027-FHIRPoweredHealthcare/images/challenge02-architecture.jpg differ diff --git a/027-FHIRPoweredHealthcare/images/challenge02-architecture.png b/027-FHIRPoweredHealthcare/images/challenge02-architecture.png new file mode 100644 index 0000000000..5e95606129 Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenge02-architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/challenge03-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge03-architecture.jpg index f5754a4c9c..46a0e193a6 100644 Binary files a/027-FHIRPoweredHealthcare/images/challenge03-architecture.jpg and b/027-FHIRPoweredHealthcare/images/challenge03-architecture.jpg differ diff --git a/027-FHIRPoweredHealthcare/images/challenge03-architecture.png b/027-FHIRPoweredHealthcare/images/challenge03-architecture.png new file mode 100644 index 0000000000..8ca5754292 Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenge03-architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/challenge04-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge04-architecture.jpg index 256273f675..88ebede071 100644 Binary files a/027-FHIRPoweredHealthcare/images/challenge04-architecture.jpg and b/027-FHIRPoweredHealthcare/images/challenge04-architecture.jpg differ diff --git a/027-FHIRPoweredHealthcare/images/challenge04-architecture.png b/027-FHIRPoweredHealthcare/images/challenge04-architecture.png new file mode 100644 index 0000000000..1b25f6540d Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenge04-architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/challenge05-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge05-architecture.jpg index ab15c2580b..3337ba5ba4 100644 Binary files a/027-FHIRPoweredHealthcare/images/challenge05-architecture.jpg and b/027-FHIRPoweredHealthcare/images/challenge05-architecture.jpg differ diff --git a/027-FHIRPoweredHealthcare/images/challenge05-architecture.png b/027-FHIRPoweredHealthcare/images/challenge05-architecture.png new file mode 100644 index 0000000000..aa9b38e298 Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenge05-architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/challenge06-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge06-architecture.jpg index 319f6cc2c0..b4028b6a3e 100644 Binary files a/027-FHIRPoweredHealthcare/images/challenge06-architecture.jpg and b/027-FHIRPoweredHealthcare/images/challenge06-architecture.jpg differ diff --git a/027-FHIRPoweredHealthcare/images/challenge06-architecture.png b/027-FHIRPoweredHealthcare/images/challenge06-architecture.png new file mode 100644 index 0000000000..a3f3f5a528 Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenge06-architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/challenge07-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge07-architecture.jpg deleted file mode 100644 index 0ca2065fec..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/challenge07-architecture.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/challenge07-architecture.png b/027-FHIRPoweredHealthcare/images/challenge07-architecture.png new file mode 100644 index 0000000000..efa4a74256 Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenge07-architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/challenge08-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge08-architecture.jpg deleted file mode 100644 index 1461afda74..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/challenge08-architecture.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/challenge09-architecture.jpg b/027-FHIRPoweredHealthcare/images/challenge09-architecture.jpg deleted file mode 100644 index 0b53100c7b..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/challenge09-architecture.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/challenges_architecture.jpg b/027-FHIRPoweredHealthcare/images/challenges_architecture.jpg deleted file mode 100644 index a9120093ac..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/challenges_architecture.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/challenges_architecture.png b/027-FHIRPoweredHealthcare/images/challenges_architecture.png new file mode 100644 index 0000000000..7d0e9ac7ca Binary files /dev/null and b/027-FHIRPoweredHealthcare/images/challenges_architecture.png differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-convert-samples-architecture.jpg b/027-FHIRPoweredHealthcare/images/fhir-convert-samples-architecture.jpg deleted file mode 100644 index 53dd64ad83..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-convert-samples-architecture.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-dataservices.jpg b/027-FHIRPoweredHealthcare/images/fhir-dataservices.jpg deleted file mode 100644 index d315cbf5e5..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-dataservices.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-event-processor.jpg b/027-FHIRPoweredHealthcare/images/fhir-event-processor.jpg deleted file mode 100644 index 50c2e7ad2a..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-event-processor.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-export-anonymization.jpg b/027-FHIRPoweredHealthcare/images/fhir-export-anonymization.jpg deleted file mode 100644 index 725793fc36..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-export-anonymization.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-hl7-ingest-conversion-bulkload-samples-architecture.jpg b/027-FHIRPoweredHealthcare/images/fhir-hl7-ingest-conversion-bulkload-samples-architecture.jpg deleted file mode 100644 index 3ba9a8347c..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-hl7-ingest-conversion-bulkload-samples-architecture.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-iot.jpg b/027-FHIRPoweredHealthcare/images/fhir-iot.jpg deleted file mode 100644 index 3e4bae9d8e..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-iot.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-server-samples-oss.png b/027-FHIRPoweredHealthcare/images/fhir-server-samples-oss.png deleted file mode 100644 index 5d2d3f1941..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-server-samples-oss.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-server-samples-paas.png b/027-FHIRPoweredHealthcare/images/fhir-server-samples-paas.png deleted file mode 100644 index 92a43564bd..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-server-samples-paas.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-serverless-api&bulk-load.jpg b/027-FHIRPoweredHealthcare/images/fhir-serverless-api&bulk-load.jpg deleted file mode 100644 index b7a2a65ba4..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-serverless-api&bulk-load.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-serverless-bulk-load-all samples.jpg b/027-FHIRPoweredHealthcare/images/fhir-serverless-bulk-load-all samples.jpg deleted file mode 100644 index 92d3b8bb6d..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-serverless-bulk-load-all samples.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-serverless-bulk-load.jpg b/027-FHIRPoweredHealthcare/images/fhir-serverless-bulk-load.jpg deleted file mode 100644 index 9b33a9f157..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-serverless-bulk-load.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/fhir-serverless-streaming.jpg b/027-FHIRPoweredHealthcare/images/fhir-serverless-streaming.jpg deleted file mode 100644 index bcc6b1831a..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/fhir-serverless-streaming.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/functionapp-cosmostrigger-outEventHubMessage.jpg b/027-FHIRPoweredHealthcare/images/functionapp-cosmostrigger-outEventHubMessage.jpg deleted file mode 100644 index 23062364a3..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/functionapp-cosmostrigger-outEventHubMessage.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/functionapp-httptrigger-outEventHubMessage.jpg b/027-FHIRPoweredHealthcare/images/functionapp-httptrigger-outEventHubMessage.jpg deleted file mode 100644 index fffd98ed9c..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/functionapp-httptrigger-outEventHubMessage.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/hl72fhirconversion.png b/027-FHIRPoweredHealthcare/images/hl72fhirconversion.png deleted file mode 100644 index a062bd719a..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/hl72fhirconversion.png and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/hl7ingest-functionapp.jpg b/027-FHIRPoweredHealthcare/images/hl7ingest-functionapp.jpg deleted file mode 100644 index c9ce278268..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/hl7ingest-functionapp.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/serverless-streaming.jpg b/027-FHIRPoweredHealthcare/images/serverless-streaming.jpg deleted file mode 100644 index 33264055f9..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/serverless-streaming.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/smart-on-fhir-applications-v1.jpg b/027-FHIRPoweredHealthcare/images/smart-on-fhir-applications-v1.jpg deleted file mode 100644 index 2cc8ae1ade..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/smart-on-fhir-applications-v1.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/images/smart-on-fhir-applications.jpg b/027-FHIRPoweredHealthcare/images/smart-on-fhir-applications.jpg deleted file mode 100644 index 2cc8ae1ade..0000000000 Binary files a/027-FHIRPoweredHealthcare/images/smart-on-fhir-applications.jpg and /dev/null differ diff --git a/027-FHIRPoweredHealthcare/readme.md b/027-FHIRPoweredHealthcare/readme.md deleted file mode 100644 index 47652048d0..0000000000 --- a/027-FHIRPoweredHealthcare/readme.md +++ /dev/null @@ -1,71 +0,0 @@ -# FHIR Powered Healthcare -## Introduction -Contoso Healthcare is implementing FHIR (Fast Healthcare Interoperability Resources) to rapidly and securely exchange data in the HL7 FHIR standard format with a single, simplified data management solution for protected health information (PHI). Azure API for FHIR is fully managed, enterprise-grade FHIR service in the cloud lets you quickly connect existing data sources, such as electronic health record systems and research databases. Create new opportunities with analytics, machine learning, and actionable intelligence across your health data. - -You will implement a collection of FHIR reference architectures frome **[Microsoft Health Architectures](https://github.com/microsoft/health-architectures)** that best fit Contoso Healthcare requirements. Below is the holistic conceptual end-to-end Microsoft Health architectures for Azure API for FHIR. -![Health Architecture](./images/HealthArchitecture.png) - -## Learning Objectives -This hack will help you: -1. Deploy Azure API for FHIR. -2. Generate and load synthetic medical data into FHIR Server. -3. Load HL7 and C-CDA data into FHIR Server. -4. Read FHIR data through a Dashboard, SMART on FHIR apps, JavaScript app and Single Page App. -5. Export and anonymize FHIR data. -6. Stream IoMT Device data into FHIR. -7. Visualize FHIR data using PowerBI. - -## Scenario -Contoso Healthcare is implementing a FHIR-based data management solution. -Your team's assistance is needed to implement the following scenarios using FHIR Powered Healthcare hack: - * Ingest and process patient record in HL7 FHIR or legacy formats from EHR systems into a common FHIR-based standard format and persist them into a FHIR Compliant store. - * Generate FHIR CUD (create, update, or delete) events whenever FHIR CUD operations take place in FHIR Server for post-processing. - * Securely connect and read FHIR patient data from FHIR Server through a web app and add a patient lookup feature to improve user experience. - * Explore a patient's medical records and encounters in FHIR Patient Dashboard and SMART on FHIR apps. - * Bulk export data from FHIR, de-identify the data and store in Data Lake for further processing. - * Ingest and Persist IoT device data from IoT Central using IoT Connector for FHIR. - * Analyze and Visualize data (EHR, HL7, CCDA, IoMT) in PowerBI using PowerQuery Connector for FHIR and SQL DB Connector. - -## Challenges -
    - -**These challenges must be completed in order:** -- Challenge 0: **[Pre-requisites - Ready, Set, GO!](Student/Challenge00.md)** -- Challenge 1: **[Extract and load FHIR synthetic medical data](Student/Challenge01.md)** - -**These challenges can be completed in any order:** -- Challenge 2: **[Extract, transform and load HL7 medical data](Student/Challenge02.md)** -- Challenge 3: **[Extract, transform and load C-CDA synthetic medical data](Student/Challenge03.md)** -- Challenge 4: **[Connect to FHIR Server and read FHIR data through a JavaScript app](Student/Challenge04.md)** -- Challenge 5: **[Explore FHIR medical records through FHIR Dashboard and SMART on FHIR apps](Student/Challenge05.md)** -- Challenge 6: **[Create a new Single Page App (SPA) for patient search](Student/Challenge06.md)** -- Challenge 7: **[Bulk export, anonymize and store FHIR data into Data Lake](Student/Challenge07.md)** -- Challenge 8: **[Stream IoMT Device data into FHIR from IoT Central](Student/Challenge08.md)** -- Challenge 9: **[Analyze and Visualize FHIR data using PowerBI](Student/Challenge09.md)** - -## Disclaimer -You **MUST** be able to log into your Azure subscription and connect to Azure AD primary tenant with directory admin role access (or secondary tenant with directory admin role access if you don't have directory admin role access in the primary AD tenant) required for the FHIR Server deployment (Challenge 1). - - If you have full Administrator directory access to your AD tenant where you can create App Registrations, Role Assignments, Azure Resources and grant login directory admin consent, then your Primary AD tenant is same as Secondary AD tenant and should use the same AD tenant for both. - - If you don't have directory Administrator access: - - Primary (Resource) AD tenant: This tenant is Resource Control Plane where all your Azure Resources will be deployed to. - - Secondary (Data) AD tenant: This tenant is Data Control Plane where all your App Registrations will be deployed to. - -## Prerequisites -The prerequisites for the hack are covered in [Challenge 0](Student/Challenge00.md). - -## Repository Contents -- `../Student` - - Student Challenge Guides -- `../Student/Resources` - - Student's resource files, code, and templates to aid with challenges -- `../Coach` - - Example solutions to the challenges (If you're a student, don't cheat yourself out of an education!) - - [Lecture presentation](Coach/Lectures.pptx) with short presentations to introduce each challenge. -- `../Coach/Resources` - - Coach's guide to solutions for challenges, including tips/tricks. - -## Contributors -- Aruna Ranganathan -- Richard Liang - -