From 15c9513eb6189fe8af5f24084e1f73e5da601528 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 10 Dec 2020 12:23:03 +0200 Subject: [PATCH 01/39] Added initial notifications documentation readme and asset placeholders --- .../notifications/README.md | 31 +++++++++++++++++++ .../assets/architecture/.gitkeep | 0 .../notifications/assets/diagrams/.gitkeep | 0 3 files changed, 31 insertions(+) create mode 100644 mojaloop-technical-overview/notifications/README.md create mode 100644 mojaloop-technical-overview/notifications/assets/architecture/.gitkeep create mode 100644 mojaloop-technical-overview/notifications/assets/diagrams/.gitkeep diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md new file mode 100644 index 000000000..ab6ec8eff --- /dev/null +++ b/mojaloop-technical-overview/notifications/README.md @@ -0,0 +1,31 @@ +# Notifications + +Mojaloop utilises a Notification-engine to be able to send/forward requests or callbacks to FSPs. This document will discuss the design of Mojaloop's Notification-engine. + +## 1. Requirements + +... + +## 2. Architecture + +### 2.1 Overview + +![example](assets/diagrams/architecture/example.svg) + +### 2.2 Types of Notifications + +![example](assets/diagrams/architecture/example.svg) + +## 3. Messages + +### 3.1. Schema + +.. + +### 3.2. Example + +.. + +## 4. References + +... diff --git a/mojaloop-technical-overview/notifications/assets/architecture/.gitkeep b/mojaloop-technical-overview/notifications/assets/architecture/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/.gitkeep b/mojaloop-technical-overview/notifications/assets/diagrams/.gitkeep new file mode 100644 index 000000000..e69de29bb From d1560e35d089613d2b85b817a58744dcbd808ff9 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 11 Dec 2020 16:01:52 +0200 Subject: [PATCH 02/39] updated notification-engine requirements & added example --- .../notifications/README.md | 112 ++++++++++++++++-- 1 file changed, 105 insertions(+), 7 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index ab6ec8eff..d0440219a 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -1,30 +1,128 @@ # Notifications -Mojaloop utilises a Notification-engine to be able to send/forward requests or callbacks to FSPs. This document will discuss the design of Mojaloop's Notification-engine. +This document will discuss the architecture and design of Mojaloop's Notification-engine. ## 1. Requirements -... +``` +1.1. Notification-engine must be stateless + a. Notification messages consumed by the Notification-engine contains everything needed to send notifications + +1.2. Notification messages must support + a. Config included to indicate that the message must be reliably delivered + b. Notification transport (i.e. HTTP, gRPC, Email, etc) + c. End-point details to deliver the notification + +1.3. Reliability + a. Notification-engine must support retries based on a configuration + b. HTTP keep-alive must be configured for HTTP transports + c. A delivery-report must be published to a kafka event topic indicating the result of the notifications: + i. success / error + ii. meta-data: retry-count, request-latency, etc + d. Delivery-reports events must be persisted into a data-store (Central-Ledger?) + +1.4. Notification-engine must be support the following ingress: + a. Consuming event messages from a Kafka topic + i. Notification message JSON schema + b. An API for sending notifications + ii. OpenAPI v3 YAML specification document +``` + ## 2. Architecture ### 2.1 Overview - +... + ### 2.2 Types of Notifications - +... + -## 3. Messages +## 3. Models ### 3.1. Schema .. -### 3.2. Example +### 3.2. Examples -.. +#### 3.2.1. Ingress Event +```JSON +{ + "from": "noresponsepayeefsp", + "to": "payerfsp", + "id": "aa398930-f210-4dcd-8af0-7c769cea1660", + "content": { + "transport": { // transport information required by the notification-engine + "type": "HTTP", // transport + "method": "GET", // Optional method for the associated transport + "endpoint": "http:///fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", // templated endpoint + "params": { // template parameters <-- is this needed? + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + }, + "options": { // run-time config options for the notification-engine + "delivery-report": true, // enabled delivery-report + "retry": { //retry config + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + }, + "customHeaders": { // any extra headers that the switch wants to include + "yup": "nope" + } + }, + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "noresponsepayeefsp", + "fspiop-destination": "payerfsp" + }, + "payload": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + }, + "type": "application/json", + "metadata": { + "event": { + "id": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "type": "trace", + "action": "span", + "createdAt": "2019-05-29T23:18:32.935Z", + "state": { + "status": "success", + "code": 0, + "description": "action successful" + }, + "responseTo": "1a396c07-47ab-4d68-a7a0-7a1ea36f0012" + }, + "trace": { + "service": "central-ledger-prepare-handler", + "traceId": "bbd7b2c7-3978-408e-ae2e-a13012c47739", + "parentSpanId": "4e3ce424-d611-417b-a7b3-44ba9bbc5840", + "spanId": "efeb5c22-689b-4d04-ac5a-2aa9cd0a7e87", + "startTimestamp": "2015-08-29T11:22:09.815479Z", + "finishTimestamp": "2015-08-29T11:22:09.815479Z", + "tags": { + "transctionId": "659ee338-c8f8-4c06-8aff-944e6c5cd694", + "transctionType": "transfer", + "parentEventType": "bulk-prepare", + "parentEventAction": "prepare" + } + } + } +} +``` + +#### 3.2.2. Delivery-report Event +```JSON +{} +``` ## 4. References From 9dce0a61256d68ce631472fa68347ebcff59f5d1 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 11 Dec 2020 17:20:46 +0200 Subject: [PATCH 03/39] Notification-engine updates --- mojaloop-technical-overview/notifications/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index d0440219a..6c0785e0c 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -16,9 +16,9 @@ This document will discuss the architecture and design of Mojaloop's Notificatio 1.3. Reliability a. Notification-engine must support retries based on a configuration b. HTTP keep-alive must be configured for HTTP transports - c. A delivery-report must be published to a kafka event topic indicating the result of the notifications: + c. A delivery-report must be published to a kafka event topic indicating the result of the notification: i. success / error - ii. meta-data: retry-count, request-latency, etc + ii. meta-data: request-timestamp, delivery-timestamp, request-latency d. Delivery-reports events must be persisted into a data-store (Central-Ledger?) 1.4. Notification-engine must be support the following ingress: From f3db573c0e4fc8040b2bfb19601ff4965f54793f Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 15 Dec 2020 19:58:08 +0200 Subject: [PATCH 04/39] updates to notification engine --- .../seq-prepare-1.1.4.a-v1.1.plantuml | 27 +- .../sequence/seq-prepare-1.1.4.a-v1.1.svg | 350 ++++--- .../notifications/README.md | 62 +- ...rch-End-to-End-with-Notify-Engine-v1.0.svg | 3 + .../sequence/seq-notify-v2-1.0.0.plantuml | 379 +++++++ .../assets/sequence/seq-notify-v2-1.0.0.svg | 943 ++++++++++++++++++ package-lock.json | 598 +++++------ 7 files changed, 1864 insertions(+), 498 deletions(-) create mode 100644 mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg create mode 100644 mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml create mode 100644 mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg diff --git a/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.plantuml b/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.plantuml index fc35e5b8b..f46afcea2 100644 --- a/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.plantuml +++ b/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.plantuml @@ -76,23 +76,18 @@ group Send notification to Participants activate TOPIC_NOTIFICATIONS deactivate TOPIC_NOTIFICATIONS - group Persist Event Information - NOTIFY_HANDLER -> CSAPI: Request to persist event information - POST - /events - activate CSAPI - CSAPI -> TOPIC_EVENTS: Publish event information - activate TOPIC_EVENTS - ||| - ref over TOPIC_EVENTS : Event Handler Consume\n - ||| - TOPIC_EVENTS --> CSAPI: Return success - deactivate TOPIC_EVENTS - CSAPI --> NOTIFY_HANDLER: Return success - deactivate CSAPI - end - note right of NOTIFY_HANDLER #lightgray - The endpoint details are cached, when the cache - expires, the details are fetched again + note right of OPERATOR #yellow + Message: + { + payload: { + endpoint: { + type: , + value: + } + } + } end note + NOTIFY_HANDLER -> CSAPI: Request Endpoint details for Participant - GET - /participants/{{fsp}}/endpoints\nError code: 2003 activate CSAPI diff --git a/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg b/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg index 7461e0ab9..cc35b8fcc 100644 --- a/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg +++ b/mojaloop-technical-overview/central-ledger/assets/diagrams/sequence/seq-prepare-1.1.4.a-v1.1.svg @@ -1,4 +1,4 @@ - + @@ -7,30 +7,30 @@ - + 1.1.4.a. Send notification to Participant (Payer/Payee) (single message) v1.1 - + Financial Service Provider (Payer) - - + + ML API Adapter Service - - + + Central Service - - + + Financial Service Provider (Payee) - - - - - + + + + + Payer DFSP @@ -39,288 +39,272 @@ - + Payer DFSP - + Participant - - - + + + ML API Notification Event Handler - - - + + + ML API Notification Event Handler - - - - - + + + + + Notification-Topic - - - + + + Notification-Topic - + Central Service API - - - + + + Central Service API - - - - - + + + + + Event-Topic - - - + + + Event-Topic - + Participant DAO - - - + + + Participant DAO - - - + + + Central Store - - - + + + Central Store - - - + + + Payee DFSP - + Participant - - - + + + Payee DFSP - + Participant - - - + + + + + OPERATOR + + + + OPERATOR + + - + Send notification to Participants - - - + + + 1 - + Consume Notification event - - - - Persist Event Information + + + + Message: - - - - 2 + + { - - Request to persist event information - POST - /events + + payload: { - - - - 3 + + endpoint: { - - Publish event information + + type: <typeValue>, - - - - ref + + value: <endpointValue> - - Event Handler Consume + + } - - - - 4 - - - Return success + + } - - - - 5 + + } - - Return success - - - - - The endpoint details are cached, when the cache - - - expires, the details are fetched again - - - - - 6 + + + + 2 - + Request Endpoint details for Participant - GET - /participants/{{fsp}}/endpoints - + Error code: - + 2003 - - - - 7 + + + + 3 - + Fetch Endpoint details for Participant - + Error code: - + 2003 - - - - 8 + + + + 4 - + Fetch Endpoint details for Participant - - + + participantEndpoint - - - - 9 + + + + 5 - + Retrieved Endpoint details for Participant - - - - 10 + + + + 6 - + Return Endpoint details for Participant - - - - 11 + + + + 7 - + Return Endpoint details for Participant - + Error codes: - + 3202, 3203 - - - - 12 + + + + 8 - + Notification with Prepare/fulfil result/error to - + Payer DFSP to specified Endpoint - PUT - + Error code: - + 1001 - - - - 13 + + + + 9 - + HTTP 200 OK - - - + + + alt - + [event.action === 'reserve'] - - - + + + alt - + [event.status === 'success'] - - - - 14 + + + + 10 - + Notification to with succesful fulfil result (committed) to Payee DFSP to specified Endpoint - PATCH - + Error code: - + 1001 - - - - 15 + + + + 11 - + HTTP 200 OK diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 6c0785e0c..bb492793b 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -29,14 +29,19 @@ This document will discuss the architecture and design of Mojaloop's Notificatio ``` -## 2. Architecture +## 2. Design ### 2.1 Overview ... +![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg) +### 2.2. Sequence Diagram + +![example](assets/sequence/seq-notify-v2-1.0.0.svg) + ### 2.2 Types of Notifications ... + +#### 3.2.1.a. Notification Commands + +```JSON +{ + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": 2, + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "transport": { // transport information required by the notification-engine + "type": "HTTP", // transport + "method": "GET", // Optional method for the associated transport + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", // templated endpoint + "params": { // template parameters <-- is this needed? + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + }, + "options": { // run-time config options for the notification-engine + "delivery-report": true, // enabled delivery-report + "retry": { //retry config + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "noresponsepayeefsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0", + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==" + } +} ``` #### 3.2.2. Delivery-report Event -```JSON -{} +``` ``` ## 4. References diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg new file mode 100644 index 000000000..a71b38181 --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg @@ -0,0 +1,3 @@ + + +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accpeted
(202)
1.2 Accpeted...
Transfer
API
(Fulfil)
Transfer...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
GET 
/{participant}/endpoints
GET...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1,7.2 Publish
Delivery Report
1,7.2 Publish...
1.7.3 Record Notify 
Success / Failure
1.7.3 Record Notify...
1.6.1 Retrieve Endpoints
1.6.1 Retrieve Endpoints
1.6.2 Publish Notify
Command
1.6.2 Publish Notify...
Admin API
Admin API
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml new file mode 100644 index 000000000..c73b2d95e --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -0,0 +1,379 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Shashikant Hirugade + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 + +autonumber + +' Actor Keys: +' actor - Payer DFSP, Payee DFSP +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +' actor "Payer DFSP\nParticipant" as PAYER_DFSP +actor "Participant" as PARTICIPANT +control "Notification Event Handler" as NOTIFY_HANDLER_EVT +control "Notification Cmd Handler" as NOTIFY_HANDLER_CMD +boundary "Central Service API" as CSAPI +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +collections "NotificationsCommand" as TOPIC_NOTIFICATIONS_CMD +collections "NotificationsEvent" as TOPIC_NOTIFICATIONS_EVT +' entity "Participant DAO" as PARTICIPANT_DAO +' entity "Notifications DAO" as NOTIFICATIONS_DAO +database "Persistant Store" as DB + +' box "Financial Service Provider (Payer)" #lightGray +' participant PAYER_DFSP +' end box + +' box "ML API Adapter Service" #LightBlue +' participant NOTIFY_HANDLER +' end box + +box "Central Service" #LightYellow + participant TOPIC_NOTIFICATIONS + participant NOTIFY_HANDLER_EVT + participant CSAPI + ' participant NOTIFICATIONS_DAO + participant DB + participant TOPIC_NOTIFICATIONS_EVT + ' participant PARTICIPANT_DAO + ' participant DB +end box + +box "Notification Engine" #LightCyan + participant TOPIC_NOTIFICATIONS_CMD + participant NOTIFY_HANDLER_CMD + participant TOPIC_NOTIFICATIONS_EVT +end box + +box "Financial Service Provider (Participant)" #lightGray + participant PARTICIPANT +end box + +' start flow +group Send notification to Participants + ' note left of NOTIFY_HANDLER_EVT #yellow + ' Message: + ' { + ' payload: { + ' endpoint: { + ' type: , + ' value: + ' } + ' } + ' } + ' end note + + TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER_EVT: Consume Notification event + activate NOTIFY_HANDLER_EVT + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + + alt transport.options.deliver-report === true + NOTIFY_HANDLER_EVT -> DB: Record Notification event + end + + ' put logic here to route command-type based on incoming events + group Routing logic + alt event.type === 'notification' && event.action === 'prepare' && event.status === 'success' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\n
Error codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message - recipient: PayerFSP + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "POST", + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", + "params": { + "transferId": "{transferId}" + } + } + end note + else event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + else event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + else event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payer-Participant/transfers/{{transferId}}", + "params": { + "transferId": "{transferId}" + } + } + end note + + ' Notes: + ' - To confirm if action=reserve results in sending out a payee notification <-- I assume this is for FSPIOP v1.1 changes + ' - This is also only applicabble for "off-us" transfers + alt (Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", + "params": { + "transferId": "{transferId}" + } + } + end note + end + else event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + else event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + else event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + else event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + + ' Notes: + ' - To confirm if action=reserve results in sending out a payee notification <-- I assume this is for FSPIOP v1.1 changes + ' - This is also only applicabble for "off-us" transfers + ' alt (Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + ' end + else event.type === 'notification' && event.action === 'get' && event.status === 'success' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Requesting-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}", + "params": { + "transferId": "{transferId}" + } + } + end note + else event.type === 'notification' && event.action === 'get' && event.status === 'error' + CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Requesting-Participant\nError codes: 3202, 3203 + activate CSAPI + deactivate CSAPI + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data + note right of NOTIFY_HANDLER_EVT #yellow + "transport": { + "type": "HTTP", + "method": "PUT", + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}/error", + "params": { + "transferId": "{transferId}" + } + } + end note + end + end + + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with notficiation-payload & transport-data + group For-each NotifyCmd Command Messages + NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_CMD: Publish NotifyCmd Command Message + activate TOPIC_NOTIFICATIONS_CMD + end + + + NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS: Commit Notification event + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + deactivate NOTIFY_HANDLER_EVT + + + TOPIC_NOTIFICATIONS_CMD <- NOTIFY_HANDLER_CMD: Consume NotifyCmd Command Message + activate NOTIFY_HANDLER_CMD + deactivate TOPIC_NOTIFICATIONS_CMD + + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message + + ' retry logic goes here + group Retry Transport Mechanism based on transport options + note right of NOTIFY_HANDLER_CMD #yellow + "transport": { + "options": { + "delivery-report": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + } + end note + NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification with Prepare/fulfil result/error to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 + NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP 200 OK + end + + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report + + alt transport.options.deliver-report === true + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyDeliveryReport event + activate TOPIC_NOTIFICATIONS_EVT + + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event + activate TOPIC_NOTIFICATIONS_CMD + deactivate TOPIC_NOTIFICATIONS_CMD + deactivate NOTIFY_HANDLER_CMD + + + + TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyDeliveryReport event + deactivate TOPIC_NOTIFICATIONS_EVT + activate NOTIFY_HANDLER_EVT + + NOTIFY_HANDLER_EVT -> DB: Record NotifyDeliveryReport event + + + NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyDeliveryReport event + deactivate NOTIFY_HANDLER_EVT + activate TOPIC_NOTIFICATIONS_EVT + deactivate TOPIC_NOTIFICATIONS_EVT + end + +end +@enduml diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg new file mode 100644 index 000000000..34c699e8a --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -0,0 +1,943 @@ + + + + + + + + + + + 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 + + + + Central Service + + + + Notification Engine + + + + Financial Service Provider (Participant) + + + + + + + + + + + + + + + + + Notification-Topic + + + + + Notification-Topic + + + Notification Event Handler + + + + + Notification Event Handler + + + + + Central Service API + + + + + Central Service API + + + + + Persistant Store + + + + + Persistant Store + + + + + + + NotificationsCommand + + + + + NotificationsCommand + + + Notification Cmd Handler + + + + + Notification Cmd Handler + + + + + + + NotificationsEvent + + + + + NotificationsEvent + + + Participant + + + + + Participant + + + + + + + + Send notification to Participants + + + + + 1 + + + Consume Notification event + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 2 + + + Record Notification event + + + + + Routing logic + + + + + alt + + + [event.type === 'notification' && event.action === 'prepare' && event.status === 'success'] + + + + + 3 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 4 + + + Construct NotifyCmd Command Message - recipient: PayerFSP + + + + + "transport": { + + + "type": "HTTP", + + + "method": "POST", + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error'] + + + + + 5 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 6 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success'] + + + + + 7 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 8 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success'] + + + + + 9 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 10 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + + alt + + + [(Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from] + + + + + 11 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 12 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success'] + + + + + 13 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 14 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error'] + + + + + 15 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 16 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error'] + + + + + 17 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 18 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success'] + + + + + 19 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 20 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + + 21 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 22 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'get' && event.status === 'success'] + + + + + 23 + + + Return Endpoint details for Requesting-Participant + + + Error codes: + + + 3202, 3203 + + + + + 24 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + [event.type === 'notification' && event.action === 'get' && event.status === 'error'] + + + + + 25 + + + Return Endpoint details for Requesting-Participant + + + Error codes: + + + 3202, 3203 + + + + + 26 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + + + 27 + + + Construct NotifyCmd Command Message with notficiation-payload & transport-data + + + + + For-each NotifyCmd Command Messages + + + + + 28 + + + Publish NotifyCmd Command Message + + + + + 29 + + + Commit Notification event + + + + + 30 + + + Consume NotifyCmd Command Message + + + + + 31 + + + Construct Transport Message + + + + + Retry Transport Mechanism based on transport options + + + + + "transport": { + + + "options": { + + + "delivery-report": true, + + + "retry": { + + + "count": 3, + + + "type": "noDelay|exponentialDelay", + + + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + + + } + + + } + + + } + + + + + 32 + + + Notification with Prepare/fulfil result/error to + + + Payer DFSP to specified Endpoint - PUT + + + Error code: + + + 1001 + + + + + 33 + + + HTTP 200 OK + + + + + 34 + + + Prepare Delivery Report + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 35 + + + Publish NotifyDeliveryReport event + + + + + 36 + + + Commit NotifyCmd event + + + + + 37 + + + Consume NotifyDeliveryReport event + + + + + 38 + + + Record NotifyDeliveryReport event + + + + + 39 + + + Commit NotifyDeliveryReport event + + diff --git a/package-lock.json b/package-lock.json index 32283ec92..40f299e27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4058,7 +4058,7 @@ "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==" + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" }, "json-stable-stringify": { "version": "1.0.1", @@ -5666,7 +5666,7 @@ "dependencies": { "JSONStream": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "resolved": false, "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", "requires": { "jsonparse": "^1.2.0", @@ -5675,19 +5675,19 @@ "dependencies": { "jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "resolved": false, "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": false, "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" } } }, "abbrev": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "resolved": false, "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" }, "agent-base": { @@ -5708,37 +5708,37 @@ }, "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "resolved": false, "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansicolors": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "resolved": false, "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" }, "ansistyles": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", + "resolved": false, "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" }, "aproba": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", + "resolved": false, "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==" }, "archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "resolved": false, "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, "bluebird": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "resolved": false, "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "cacache": { "version": "9.2.9", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-9.2.9.tgz", + "resolved": false, "integrity": "sha512-ghg1j5OyTJ6qsrqU++dN23QiTDxb5AZCFGsF3oB+v9v/gY+F4X8L/0gdQMEjd+8Ot3D29M2etX5PKozHRn2JQw==", "requires": { "bluebird": "^3.5.0", @@ -5758,17 +5758,17 @@ }, "call-limit": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/call-limit/-/call-limit-1.1.0.tgz", + "resolved": false, "integrity": "sha1-b9YbA/PaQqLNDsK2DwK9DnGZH+o=" }, "chownr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "resolved": false, "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "cmd-shim": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", + "resolved": false, "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", "requires": { "graceful-fs": "^4.1.2", @@ -5777,7 +5777,7 @@ }, "columnify": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "resolved": false, "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "requires": { "strip-ansi": "^3.0.0", @@ -5786,7 +5786,7 @@ "dependencies": { "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -5794,14 +5794,14 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "resolved": false, "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "requires": { "defaults": "^1.0.3" @@ -5809,7 +5809,7 @@ "dependencies": { "defaults": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "resolved": false, "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "requires": { "clone": "^1.0.2" @@ -5817,7 +5817,7 @@ "dependencies": { "clone": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "resolved": false, "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" } } @@ -5828,7 +5828,7 @@ }, "config-chain": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "resolved": false, "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "requires": { "ini": "^1.3.4", @@ -5837,7 +5837,7 @@ "dependencies": { "proto-list": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "resolved": false, "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" } } @@ -5852,17 +5852,17 @@ }, "debuglog": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "resolved": false, "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" }, "detect-indent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "resolved": false, "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" }, "dezalgo": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "resolved": false, "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { "asap": "^2.0.0", @@ -5871,19 +5871,19 @@ "dependencies": { "asap": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz", + "resolved": false, "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" } } }, "editor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", + "resolved": false, "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=" }, "fs-vacuum": { "version": "1.2.10", - "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.10.tgz", + "resolved": false, "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", "requires": { "graceful-fs": "^4.1.2", @@ -5893,7 +5893,7 @@ }, "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", + "resolved": false, "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { "graceful-fs": "^4.1.2", @@ -5904,7 +5904,7 @@ }, "fstream-npm": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fstream-npm/-/fstream-npm-1.2.1.tgz", + "resolved": false, "integrity": "sha512-iBHpm/LmD1qw0TlHMAqVd9rwdU6M+EHRUnPkXpRi5G/Hf0FIFH+oZFryodAU2MFNfGRh/CzhUFlMKV3pdeOTDw==", "requires": { "fstream-ignore": "^1.0.0", @@ -5913,7 +5913,7 @@ "dependencies": { "fstream-ignore": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "resolved": false, "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "requires": { "fstream": "^1.0.0", @@ -5923,7 +5923,7 @@ "dependencies": { "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -5931,7 +5931,7 @@ "dependencies": { "brace-expansion": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "resolved": false, "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "^1.0.0", @@ -5940,12 +5940,12 @@ "dependencies": { "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -5958,7 +5958,7 @@ }, "glob": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "resolved": false, "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "^1.0.0", @@ -5971,12 +5971,12 @@ "dependencies": { "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -5984,7 +5984,7 @@ "dependencies": { "brace-expansion": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "resolved": false, "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "^1.0.0", @@ -5993,12 +5993,12 @@ "dependencies": { "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -6007,24 +6007,24 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" } } }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "resolved": false, "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "hosted-git-info": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "resolved": false, "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" }, "http-cache-semantics": { @@ -6052,17 +6052,17 @@ }, "iferr": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "resolved": false, "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "resolved": false, "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", @@ -6071,17 +6071,17 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "resolved": false, "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, "init-package-json": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.1.tgz", + "resolved": false, "integrity": "sha1-zYc6FneWvvuZYSsodioLY5P9j2o=", "requires": { "glob": "^7.1.1", @@ -6096,7 +6096,7 @@ "dependencies": { "promzard": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "resolved": false, "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "requires": { "read": "1" @@ -6106,22 +6106,22 @@ }, "lazy-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazy-property/-/lazy-property-1.0.0.tgz", + "resolved": false, "integrity": "sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=" }, "lockfile": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.3.tgz", + "resolved": false, "integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=" }, "lodash._baseindexof": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", + "resolved": false, "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=" }, "lodash._baseuniq": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", + "resolved": false, "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "requires": { "lodash._createset": "~4.0.0", @@ -6130,29 +6130,29 @@ "dependencies": { "lodash._createset": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", + "resolved": false, "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=" }, "lodash._root": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "resolved": false, "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" } } }, "lodash._bindcallback": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "resolved": false, "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" }, "lodash._cacheindexof": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz", + "resolved": false, "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=" }, "lodash._createcache": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", + "resolved": false, "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "requires": { "lodash._getnative": "^3.0.0" @@ -6160,37 +6160,37 @@ }, "lodash._getnative": { "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "resolved": false, "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, "lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "resolved": false, "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, "lodash.restparam": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "resolved": false, "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" }, "lodash.union": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "resolved": false, "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, "lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "resolved": false, "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "lodash.without": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", + "resolved": false, "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=" }, "lru-cache": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "resolved": false, "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "requires": { "pseudomap": "^1.0.2", @@ -6199,12 +6199,12 @@ "dependencies": { "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "resolved": false, "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "yallist": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "resolved": false, "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } @@ -6316,7 +6316,7 @@ }, "mississippi": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "resolved": false, "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", "requires": { "concat-stream": "^1.5.0", @@ -6333,7 +6333,7 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "resolved": false, "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", @@ -6343,14 +6343,14 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "resolved": false, "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } }, "duplexify": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", + "resolved": false, "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", "requires": { "end-of-stream": "1.0.0", @@ -6361,7 +6361,7 @@ "dependencies": { "end-of-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", + "resolved": false, "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", "requires": { "once": "~1.3.0" @@ -6369,7 +6369,7 @@ "dependencies": { "once": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "resolved": false, "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" @@ -6379,14 +6379,14 @@ }, "stream-shift": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "end-of-stream": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "resolved": false, "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", "requires": { "once": "^1.4.0" @@ -6394,7 +6394,7 @@ }, "flush-write-stream": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "resolved": false, "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", "requires": { "inherits": "^2.0.1", @@ -6403,7 +6403,7 @@ }, "from2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "resolved": false, "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", @@ -6412,7 +6412,7 @@ }, "parallel-transform": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "resolved": false, "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { "cyclist": "~0.2.2", @@ -6422,14 +6422,14 @@ "dependencies": { "cyclist": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "resolved": false, "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" } } }, "pump": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", + "resolved": false, "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { "end-of-stream": "^1.1.0", @@ -6438,7 +6438,7 @@ }, "pumpify": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", + "resolved": false, "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", "requires": { "duplexify": "^3.1.2", @@ -6448,7 +6448,7 @@ }, "stream-each": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.0.tgz", + "resolved": false, "integrity": "sha1-HpXUdXP1gNgU3A/4zQ9m8c5TyZE=", "requires": { "end-of-stream": "^1.1.0", @@ -6457,14 +6457,14 @@ "dependencies": { "stream-shift": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "through2": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "resolved": false, "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { "readable-stream": "^2.1.5", @@ -6473,7 +6473,7 @@ "dependencies": { "xtend": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } @@ -6490,7 +6490,7 @@ }, "move-concurrently": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "resolved": false, "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { "aproba": "^1.1.1", @@ -6503,7 +6503,7 @@ "dependencies": { "run-queue": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "resolved": false, "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { "aproba": "^1.1.1" @@ -6533,7 +6533,7 @@ "dependencies": { "nopt": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "resolved": false, "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" @@ -6543,7 +6543,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { "abbrev": "1", @@ -6552,7 +6552,7 @@ }, "normalize-package-data": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "resolved": false, "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { "hosted-git-info": "^2.1.4", @@ -6563,7 +6563,7 @@ "dependencies": { "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": false, "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -6571,7 +6571,7 @@ "dependencies": { "builtin-modules": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "resolved": false, "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" } } @@ -6580,12 +6580,12 @@ }, "npm-cache-filename": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz", + "resolved": false, "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=" }, "npm-install-checks": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-3.0.0.tgz", + "resolved": false, "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" @@ -6593,7 +6593,7 @@ }, "npm-package-arg": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-5.1.2.tgz", + "resolved": false, "integrity": "sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==", "requires": { "hosted-git-info": "^2.4.2", @@ -6604,7 +6604,7 @@ }, "npm-registry-client": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.4.0.tgz", + "resolved": false, "integrity": "sha512-PVNfqq0lyRdFnE//nDmn3CC9uqTsr8Bya9KPLIevlXMfkP0m4RpCVyFFk0W1Gfx436kKwyhLA6J+lV+rgR81gQ==", "requires": { "concat-stream": "^1.5.2", @@ -6622,7 +6622,7 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "resolved": false, "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", @@ -6632,7 +6632,7 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "resolved": false, "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } @@ -6641,12 +6641,12 @@ }, "npm-user-validate": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-1.0.0.tgz", + "resolved": false, "integrity": "sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE=" }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { "are-we-there-yet": "~1.1.2", @@ -6657,7 +6657,7 @@ "dependencies": { "are-we-there-yet": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "resolved": false, "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { "delegates": "^1.0.0", @@ -6666,19 +6666,19 @@ "dependencies": { "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" } } }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", @@ -6693,17 +6693,17 @@ "dependencies": { "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -6713,12 +6713,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "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", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -6726,7 +6726,7 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -6735,7 +6735,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -6743,14 +6743,14 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "wide-align": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "resolved": false, "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { "string-width": "^1.0.2" @@ -6760,14 +6760,14 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" } } }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" @@ -6775,12 +6775,12 @@ }, "opener": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "resolved": false, "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=" }, "osenv": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "resolved": false, "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "requires": { "os-homedir": "^1.0.0", @@ -6789,19 +6789,19 @@ "dependencies": { "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" } } }, "pacote": { "version": "2.7.38", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-2.7.38.tgz", + "resolved": false, "integrity": "sha512-XxHUyHQB7QCVBxoXeVu0yKxT+2PvJucsc0+1E+6f95lMUxEAYERgSAc71ckYXrYr35Ew3xFU/LrhdIK21GQFFA==", "requires": { "bluebird": "^3.5.0", @@ -6829,7 +6829,7 @@ "dependencies": { "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -6837,7 +6837,7 @@ "dependencies": { "brace-expansion": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "resolved": false, "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "^1.0.0", @@ -6846,12 +6846,12 @@ "dependencies": { "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -6860,7 +6860,7 @@ }, "npm-pick-manifest": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-1.0.4.tgz", + "resolved": false, "integrity": "sha512-MKxNdeyOZysPRTTbHtW0M5Fw38Jo/3ARsoGw5qjCfS+XGjvNB/Gb4qtAZUFmKPM2mVum+eX559eHvKywU856BQ==", "requires": { "npm-package-arg": "^5.1.2", @@ -6869,7 +6869,7 @@ }, "promise-retry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "resolved": false, "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "requires": { "err-code": "^1.0.0", @@ -6878,14 +6878,14 @@ "dependencies": { "err-code": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "resolved": false, "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" } } }, "protoduck": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-4.0.0.tgz", + "resolved": false, "integrity": "sha1-/kh02MeRM2bP2erRJFOiLNNlf44=", "requires": { "genfun": "^4.0.1" @@ -6893,14 +6893,14 @@ "dependencies": { "genfun": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-4.0.1.tgz", + "resolved": false, "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=" } } }, "tar-stream": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", + "resolved": false, "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", "requires": { "bl": "^1.0.0", @@ -6911,7 +6911,7 @@ "dependencies": { "bl": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "resolved": false, "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "requires": { "readable-stream": "^2.0.5" @@ -6919,7 +6919,7 @@ }, "end-of-stream": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "resolved": false, "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", "requires": { "once": "^1.4.0" @@ -6927,7 +6927,7 @@ }, "xtend": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } @@ -6936,12 +6936,12 @@ }, "path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "resolved": false, "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "resolved": false, "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "pump": { @@ -6955,7 +6955,7 @@ }, "read": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "resolved": false, "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "requires": { "mute-stream": "~0.0.4" @@ -6963,14 +6963,14 @@ "dependencies": { "mute-stream": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "resolved": false, "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" } } }, "read-cmd-shim": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", + "resolved": false, "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", "requires": { "graceful-fs": "^4.1.2" @@ -6978,7 +6978,7 @@ }, "read-installed": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", + "resolved": false, "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { "debuglog": "^1.0.1", @@ -6992,14 +6992,14 @@ "dependencies": { "util-extend": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "resolved": false, "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" } } }, "read-package-json": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.9.tgz", + "resolved": false, "integrity": "sha512-vuV8p921IgyelL4UOKv3FsRuRZSaRn30HanLAOKargsr8TbBEq+I3MgloSRXYuKhNdYP1wlEGilMWAIayA2RFg==", "requires": { "glob": "^7.1.1", @@ -7010,7 +7010,7 @@ "dependencies": { "json-parse-helpfulerror": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "resolved": false, "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "requires": { "jju": "^1.1.0" @@ -7018,7 +7018,7 @@ "dependencies": { "jju": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", + "resolved": false, "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" } } @@ -7027,7 +7027,7 @@ }, "read-package-tree": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.6.tgz", + "resolved": false, "integrity": "sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==", "requires": { "debuglog": "^1.0.1", @@ -7039,7 +7039,7 @@ }, "readable-stream": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.2.tgz", + "resolved": false, "integrity": "sha1-WgTfBeT1f+Pw3Gj90R3FyXx+b00=", "requires": { "core-util-is": "~1.0.0", @@ -7053,22 +7053,22 @@ "dependencies": { "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "resolved": false, "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "string_decoder": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "resolved": false, "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "~5.1.0" @@ -7076,14 +7076,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" } } }, "readdir-scoped-modules": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", + "resolved": false, "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { "debuglog": "^1.0.1", @@ -7103,7 +7103,7 @@ }, "request": { "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "resolved": false, "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "requires": { "aws-sign2": "~0.6.0", @@ -7132,22 +7132,22 @@ "dependencies": { "aws-sign2": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "resolved": false, "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" }, "aws4": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "resolved": false, "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "resolved": false, "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "combined-stream": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "resolved": false, "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "~1.0.0" @@ -7155,24 +7155,24 @@ "dependencies": { "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": false, "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" } } }, "extend": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "resolved": false, "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "resolved": false, "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "resolved": false, "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "requires": { "asynckit": "^0.4.0", @@ -7182,14 +7182,14 @@ "dependencies": { "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "resolved": false, "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" } } }, "har-validator": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "resolved": false, "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "requires": { "ajv": "^4.9.1", @@ -7198,7 +7198,7 @@ "dependencies": { "ajv": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "resolved": false, "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "requires": { "co": "^4.6.0", @@ -7207,12 +7207,12 @@ "dependencies": { "co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "resolved": false, "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "json-stable-stringify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "resolved": false, "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { "jsonify": "~0.0.0" @@ -7220,7 +7220,7 @@ "dependencies": { "jsonify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "resolved": false, "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" } } @@ -7229,14 +7229,14 @@ }, "har-schema": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "resolved": false, "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" } } }, "hawk": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "resolved": false, "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.x.x", @@ -7247,7 +7247,7 @@ "dependencies": { "boom": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "resolved": false, "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.x.x" @@ -7255,7 +7255,7 @@ }, "cryptiles": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "resolved": false, "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.x.x" @@ -7263,12 +7263,12 @@ }, "hoek": { "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "resolved": false, "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "sntp": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "resolved": false, "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.x.x" @@ -7278,7 +7278,7 @@ }, "http-signature": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "resolved": false, "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { "assert-plus": "^0.2.0", @@ -7288,12 +7288,12 @@ "dependencies": { "assert-plus": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "resolved": false, "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, "jsprim": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "resolved": false, "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", "requires": { "assert-plus": "1.0.0", @@ -7304,22 +7304,22 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "resolved": false, "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "extsprintf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "resolved": false, "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "resolved": false, "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "verror": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "resolved": false, "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "requires": { "extsprintf": "1.0.2" @@ -7331,22 +7331,22 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "resolved": false, "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "resolved": false, "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "resolved": false, "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "mime-types": { "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "resolved": false, "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "requires": { "mime-db": "~1.27.0" @@ -7354,34 +7354,34 @@ "dependencies": { "mime-db": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "resolved": false, "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" } } }, "oauth-sign": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "resolved": false, "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "performance-now": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "resolved": false, "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" }, "qs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "resolved": false, "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" }, "stringstream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "resolved": false, "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "tough-cookie": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "resolved": false, "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "requires": { "punycode": "^1.4.1" @@ -7389,14 +7389,14 @@ "dependencies": { "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "resolved": false, "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "resolved": false, "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -7406,12 +7406,12 @@ }, "retry": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "resolved": false, "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" }, "rimraf": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "resolved": false, "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "^7.0.5" @@ -7419,17 +7419,17 @@ }, "safe-buffer": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "resolved": false, "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": false, "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, "sha": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", + "resolved": false, "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", "requires": { "graceful-fs": "^4.1.2", @@ -7438,7 +7438,7 @@ }, "slide": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "resolved": false, "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, "smart-buffer": { @@ -7466,12 +7466,12 @@ }, "sorted-object": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz", + "resolved": false, "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=" }, "sorted-union-stream": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz", + "resolved": false, "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", "requires": { "from2": "^1.3.0", @@ -7480,7 +7480,7 @@ "dependencies": { "from2": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-1.3.0.tgz", + "resolved": false, "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", "requires": { "inherits": "~2.0.1", @@ -7489,7 +7489,7 @@ "dependencies": { "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": false, "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -7500,17 +7500,17 @@ "dependencies": { "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "resolved": false, "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": false, "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } @@ -7519,7 +7519,7 @@ }, "stream-iterate": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stream-iterate/-/stream-iterate-1.2.0.tgz", + "resolved": false, "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", "requires": { "readable-stream": "^2.1.5", @@ -7528,7 +7528,7 @@ "dependencies": { "stream-shift": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } @@ -7553,7 +7553,7 @@ }, "ssri": { "version": "4.1.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-4.1.6.tgz", + "resolved": false, "integrity": "sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==", "requires": { "safe-buffer": "^5.1.0" @@ -7561,7 +7561,7 @@ }, "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "resolved": false, "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" @@ -7569,7 +7569,7 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "resolved": false, "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" } } @@ -7586,22 +7586,22 @@ }, "text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "resolved": false, "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "uid-number": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "resolved": false, "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" }, "umask": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", + "resolved": false, "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" }, "unique-filename": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "resolved": false, "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "requires": { "unique-slug": "^2.0.0" @@ -7609,7 +7609,7 @@ "dependencies": { "unique-slug": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "resolved": false, "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "requires": { "imurmurhash": "^0.1.4" @@ -7619,12 +7619,12 @@ }, "unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "resolved": false, "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "update-notifier": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", + "resolved": false, "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", "requires": { "boxen": "^1.0.0", @@ -7639,7 +7639,7 @@ "dependencies": { "boxen": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.1.0.tgz", + "resolved": false, "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=", "requires": { "ansi-align": "^2.0.0", @@ -7653,7 +7653,7 @@ "dependencies": { "ansi-align": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "resolved": false, "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { "string-width": "^2.0.0" @@ -7661,17 +7661,17 @@ }, "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "resolved": false, "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "cli-boxes": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "resolved": false, "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "string-width": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", + "resolved": false, "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -7680,12 +7680,12 @@ "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", + "resolved": false, "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "resolved": false, "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" @@ -7695,7 +7695,7 @@ }, "term-size": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz", + "resolved": false, "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", "requires": { "execa": "^0.4.0" @@ -7703,7 +7703,7 @@ "dependencies": { "execa": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", + "resolved": false, "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", "requires": { "cross-spawn-async": "^2.1.1", @@ -7716,7 +7716,7 @@ "dependencies": { "cross-spawn-async": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", + "resolved": false, "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", "requires": { "lru-cache": "^4.0.0", @@ -7725,12 +7725,12 @@ }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "npm-run-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", + "resolved": false, "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", "requires": { "path-key": "^1.0.0" @@ -7738,17 +7738,17 @@ }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "path-key": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "resolved": false, "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" } } @@ -7757,7 +7757,7 @@ }, "widest-line": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "resolved": false, "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "requires": { "string-width": "^1.0.1" @@ -7765,7 +7765,7 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -7775,12 +7775,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "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", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -7788,14 +7788,14 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -7803,7 +7803,7 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } @@ -7816,7 +7816,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": false, "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -7828,17 +7828,17 @@ "dependencies": { "ansi-styles": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "resolved": false, "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "resolved": false, "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "resolved": false, "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" @@ -7846,14 +7846,14 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -7861,21 +7861,21 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": false, "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "configstore": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", + "resolved": false, "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=", "requires": { "dot-prop": "^4.1.0", @@ -7888,7 +7888,7 @@ "dependencies": { "dot-prop": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", + "resolved": false, "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", "requires": { "is-obj": "^1.0.0" @@ -7896,14 +7896,14 @@ "dependencies": { "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": false, "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" } } }, "make-dir": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "resolved": false, "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", "requires": { "pify": "^2.3.0" @@ -7911,14 +7911,14 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": false, "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "unique-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "resolved": false, "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { "crypto-random-string": "^1.0.0" @@ -7926,7 +7926,7 @@ "dependencies": { "crypto-random-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" } } @@ -7935,17 +7935,17 @@ }, "import-lazy": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "resolved": false, "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "is-npm": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "resolved": false, "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "latest-version": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "resolved": false, "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { "package-json": "^4.0.0" @@ -7953,7 +7953,7 @@ "dependencies": { "package-json": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "resolved": false, "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "requires": { "got": "^6.7.1", @@ -7964,7 +7964,7 @@ "dependencies": { "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": false, "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { "create-error-class": "^3.0.0", @@ -7982,7 +7982,7 @@ "dependencies": { "create-error-class": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "resolved": false, "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { "capture-stack-trace": "^1.0.0" @@ -7990,54 +7990,54 @@ "dependencies": { "capture-stack-trace": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "resolved": false, "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" } } }, "duplexer3": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "resolved": false, "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": false, "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "is-redirect": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "resolved": false, "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "lowercase-keys": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "resolved": false, "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "timed-out": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "resolved": false, "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "resolved": false, "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "url-parse-lax": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "resolved": false, "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" @@ -8045,7 +8045,7 @@ "dependencies": { "prepend-http": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "resolved": false, "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" } } @@ -8054,7 +8054,7 @@ }, "registry-url": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "resolved": false, "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" @@ -8077,7 +8077,7 @@ }, "semver-diff": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "resolved": false, "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" @@ -8085,19 +8085,19 @@ }, "xdg-basedir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "resolved": false, "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, "uuid": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "resolved": false, "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "validate-npm-package-license": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "resolved": false, "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "requires": { "spdx-correct": "~1.0.0", @@ -8106,7 +8106,7 @@ "dependencies": { "spdx-correct": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "resolved": false, "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "requires": { "spdx-license-ids": "^1.0.2" @@ -8114,21 +8114,21 @@ "dependencies": { "spdx-license-ids": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "resolved": false, "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" } } }, "spdx-expression-parse": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "resolved": false, "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" } } }, "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", + "resolved": false, "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "requires": { "builtins": "^1.0.3" @@ -8136,14 +8136,14 @@ "dependencies": { "builtins": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "resolved": false, "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" } } }, "which": { "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "resolved": false, "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "requires": { "isexe": "^2.0.0" @@ -8151,14 +8151,14 @@ "dependencies": { "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "resolved": false, "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" } } }, "worker-farm": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.3.1.tgz", + "resolved": false, "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=", "requires": { "errno": ">=0.1.1 <0.2.0-0", @@ -8167,7 +8167,7 @@ "dependencies": { "errno": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "resolved": false, "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "requires": { "prr": "~0.0.0" @@ -8175,26 +8175,26 @@ "dependencies": { "prr": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "resolved": false, "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" } } }, "xtend": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", + "resolved": false, "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", "requires": { "graceful-fs": "^4.1.11", @@ -8718,6 +8718,7 @@ }, "async-some": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-TYqBYg1ZWHkbW5j4AtMgd3bpVQk=", "requires": { "dezalgo": "^1.0.2" @@ -8809,6 +8810,7 @@ }, "dezalgo": { "version": "1.0.3", + "resolved": false, "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { "asap": "^2.0.0", @@ -8883,6 +8885,7 @@ }, "github-url-from-username-repo": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo=" }, "glob": { @@ -9024,6 +9027,7 @@ }, "nopt": { "version": "3.0.6", + "resolved": false, "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" @@ -9314,6 +9318,7 @@ }, "read-installed": { "version": "4.0.3", + "resolved": false, "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { "debuglog": "^1.0.1", @@ -9332,6 +9337,7 @@ }, "readdir-scoped-modules": { "version": "1.0.2", + "resolved": false, "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { "debuglog": "^1.0.1", @@ -9970,6 +9976,7 @@ }, "validate-npm-package-name": { "version": "2.2.2", + "resolved": false, "integrity": "sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU=", "requires": { "builtins": "0.0.7" @@ -9997,6 +10004,7 @@ }, "write-file-atomic": { "version": "1.1.4", + "resolved": false, "integrity": "sha1-sfUtwujcDjywTRh6JfdYo4qQyjs=", "requires": { "graceful-fs": "^4.1.2", @@ -12501,7 +12509,7 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" }, "tough-cookie": { "version": "2.5.0", @@ -12666,7 +12674,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=" }, "unix-crypt-td-js": { "version": "1.1.4", @@ -12806,7 +12814,7 @@ "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", "requires": { "punycode": "^2.1.0" } From a5297aed48d01a62c88e5582b80318ac79333cd4 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 15 Dec 2020 20:01:20 +0200 Subject: [PATCH 05/39] fixed sequencing on notification design --- .../assets/sequence/seq-notify-v2-1.0.0.plantuml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index c73b2d95e..2b90a982e 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -355,13 +355,6 @@ group Send notification to Participants NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyDeliveryReport event activate TOPIC_NOTIFICATIONS_EVT - NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event - activate TOPIC_NOTIFICATIONS_CMD - deactivate TOPIC_NOTIFICATIONS_CMD - deactivate NOTIFY_HANDLER_CMD - - - TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyDeliveryReport event deactivate TOPIC_NOTIFICATIONS_EVT activate NOTIFY_HANDLER_EVT @@ -375,5 +368,10 @@ group Send notification to Participants deactivate TOPIC_NOTIFICATIONS_EVT end + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event + activate TOPIC_NOTIFICATIONS_CMD + deactivate TOPIC_NOTIFICATIONS_CMD + deactivate NOTIFY_HANDLER_CMD + end @enduml From 95353328a73b6e2a00eb3a7e5ce62b41ac7f0eff Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 16 Dec 2020 10:36:15 +0200 Subject: [PATCH 06/39] updated notify design svg, and added a gitignore for VSCode Plantuml Image exporter --- .gitignore | 3 + .../assets/sequence/seq-notify-v2-1.0.0.svg | 1611 +++++++---------- 2 files changed, 671 insertions(+), 943 deletions(-) diff --git a/.gitignore b/.gitignore index 5f1920278..e8e736565 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ _book *.log *.jar + +# Ignore VSCode Plantuml Image exporter +out/**/*.* diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index 34c699e8a..b23ff6228 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -1,943 +1,668 @@ - - - - - - - - - - - 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - - - - Central Service - - - - Notification Engine - - - - Financial Service Provider (Participant) - - - - - - - - - - - - - - - - - Notification-Topic - - - - - Notification-Topic - - - Notification Event Handler - - - - - Notification Event Handler - - - - - Central Service API - - - - - Central Service API - - - - - Persistant Store - - - - - Persistant Store - - - - - - - NotificationsCommand - - - - - NotificationsCommand - - - Notification Cmd Handler - - - - - Notification Cmd Handler - - - - - - - NotificationsEvent - - - - - NotificationsEvent - - - Participant - - - - - Participant - - - - - - - - Send notification to Participants - - - - - 1 - - - Consume Notification event - - - - - alt - - - [transport.options.deliver-report === true] - - - - - 2 - - - Record Notification event - - - - - Routing logic - - - - - alt - - - [event.type === 'notification' && event.action === 'prepare' && event.status === 'success'] - - - - - 3 - - - Return Endpoint details for Payee-Participant - - - Error codes: - - - 3202, 3203 - - - - - 4 - - - Construct NotifyCmd Command Message - recipient: PayerFSP - - - - - "transport": { - - - "type": "HTTP", - - - "method": "POST", - - - "endpoint": "http://Payee-Participant/transfers/{{transferId}}", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error'] - - - - - 5 - - - Return Endpoint details for Payer-Participant - - - Error codes: - - - 3202, 3203 - - - - - 6 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success'] - - - - - 7 - - - Return Endpoint details for Payer-Participant - - - Error codes: - - - 3202, 3203 - - - - - 8 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success'] - - - - - 9 - - - Return Endpoint details for Payer-Participant - - - Error codes: - - - 3202, 3203 - - - - - 10 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payer-Participant/transfers/{{transferId}}", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - - alt - - - [(Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from] - - - - - 11 - - - Return Endpoint details for Payee-Participant - - - Error codes: - - - 3202, 3203 - - - - - 12 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payee-Participant/transfers/{{transferId}}", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success'] - - - - - 13 - - - Return Endpoint details for Payee-Participant - - - Error codes: - - - 3202, 3203 - - - - - 14 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error'] - - - - - 15 - - - Return Endpoint details for Payee-Participant - - - Error codes: - - - 3202, 3203 - - - - - 16 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error'] - - - - - 17 - - - Return Endpoint details for Payee-Participant - - - Error codes: - - - 3202, 3203 - - - - - 18 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success'] - - - - - 19 - - - Return Endpoint details for Payer-Participant - - - Error codes: - - - 3202, 3203 - - - - - 20 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - - 21 - - - Return Endpoint details for Payee-Participant - - - Error codes: - - - 3202, 3203 - - - - - 22 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'get' && event.status === 'success'] - - - - - 23 - - - Return Endpoint details for Requesting-Participant - - - Error codes: - - - 3202, 3203 - - - - - 24 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Requesting-Participant/transfers/{{transferId}}", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - [event.type === 'notification' && event.action === 'get' && event.status === 'error'] - - - - - 25 - - - Return Endpoint details for Requesting-Participant - - - Error codes: - - - 3202, 3203 - - - - - 26 - - - Construct NotifyCmd Command Message with enriched message & endpoint data - - - - - "transport": { - - - "type": "HTTP", - - - "method": "PUT", - - - "endpoint": "http://Requesting-Participant/transfers/{{transferId}}/error", - - - "params": { - - - "transferId": "{transferId}" - - - } - - - } - - - - - 27 - - - Construct NotifyCmd Command Message with notficiation-payload & transport-data - - - - - For-each NotifyCmd Command Messages - - - - - 28 - - - Publish NotifyCmd Command Message - - - - - 29 - - - Commit Notification event - - - - - 30 - - - Consume NotifyCmd Command Message - - - - - 31 - - - Construct Transport Message - - - - - Retry Transport Mechanism based on transport options - - - - - "transport": { - - - "options": { - - - "delivery-report": true, - - - "retry": { - - - "count": 3, - - - "type": "noDelay|exponentialDelay", - - - "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - - - } - - - } - - - } - - - - - 32 - - - Notification with Prepare/fulfil result/error to - - - Payer DFSP to specified Endpoint - PUT - - - Error code: - - - 1001 - - - - - 33 - - - HTTP 200 OK - - - - - 34 - - - Prepare Delivery Report - - - - - alt - - - [transport.options.deliver-report === true] - - - - - 35 - - - Publish NotifyDeliveryReport event - - - - - 36 - - - Commit NotifyCmd event - - - - - 37 - - - Consume NotifyDeliveryReport event - - - - - 38 - - - Record NotifyDeliveryReport event - - - - - 39 - - - Commit NotifyDeliveryReport event - - +1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0Central ServiceNotification EngineFinancial Service Provider (Participant)Notification-TopicNotification-TopicNotification Event HandlerNotification Event HandlerCentral Service APICentral Service APIPersistant StorePersistant StoreNotificationsCommandNotificationsCommandNotification Cmd HandlerNotification Cmd HandlerNotificationsEventNotificationsEventParticipantParticipantSend notification to Participants1Consume Notification eventalt[transport.options.deliver-report === true]2Record Notification eventRouting logicalt[event.type === 'notification' && event.action === 'prepare' && event.status === 'success']3Return Endpoint details for Payee-ParticipantError codes:3202, 32034Construct NotifyCmd Command Message - recipient: PayerFSP"transport": {"type": "HTTP","method": "POST","endpoint": "http://Payee-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error']5Return Endpoint details for Payer-ParticipantError codes:3202, 32036Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success']7Return Endpoint details for Payer-ParticipantError codes:3202, 32038Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success']9Return Endpoint details for Payer-ParticipantError codes:3202, 320310Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}alt[(Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from]11Return Endpoint details for Payee-ParticipantError codes:3202, 320312Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success']13Return Endpoint details for Payee-ParticipantError codes:3202, 320314Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error']15Return Endpoint details for Payee-ParticipantError codes:3202, 320316Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error']17Return Endpoint details for Payee-ParticipantError codes:3202, 320318Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success']19Return Endpoint details for Payer-ParticipantError codes:3202, 320320Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}21Return Endpoint details for Payee-ParticipantError codes:3202, 320322Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'get' && event.status === 'success']23Return Endpoint details for Requesting-ParticipantError codes:3202, 320324Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Requesting-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'get' && event.status === 'error']25Return Endpoint details for Requesting-ParticipantError codes:3202, 320326Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Requesting-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}27Construct NotifyCmd Command Message with notficiation-payload & transport-dataFor-each NotifyCmd Command Messages28Publish NotifyCmd Command Message29Commit Notification event30Consume NotifyCmd Command Message31Construct Transport MessageRetry Transport Mechanism based on transport options"transport": {"options": {"delivery-report": true,"retry": {"count": 3,"type": "noDelay|exponentialDelay","condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError"}}}32Notification with Prepare/fulfil result/error toPayer DFSP to specified Endpoint - PUTError code:100133HTTP 200 OK34Prepare Delivery Reportalt[transport.options.deliver-report === true]35Publish NotifyDeliveryReport event36Consume NotifyDeliveryReport event37Record NotifyDeliveryReport event38Commit NotifyDeliveryReport event39Commit NotifyCmd event \ No newline at end of file From bed56c51fc2716d16536741e0a8be8c5e552d265 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 16 Dec 2020 12:07:44 +0200 Subject: [PATCH 07/39] updated notification design --- .../notifications/README.md | 163 +++++++++++------- 1 file changed, 100 insertions(+), 63 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index bb492793b..390f69997 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -32,6 +32,15 @@ This document will discuss the architecture and design of Mojaloop's Notificatio ## 2. Design ### 2.1 Overview + +This design proposes the seperation of the current Notification capabilities (transport vs mojaloop-contextual processing) into the following components: + +| Components | Description | Notes | +| --- | --- | --- | +| Notification Evt Handler | Consumes existing Notification events, then interprates (in context of Mojaloop use-cases) those events into an appropriate NotifyCmd message to some explicit receipient. This component is stateful, and will store information of the notification events and delivery reports as required. | This component is a "Central-Service" | +| Notification Cmd Handler | Notification Command message produced by the NotificationEvt Handler, which is consumed and processed by the NotificationCmd Handler. This component is stateless, and has no dependency on any persistance or caching stores. This enables Mojaloop implementors to introduce their own plugable Notification Cmd Handler to send notifications via any transport. | This component is a "Supporting-Service" | + + ... ![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg) +### 2.3 Types of Notifications + +| Event | Description | Notes | +| --- | --- | --- | +| Notification | Existing Notification event currently produced by Central-Service components which is the result of some Mojaloop use-case. | . | +| NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler. This message is generic, and can be used for any notification purposes. It is not context aware, nor does it have any knowledge of a Mojaloop use-case. It contains only the transport specific information requires to delivery the notification. | . | +| NotifyDelivered | Domain event message to broadcast Delivery reports to Central-Services. This event can be consumed by the Central-Services (currently the Notification Evt Handler) to persist this information to a store. | . | ## 3. Models @@ -58,49 +69,28 @@ This document will discuss the architecture and design of Mojaloop's Notificatio #### 3.2.1. Events - +``` -#### 3.2.1.a. Notification Commands +#### 3.2.1.b. Notification Command produced by Notificant Evt Handler ```JSON { - "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", - "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", // Generated by the NotificationEvtHandler + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", // Mapped from the aggregateId, used by Kafka for Key-partitioning "msgName": "NotifyCmd", - "msgType": 2, - "msgTopic": "NotificationCommands", - "msgPartition": null, - "msgTimestamp": 1607677081837, + "msgType": 2, // DomainEvents + "msgTopic": "NotificationCommands", // Topic that the message will be published too + "msgPartition": null, // Optional partition used for publishing the message to the msgTopic + "msgTimestamp": 1607677081837, // Time of message creation "aggregateName": "Notifications", - "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", - "transport": { // transport information required by the notification-engine - "type": "HTTP", // transport + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", // Generated by the NotificationEvtHandler + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", // Mapped from the metadata.event.id by the NotificationEvtHandler, used to correlate multiple NotifyCmd. + "transport": { // Transport information required by the notification-engine + "type": "HTTP", // Transport type "method": "GET", // Optional method for the associated transport - "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", // templated endpoint - "params": { // template parameters <-- is this needed? - "partyIdType": "MSISDN", - "partyId": "12345", - "value": "ABCD" + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", // Templated endpoint. It can be a hardcoded string with all parameters pre-rendered into the string. + "params": { // Optional template parameters + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } }, - "options": { // run-time config options for the notification-engine - "delivery-report": true, // enabled delivery-report - "retry": { //retry config + "options": { // Run-time config options for the notification-engine + "deliveryReport": true, // Enable delivery-reporting + "retry": { //Retry config "count": 3, "type": "noDelay|exponentialDelay", "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" @@ -159,23 +152,67 @@ This document will discuss the architecture and design of Mojaloop's Notificatio } }, "payload": { + // Headers to be send in request. Note trace-headers (traceParent, traceState) will also included when sending out the request when provided in traceInfo section. "headers": { "content-type": "application/vnd.interoperability.transfers+json;version=1.0", "date": "2019-05-28T16:34:41.000Z", - "fspiop-source": "noresponsepayeefsp", + "fspiop-source": "payerfsp", "fspiop-destination": "payerfsp" }, + // Body is optional and may be ignored depending on the transport.method "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0", }, - "traceInfo": { + "traceInfo": { // Optional. Populate if trace-headers are to be be included in request headers. "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", - "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==" + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 } } ``` -#### 3.2.2. Delivery-report Event -``` +#### 3.2.1.c. Delivery-report Event produced by Notification Cmd Handler + + +```JSON +{ + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", // Generated by the NotificationEvtHandler + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", // Mapped from the aggregateId, used by Kafka for Key-partitioning + "msgName": "NotifyDelivered", + "msgType": 2, // DomainEvents + "msgTopic": "NotificationCommands", // Topic that the message will be published too + "msgPartition": null, // Optional partition used for publishing the message to the msgTopic + "msgTimestamp": 2007677081820, // UTC Time of message creation + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", // Generated by the NotificationEvtHandler + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", // Mapped from the metadata.event.id by the NotificationEvtHandler, used to correlate multiple NotifyCmd. + "report": { // Transport information required by the notification-engine + "deliveryTimestamp": 1607677081840, // UTC Timestamp of delivery + "retryAttempts": 1, // Number of retries that were necessary to delivery the message + "response": { + "statusCode": "202", // error code from transport + "statusDescription": "Accepted", // templated endpoint + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}", + }, + "accepted": true, + "errorInformation": { // Only applicable if "accepted"=false, and expected to occur if we are not able to deliver the notification due to a transport issues: connectivity, timeout or certificate. + "errorCode": "408", // Internal error code - may be the same as statusCode + "errorDescription": "ECONNABORTED\ntimeout of 2ms exceeded\nError: timeout of 2ms exceeded\n at createError (/node_modules/axios/lib/core/createError.js:16:15)\n at Timeout.handleRequestTimeout (/node_modules/axios/lib/adapters/http.js:252:16)\n at listOnTimeout (timers.js:324:15)\n at processTimers (timers.js:268:5)" // Can include a stringified stack trace. + } + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-Cmd-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} ``` ## 4. References From f88dcb34a70e91c69dc31a1ab749be666e878c50 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 16 Dec 2020 12:20:37 +0200 Subject: [PATCH 08/39] updated notification design --- mojaloop-technical-overview/notifications/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 390f69997..8b05228ee 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -38,7 +38,7 @@ This design proposes the seperation of the current Notification capabilities (tr | Components | Description | Notes | | --- | --- | --- | | Notification Evt Handler | Consumes existing Notification events, then interprates (in context of Mojaloop use-cases) those events into an appropriate NotifyCmd message to some explicit receipient. This component is stateful, and will store information of the notification events and delivery reports as required. | This component is a "Central-Service" | -| Notification Cmd Handler | Notification Command message produced by the NotificationEvt Handler, which is consumed and processed by the NotificationCmd Handler. This component is stateless, and has no dependency on any persistance or caching stores. This enables Mojaloop implementors to introduce their own plugable Notification Cmd Handler to send notifications via any transport. | This component is a "Supporting-Service" | +| Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistance or caching stores. This enables Mojaloop implementors to introduce their own plugable Notification Cmd Handler to send notifications via any transport. | This component is a "Supporting-Service" | ... From 5fa895e56e8abd996b152be128e7a853d71b93d4 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 16 Dec 2020 12:28:16 +0200 Subject: [PATCH 09/39] updated notification design --- .../assets/sequence/seq-notify-v2-1.0.0.svg | 202 +++++++++++------- 1 file changed, 125 insertions(+), 77 deletions(-) diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index b23ff6228..5417c2cc0 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -1,4 +1,4 @@ -1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0Central ServiceNotification EngineFinancial Service Provider (Participant)Notification-TopicNotification-TopicNotification Event HandlerNotification Event HandlerCentral Service APICentral Service APIPersistant StorePersistant StoreNotificationsCommandNotificationsCommandNotification Cmd HandlerNotification Cmd HandlerNotificationsEventNotificationsEventParticipantParticipantSend notification to Participants1Consume Notification eventalt[transport.options.deliver-report === true]2Record Notification eventRouting logicalt[event.type === 'notification' && event.action === 'prepare' && event.status === 'success']3Return Endpoint details for Payee-ParticipantError codes:3202, 32034Construct NotifyCmd Command Message - recipient: PayerFSP"transport": {"type": "HTTP","method": "POST","endpoint": "http://Payee-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error']5Return Endpoint details for Payer-ParticipantError codes:3202, 32036Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success']7Return Endpoint details for Payer-ParticipantError codes:3202, 32038Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success']9Return Endpoint details for Payer-ParticipantError codes:3202, 320310Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}alt[(Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from]11Return Endpoint details for Payee-ParticipantError codes:3202, 320312Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success']13Return Endpoint details for Payee-ParticipantError codes:3202, 320314Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error']15Return Endpoint details for Payee-ParticipantError codes:3202, 320316Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error']17Return Endpoint details for Payee-ParticipantError codes:3202, 320318Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success']19Return Endpoint details for Payer-ParticipantError codes:3202, 320320Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payer-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}21Return Endpoint details for Payee-ParticipantError codes:3202, 320322Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Payee-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'get' && event.status === 'success']23Return Endpoint details for Requesting-ParticipantError codes:3202, 320324Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Requesting-Participant/transfers/{{transferId}}","params": {"transferId": "{transferId}"}}[event.type === 'notification' && event.action === 'get' && event.status === 'error']25Return Endpoint details for Requesting-ParticipantError codes:3202, 320326Construct NotifyCmd Command Message with enriched message & endpoint data"transport": {"type": "HTTP","method": "PUT","endpoint": "http://Requesting-Participant/transfers/{{transferId}}/error","params": {"transferId": "{transferId}"}}27Construct NotifyCmd Command Message with notficiation-payload & transport-dataFor-each NotifyCmd Command Messages28Publish NotifyCmd Command Message29Commit Notification event30Consume NotifyCmd Command Message31Construct Transport MessageRetry Transport Mechanism based on transport options"transport": {"options": {"delivery-report": true,"retry": {"count": 3,"type": "noDelay|exponentialDelay","condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError"}}}32Notification with Prepare/fulfil result/error toPayer DFSP to specified Endpoint - PUTError code:100133HTTP 200 OK34Prepare Delivery Reportalt[transport.options.deliver-report === true]35Publish NotifyDeliveryReport event36Consume NotifyDeliveryReport event37Record NotifyDeliveryReport event38Commit NotifyDeliveryReport event39Commit NotifyCmd event \ No newline at end of file + + + + + + + + + + + 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 + + + + Central Service + + + + Notification Engine + + + + Financial Service Provider (Participant) + + + + + + + + + + + + + + + Notification-Topic + + + + + Notification-Topic + + + Notification Event Handler + + + + + Notification Event Handler + + + + + Central Service API + + + + + Central Service API + + + + + Persistant Store + + + + + Persistant Store + + + + + + + NotificationsCommand + + + + + NotificationsCommand + + + Notification Cmd Handler + + + + + Notification Cmd Handler + + + + + + + NotificationsEvent + + + + + NotificationsEvent + + + Participant + + + + + Participant + + + + + + + + Send notification to Participants + + + + + 1 + + + Consume Notification event + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 2 + + + Record Notification event + + + + + Routing logic + + + + + alt + + + [event.type === 'notification' && event.action === 'prepare' && event.status === 'success'] + + + + + 3 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 4 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "POST", + + + "recipient": { + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error'] + + + + + 5 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 6 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success'] + + + + + 7 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 8 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success'] + + + + + 9 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 10 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + + alt + + + [(Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from] + + + + + 11 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 12 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success'] + + + + + 13 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 14 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error'] + + + + + 15 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 16 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error'] + + + + + 17 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 18 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success'] + + + + + 19 + + + Return Endpoint details for Payer-Participant + + + Error codes: + + + 3202, 3203 + + + + + 20 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + + 21 + + + Return Endpoint details for Payee-Participant + + + Error codes: + + + 3202, 3203 + + + + + 22 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'get' && event.status === 'success'] + + + + + 23 + + + Return Endpoint details for Requesting-Participant + + + Error codes: + + + 3202, 3203 + + + + + 24 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + [event.type === 'notification' && event.action === 'get' && event.status === 'error'] + + + + + 25 + + + Return Endpoint details for Requesting-Participant + + + Error codes: + + + 3202, 3203 + + + + + 26 + + + Construct NotifyCmd Command Message with enriched message & endpoint data + + + + + "transport": { + + + "type": "HTTP", + + + "method": "PUT", + + + "recipient": { + + + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}/error", + + + "params": { + + + "transferId": "{transferId}" + + + } + + + } + + + } + + + + + 27 + + + Construct NotifyCmd Command Message with notficiation-payload & transport-data + + + + + For-each NotifyCmd Command Messages + + + + + 28 + + + Publish NotifyCmd Command Message + + + + + 29 + + + Commit Notification event + + + + + 30 + + + Consume NotifyCmd Command Message + + + + + 31 + + + Construct Transport Message + + + + + Retry Transport Mechanism based on transport options + + + + + "transport": { + + + "options": { + + + "deliveryReport": true, + + + "retry": { + + + "count": 3, + + + "type": "noDelay|exponentialDelay", + + + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + + + } + + + } + + + } + + + + + 32 + + + Notification with Prepare/fulfil result/error to + + + Payer DFSP to specified Endpoint - PUT + + + Error code: + + + 1001 + + + + + 33 + + + HTTP 200 OK + + + + + 34 + + + Prepare Delivery Report + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 35 + + + Publish NotifyDeliveryReport event + + + + + 36 + + + Consume NotifyDeliveryReport event + + + + + 37 + + + Record NotifyDeliveryReport event + + + + + 38 + + + Commit NotifyDeliveryReport event + + + + + 39 + + + Commit NotifyCmd event + + From 729e264441e1eb5f4fd18b9cc27b93a884b9d4fc Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 6 Jan 2021 11:13:22 +0200 Subject: [PATCH 12/39] updates to notification design docs --- mojaloop-technical-overview/notifications/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index bf7268716..de9fbc976 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -19,7 +19,7 @@ This document will discuss the architecture and design of Mojaloop's Notificatio c. A delivery-report must be published to a kafka event topic indicating the result of the notification: i. success / error ii. meta-data: request-timestamp, delivery-timestamp, request-latency - d. Delivery-reports events must be persisted into a data-store (Central-Ledger?) + d. Delivery-reports events must be persisted into a data-store 1.4. Notification-engine must be support the following ingress: a. Consuming event messages from a Kafka topic @@ -188,7 +188,9 @@ This design proposes the seperation of the current Notification capabilities (tr "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", // Generated by the NotificationEvtHandler "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", // Mapped from the metadata.event.id by the NotificationEvtHandler, used to correlate multiple NotifyCmd. "report": { // Transport information required by the notification-engine + "requestTimestamp": 1607677081840, // UTC Timestamp of when request was received "deliveryTimestamp": 1607677081840, // UTC Timestamp of delivery + "deliveryLatency": 1607677081840, // Latency of successful delivery attempt in miliseconds (optional) "retryAttempts": 1, // Number of retries that were necessary to delivery the message "response": { "statusCode": "202", // error code from transport From 696ee1a2e5516abc981279db4db942ef31b4dc02 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 6 Jan 2021 11:15:01 +0200 Subject: [PATCH 13/39] updates to notification design docs --- mojaloop-technical-overview/notifications/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index de9fbc976..317bcc656 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -190,7 +190,7 @@ This design proposes the seperation of the current Notification capabilities (tr "report": { // Transport information required by the notification-engine "requestTimestamp": 1607677081840, // UTC Timestamp of when request was received "deliveryTimestamp": 1607677081840, // UTC Timestamp of delivery - "deliveryLatency": 1607677081840, // Latency of successful delivery attempt in miliseconds (optional) + "deliveryReqLatency": 1607677081840, // Request latency of the successful delivery in miliseconds (optional) "retryAttempts": 1, // Number of retries that were necessary to delivery the message "response": { "statusCode": "202", // error code from transport From a372cb73decb51b8ab7a2ac3ca3a4df0788ad77b Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 6 Jan 2021 11:15:33 +0200 Subject: [PATCH 14/39] updates to notification design docs --- mojaloop-technical-overview/notifications/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 317bcc656..dd98eb7af 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -188,9 +188,9 @@ This design proposes the seperation of the current Notification capabilities (tr "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", // Generated by the NotificationEvtHandler "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", // Mapped from the metadata.event.id by the NotificationEvtHandler, used to correlate multiple NotifyCmd. "report": { // Transport information required by the notification-engine - "requestTimestamp": 1607677081840, // UTC Timestamp of when request was received + "requestTimestamp": 1507677081120, // UTC Timestamp of when request was received "deliveryTimestamp": 1607677081840, // UTC Timestamp of delivery - "deliveryReqLatency": 1607677081840, // Request latency of the successful delivery in miliseconds (optional) + "deliveryReqLatency": 100, // Request latency of the successful delivery in miliseconds (optional) "retryAttempts": 1, // Number of retries that were necessary to delivery the message "response": { "statusCode": "202", // error code from transport From f0012a3ef21772ab31ac1078c25ae356fad86eb5 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 6 Jan 2021 11:16:39 +0200 Subject: [PATCH 15/39] updates to notification design docs --- mojaloop-technical-overview/notifications/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index dd98eb7af..1091dfa19 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -147,7 +147,7 @@ This design proposes the seperation of the current Notification capabilities (tr "retry": { //Retry config "count": 3, "type": "noDelay|exponentialDelay", // ref for exponentialDelay: https://developers.google.com/analytics/devguides/reporting/core/v3/errors#backoff - "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" // isNetworkOrIdempotentRequestError is default, it retries if it is a network error or a 5xx error on an idempotent request (i.e. for HTTP: GET, HEAD, OPTIONS, PUT or DELETE) + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" // isNetworkOrIdempotentRequestError is default, it retries if it is a network error or (using HTTP as an example) 5xx error on an idempotent request (i.e GET, HEAD, OPTIONS, PUT or DELETE) } } }, From a0ffd8cbf1e4a08242cd74235c628a30e1630910 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 6 Jan 2021 15:37:34 +0200 Subject: [PATCH 16/39] Update mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml Co-authored-by: Lewis Daly --- .../notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index e46bb1bfa..f4cca77df 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -50,7 +50,7 @@ collections "NotificationsCommand" as TOPIC_NOTIFICATIONS_CMD collections "NotificationsEvent" as TOPIC_NOTIFICATIONS_EVT ' entity "Participant DAO" as PARTICIPANT_DAO ' entity "Notifications DAO" as NOTIFICATIONS_DAO -database "Persistant Store" as DB +database "Persistent Store" as DB ' box "Financial Service Provider (Payer)" #lightGray ' participant PAYER_DFSP From 14606b46c98a2db8e9d81c3aeccf1eb176225483 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 6 Jan 2021 15:37:40 +0200 Subject: [PATCH 17/39] Update mojaloop-technical-overview/notifications/README.md Co-authored-by: Lewis Daly --- mojaloop-technical-overview/notifications/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 1091dfa19..65e6227f5 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -193,7 +193,7 @@ This design proposes the seperation of the current Notification capabilities (tr "deliveryReqLatency": 100, // Request latency of the successful delivery in miliseconds (optional) "retryAttempts": 1, // Number of retries that were necessary to delivery the message "response": { - "statusCode": "202", // error code from transport + "statusCode": "202", // status code from transport "statusDescription": "Accepted", // templated endpoint "headers": { "content-type": "application/vnd.interoperability.transfers+json;version=1.0", From 45b90fb7c3781c0c4b6cce2d673a4a32772e2e2b Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Mon, 8 Mar 2021 18:36:08 +0200 Subject: [PATCH 18/39] Updated to notification reliable design 1. Added schemas for both types of Domain and Command events 2. Updated SD to show validation of transport-types and content-types 3. Fixed typos --- .../notifications/README.md | 36 +- .../examples/eventNotifyCmd.example-1.json | 49 ++ .../examples/notifyDelivered.example-1.json | 39 ++ .../assets/schemas/eventNotifyCmd.schema.json | 507 ++++++++++++++++++ .../schemas/notifyDelivered.schema.json | 440 +++++++++++++++ .../sequence/seq-notify-v2-1.0.0.plantuml | 2 + .../assets/sequence/seq-notify-v2-1.0.0.svg | 276 +++++----- 7 files changed, 1201 insertions(+), 148 deletions(-) create mode 100644 mojaloop-technical-overview/notifications/assets/examples/eventNotifyCmd.example-1.json create mode 100644 mojaloop-technical-overview/notifications/assets/examples/notifyDelivered.example-1.json create mode 100644 mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json create mode 100644 mojaloop-technical-overview/notifications/assets/schemas/notifyDelivered.schema.json diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 65e6227f5..855a9a02f 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -61,15 +61,10 @@ This design proposes the seperation of the current Notification capabilities (tr ## 3. Models -### 3.1. Schema - -.. - -### 3.2. Examples - #### 3.2.1. Events -#### 3.2.1.a. Notification event produced by Central-Services +#### 3.2.1.a. Notification event produced by Central-Services (Existing) +##### 3.2.1.a.ii. Examples ```JSON { @@ -119,12 +114,18 @@ This design proposes the seperation of the current Notification capabilities (tr #### 3.2.1.b. Notification Command produced by Notificant Evt Handler +##### 3.2.1.b.i. Schemas + +[eventNotifyCmd.schema.json](assets/schemas/eventNotifyCmd.schema.json) + +##### 3.2.1.b.ii. Examples + ```JSON { "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", // Generated by the NotificationEvtHandler "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", // Mapped from the aggregateId, used by Kafka for Key-partitioning "msgName": "NotifyCmd", - "msgType": 2, // DomainEvents + "msgType": "Command", // DomainEvents "msgTopic": "NotificationCommands", // Topic that the message will be published too "msgPartition": null, // Optional partition used for publishing the message to the msgTopic "msgTimestamp": 1607677081837, // Time of message creation @@ -160,7 +161,7 @@ This design proposes the seperation of the current Notification capabilities (tr "fspiop-destination": "payerfsp" }, // Body is optional and may be ignored depending on the transport.method - "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0", + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" }, "traceInfo": { // Optional. Populate if trace-headers are to be be included in request headers. "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", @@ -173,14 +174,17 @@ This design proposes the seperation of the current Notification capabilities (tr ``` #### 3.2.1.c. Delivery-report Event produced by Notification Cmd Handler +##### 3.2.1.c.i. Schemas +[notifyDelivered.schema.json](assets/schemas/notifyDelivered.schema.json) +##### 3.2.1.c.ii. Examples ```JSON { "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", // Generated by the NotificationEvtHandler "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", // Mapped from the aggregateId, used by Kafka for Key-partitioning "msgName": "NotifyDelivered", - "msgType": 2, // DomainEvents + "msgType": "Domain", // DomainEvents "msgTopic": "NotificationCommands", // Topic that the message will be published too "msgPartition": null, // Optional partition used for publishing the message to the msgTopic "msgTimestamp": 2007677081820, // UTC Time of message creation @@ -190,11 +194,11 @@ This design proposes the seperation of the current Notification capabilities (tr "report": { // Transport information required by the notification-engine "requestTimestamp": 1507677081120, // UTC Timestamp of when request was received "deliveryTimestamp": 1607677081840, // UTC Timestamp of delivery - "deliveryReqLatency": 100, // Request latency of the successful delivery in miliseconds (optional) + "deliveryReqLatency": 100, // Request latency of the successful delivery in milliseconds (optional) "retryAttempts": 1, // Number of retries that were necessary to delivery the message "response": { "statusCode": "202", // status code from transport - "statusDescription": "Accepted", // templated endpoint + "statusDescription": "Accepted", "headers": { "content-type": "application/vnd.interoperability.transfers+json;version=1.0", "date": "2019-05-28T16:34:41.000Z" @@ -217,6 +221,10 @@ This design proposes the seperation of the current Notification capabilities (tr } ``` -## 4. References +## 4. Example Scenarios + +### 4.1. Standard FSPIOP example + +### 4.2. ISO-2022 example + -... diff --git a/mojaloop-technical-overview/notifications/assets/examples/eventNotifyCmd.example-1.json b/mojaloop-technical-overview/notifications/assets/examples/eventNotifyCmd.example-1.json new file mode 100644 index 000000000..97f07bb58 --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/examples/eventNotifyCmd.example-1.json @@ -0,0 +1,49 @@ +{ + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": "Command", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "transport": { + "type": "HTTP", + "method": "GET", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payerfsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} \ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/examples/notifyDelivered.example-1.json b/mojaloop-technical-overview/notifications/assets/examples/notifyDelivered.example-1.json new file mode 100644 index 000000000..67d0ff1ae --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/examples/notifyDelivered.example-1.json @@ -0,0 +1,39 @@ +{ + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyDelivered", + "msgType": "Domain", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 2007677081820, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "report": { + "requestTimestamp": 1507677081120, + "deliveryTimestamp": 1607677081840, + "deliveryReqLatency": 100, + "retryAttempts": 1, + "response": { + "statusCode": "202", + "statusDescription": "Accepted", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}" + }, + "accepted": true, + "errorInformation": { + "errorCode": "408", + "errorDescription": "ECONNABORTED\ntimeout of 2ms exceeded\nError: timeout of 2ms exceeded\n at createError (/node_modules/axios/lib/core/createError.js:16:15)\n at Timeout.handleRequestTimeout (/node_modules/axios/lib/adapters/http.js:252:16)\n at listOnTimeout (timers.js:324:15)\n at processTimers (timers.js:268:5)" + } + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-Cmd-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} \ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json new file mode 100644 index 000000000..93fcc5f57 --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json @@ -0,0 +1,507 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "http://mojaloop.io/events/notifications/NotifyCmd", + "type": "object", + "title": "NotifyCmd", + "description": "Notification Command produced by Notificant Evt Handler", + "default": {}, + "examples": [ + { + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": "Command", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "transport": { + "type": "HTTP", + "method": "GET", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payerfsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } + } + ], + "required": [ + "msgId", + "msgKey", + "msgName", + "msgType", + "msgTopic", + "msgTimestamp", + "aggregateName", + "aggregateId", + "notifyId", + "transport", + "payload", + "traceInfo" + ], + "properties": { + "msgId": { + "$id": "#/properties/msgId", + "type": "string", + "title": "The msgId schema", + "description": "Unique identifier for this message. Generated by the NotificationEvtHandler.", + "default": "", + "examples": [ + "18efb9ea-d29a-42b9-9b30-59e1e7cfe216" + ] + }, + "msgKey": { + "$id": "#/properties/msgKey", + "type": "string", + "title": "The msgKey schema", + "description": "Mapped from the aggregateId, used by Kafka for Key-partitioning.", + "default": "", + "examples": [ + "861b86e6-c3da-48b3-ba17-896710287d1f" + ] + }, + "msgName": { + "$id": "#/properties/msgName", + "type": "string", + "title": "The msgName schema", + "description": "Name of the message.", + "default": "", + "examples": [ + "NotifyCmd" + ] + }, + "msgType": { + "$id": "#/properties/msgType", + "type": "string", + "title": "The msgType schema", + "description": "Type of message.", + "default": "", + "examples": [ + "Command", + "Domain" + ] + }, + "msgTopic": { + "$id": "#/properties/msgTopic", + "type": "string", + "title": "The msgTopic schema", + "description": "Topic that the message will be published & consumed from.", + "default": "", + "examples": [ + "NotificationCommands" + ] + }, + "msgPartition": { + "$id": "#/properties/msgPartition", + "type": "null", + "title": "The msgPartition schema", + "description": "Optional Kafka partition used for publishing the message to the msgTopic.", + "default": null, + "examples": [ + null + ] + }, + "msgTimestamp": { + "$id": "#/properties/msgTimestamp", + "type": "integer", + "title": "The msgTimestamp schema", + "description": "Epoch/Unix timestamp of message creation.", + "default": 0, + "examples": [ + 1607677081837 + ] + }, + "aggregateName": { + "$id": "#/properties/aggregateName", + "type": "string", + "title": "The aggregateName schema", + "description": "Aggregate name", + "default": "", + "examples": [ + "Notifications" + ] + }, + "aggregateId": { + "$id": "#/properties/aggregateId", + "type": "string", + "title": "The aggregateId schema", + "description": "Aggregate identifier", + "default": "", + "examples": [ + "861b86e6-c3da-48b3-ba17-896710287d1f" + ] + }, + "notifyId": { + "$id": "#/properties/notifyId", + "type": "string", + "title": "The notifyId schema", + "description": "Correlation identifier for the event that triggerd this Notification", + "default": "", + "examples": [ + "3920382d-f78c-4023-adf9-0d7a4a2a3a2f" + ] + }, + "transport": { + "$id": "#/properties/transport", + "type": "object", + "title": "The transport schema", + "description": "Transport specifics for the Notification", + "default": {}, + "examples": [ + { + "type": "HTTP", + "method": "GET", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + } + ], + "required": [ + "type", + "method", + "contentType", + "recipient" + ], + "properties": { + "type": { + "$id": "#/properties/transport/properties/type", + "type": "string", + "title": "The type schema", + "description": "The transport type.", + "default": "", + "examples": [ + "HTTP" + ] + }, + "method": { + "$id": "#/properties/transport/properties/method", + "type": "string", + "title": "The method schema", + "description": "The method associated to the transport.", + "default": "", + "examples": [ + "GET" + ] + }, + "contentType": { + "$id": "#/properties/transport/properties/contentType", + "type": "string", + "title": "The contentType schema", + "description": "The Content Type used to determine the API language and version.", + "default": "", + "examples": [ + "application/vnd.interoperability.transfers+json;version=1.0" + ] + }, + "recipient": { + "$id": "#/properties/transport/properties/recipient", + "type": "object", + "title": "The recipient schema", + "description": "The Recipient information for the Notification.", + "default": {}, + "examples": [ + { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + } + ], + "required": [ + "endpoint" + ], + "properties": { + "endpoint": { + "$id": "#/properties/transport/properties/recipient/properties/endpoint", + "type": "string", + "title": "The endpoint schema", + "description": "The transport specific endpoint for the Notification delivery.", + "default": "", + "examples": [ + "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}" + ] + }, + "params": { + "$id": "#/properties/transport/properties/recipient/properties/params", + "type": "object", + "title": "The params schema", + "description": "Optional params that can be used by the Notification Command Handler for routing/processing, or alternatively used to render the endpoint if it is represented as a template.", + "default": {}, + "examples": [ + { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + ], + "required": [], + "additionalProperties": {"type": "string"} + } + }, + "additionalProperties": true + }, + "options": { + "$id": "#/properties/transport/properties/options", + "type": "object", + "title": "The options schema", + "description": "The Notification options.", + "default": {}, + "examples": [ + { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + ], + "required": [ + "deliveryReport" + ], + "properties": { + "deliveryReport": { + "$id": "#/properties/transport/properties/options/properties/deliveryReport", + "type": "boolean", + "title": "The deliveryReport schema", + "description": "Indicates if a delivery report is required.", + "default": false, + "examples": [ + true + ] + }, + "retry": { + "$id": "#/properties/transport/properties/options/properties/retry", + "type": "object", + "title": "The retry schema", + "description": "Retry options.", + "default": {}, + "examples": [ + { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + ], + "required": [ + "count", + "type", + "condition" + ], + "properties": { + "count": { + "$id": "#/properties/transport/properties/options/properties/retry/properties/count", + "type": "integer", + "title": "The count schema", + "description": "The number of retry attempts.", + "default": 3, + "examples": [ + 3 + ] + }, + "type": { + "$id": "#/properties/transport/properties/options/properties/retry/properties/type", + "type": "string", + "title": "The type schema", + "description": "The type of retry policy. Ref: https://developers.google.com/analytics/devguides/reporting/core/v3/errors#backoff", + "default": "exponentialDelay", + "examples": [ + "noDelay|exponentialDelay" + ] + }, + "condition": { + "$id": "#/properties/transport/properties/options/properties/retry/properties/condition", + "type": "string", + "title": "The condition schema", + "description": "The condition for retries. By default retries will occur on a network error or a 5xx error on an idempotent request (GET, HEAD, OPTIONS, PUT or DELETE)", + "default": "isNetworkOrIdempotentRequestError", + "examples": [ + "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "payload": { + "$id": "#/properties/payload", + "type": "object", + "title": "The payload schema", + "description": "The payload of the notification which includes a Header (if applicable) and Body.", + "default": {}, + "examples": [ + { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payerfsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + } + ], + "required": [ + "body" + ], + "properties": { + "headers": { + "$id": "#/properties/payload/properties/headers", + "type": "object", + "title": "The headers schema", + "description": "An explanation about the purpose of this instance.", + "default": {}, + "examples": [ + { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payerfsp", + "fspiop-destination": "payerfsp" + } + ], + "required": [], + "additionalProperties": {"type": "string"} + }, + "body": { + "$id": "#/properties/payload/properties/body", + "type": "string", + "title": "The body schema", + "description": "An explanation about the purpose of this instance.", + "default": "", + "examples": [ + "data:application/vnd.interoperability.transfers+json;v1ersion=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + ] + } + }, + "additionalProperties": false + }, + "traceInfo": { + "$id": "#/properties/traceInfo", + "type": "object", + "title": "The traceInfo schema", + "description": "Distributed tracing metadata for the event.", + "default": {}, + "examples": [ + { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } + ], + "required": [ + "traceParent", + "traceState", + "service", + "startTimestamp", + "finishTimestamp" + ], + "properties": { + "traceParent": { + "$id": "#/properties/traceInfo/properties/traceParent", + "type": "string", + "title": "The traceParent schema", + "description": "Identifier for the incoming request in a tracing system. Ref: https://w3c.github.io/trace-context/#traceparent-header", + "default": "", + "examples": [ + "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21" + ] + }, + "traceState": { + "$id": "#/properties/traceInfo/properties/traceState", + "type": "string", + "title": "The traceState schema", + "description": "Provides additional vendor-specific trace identification information across different distributed tracing systems and is a companion header for the traceparent field. Ref: https://w3c.github.io/trace-context/#tracestate-header", + "default": "", + "examples": [ + "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==" + ] + }, + "service": { + "$id": "#/properties/traceInfo/properties/service", + "type": "string", + "title": "The service schema", + "description": "The service name of the event producer.", + "default": "", + "examples": [ + "notification-evt-handler" + ] + }, + "startTimestamp": { + "$id": "#/properties/traceInfo/properties/startTimestamp", + "type": "integer", + "title": "The startTimestamp schema", + "description": "Epoch/Unix timestamp of the trace-span's start.", + "default": 0, + "examples": [ + 1607677081837 + ] + }, + "finishTimestamp": { + "$id": "#/properties/traceInfo/properties/finishTimestamp", + "type": "integer", + "title": "The finishTimestamp schema", + "description": "Epoch/Unix timestamp of the trace-span's end.", + "default": 0, + "examples": [ + 2007677081838 + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/schemas/notifyDelivered.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/notifyDelivered.schema.json new file mode 100644 index 000000000..721f1b703 --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/schemas/notifyDelivered.schema.json @@ -0,0 +1,440 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "http://mojaloop.io/events/notifications/NotifyDelivered", + "type": "object", + "title": "NotifyDelivered", + "description": "The root schema comprises the entire JSON document.", + "default": {}, + "examples": [ + { + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyDelivered", + "msgType": "Domain", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 2007677081820, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "report": { + "requestTimestamp": 1507677081120, + "deliveryTimestamp": 1607677081840, + "deliveryReqLatency": 100, + "retryAttempts": 1, + "response": { + "statusCode": "202", + "statusDescription": "Accepted", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}" + }, + "accepted": true, + "errorInformation": { + "errorCode": "408", + "errorDescription": "ECONNABORTED\ntimeout of 2ms exceeded\nError: timeout of 2ms exceeded\n at createError (/node_modules/axios/lib/core/createError.js:16:15)\n at Timeout.handleRequestTimeout (/node_modules/axios/lib/adapters/http.js:252:16)\n at listOnTimeout (timers.js:324:15)\n at processTimers (timers.js:268:5)" + } + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-Cmd-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } + } + ], + "required": [ + "msgId", + "msgKey", + "msgName", + "msgType", + "msgTopic", + "msgPartition", + "msgTimestamp", + "aggregateName", + "aggregateId", + "notifyId", + "report", + "traceInfo" + ], + "properties": { + "msgId": { + "$id": "#/properties/msgId", + "type": "string", + "title": "The msgId schema", + "description": "Unique identifier for this message. Generated by the NotificationEvtHandler.", + "default": "", + "examples": [ + "18efb9ea-d29a-42b9-9b30-59e1e7cfe216" + ] + }, + "msgKey": { + "$id": "#/properties/msgKey", + "type": "string", + "title": "The msgKey schema", + "description": "Mapped from the aggregateId, used by Kafka for Key-partitioning.", + "default": "", + "examples": [ + "861b86e6-c3da-48b3-ba17-896710287d1f" + ] + }, + "msgName": { + "$id": "#/properties/msgName", + "type": "string", + "title": "The msgName schema", + "description": "Name of the message.", + "default": "", + "examples": [ + "NotifyDelivered" + ] + }, + "msgType": { + "$id": "#/properties/msgType", + "type": "string", + "title": "The msgType schema", + "description": "Type of message.", + "default": "", + "examples": [ + "COMMAND", + "DOMAIN" + ] + }, + "msgTopic": { + "$id": "#/properties/msgTopic", + "type": "string", + "title": "The msgTopic schema", + "description": "Topic that the message will be published & consumed from.", + "default": "", + "examples": [ + "NotificationCommands" + ] + }, + "msgPartition": { + "$id": "#/properties/msgPartition", + "type": "null", + "title": "The msgPartition schema", + "description": "Optional Kafka partition used for publishing the message to the msgTopic.", + "default": null, + "examples": [ + null + ] + }, + "msgTimestamp": { + "$id": "#/properties/msgTimestamp", + "type": "integer", + "title": "The msgTimestamp schema", + "description": "Epoch/Unix timestamp of message creation.", + "default": 0, + "examples": [ + 1607677081837 + ] + }, + "aggregateName": { + "$id": "#/properties/aggregateName", + "type": "string", + "title": "The aggregateName schema", + "description": "Aggregate name", + "default": "", + "examples": [ + "Notifications" + ] + }, + "aggregateId": { + "$id": "#/properties/aggregateId", + "type": "string", + "title": "The aggregateId schema", + "description": "Aggregate identifier", + "default": "", + "examples": [ + "861b86e6-c3da-48b3-ba17-896710287d1f" + ] + }, + "notifyId": { + "$id": "#/properties/notifyId", + "type": "string", + "title": "The notifyId schema", + "description": "Correlation identifier for the event that triggerd this Notification", + "default": "", + "examples": [ + "3920382d-f78c-4023-adf9-0d7a4a2a3a2f" + ] + }, + "report": { + "$id": "#/properties/report", + "type": "object", + "title": "The report schema", + "description": "Notification delivery report.", + "default": {}, + "examples": [ + { + "requestTimestamp": 1507677081120, + "deliveryTimestamp": 1607677081840, + "deliveryReqLatency": 100, + "retryAttempts": 1, + "response": { + "statusCode": "202", + "statusDescription": "Accepted", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}" + }, + "accepted": true, + "errorInformation": { + "errorCode": "408", + "errorDescription": "ECONNABORTED\ntimeout of 2ms exceeded\nError: timeout of 2ms exceeded\n at createError (/node_modules/axios/lib/core/createError.js:16:15)\n at Timeout.handleRequestTimeout (/node_modules/axios/lib/adapters/http.js:252:16)\n at listOnTimeout (timers.js:324:15)\n at processTimers (timers.js:268:5)" + } + } + ], + "required": [ + "requestTimestamp", + "accepted" + ], + "properties": { + "requestTimestamp": { + "$id": "#/properties/report/properties/requestTimestamp", + "type": "integer", + "title": "The requestTimestamp schema", + "description": "Epoch/Unix timestamp of when the notification was processed.", + "default": 0, + "examples": [ + 1507677081120 + ] + }, + "deliveryTimestamp": { + "$id": "#/properties/report/properties/deliveryTimestamp", + "type": "integer", + "title": "The deliveryTimestamp schema", + "description": "Epoch/Unix timestamp of when the notification was delivered.", + "default": 0, + "examples": [ + 1607677081840 + ] + }, + "deliveryReqLatency": { + "$id": "#/properties/report/properties/deliveryReqLatency", + "type": "integer", + "title": "The deliveryReqLatency schema", + "description": "Request latency of the successful delivery in milliseconds.", + "default": 0, + "examples": [ + 100 + ] + }, + "retryAttempts": { + "$id": "#/properties/report/properties/retryAttempts", + "type": "integer", + "title": "The retryAttempts schema", + "description": "Number of retries in the attempted notification delivery.", + "default": 0, + "examples": [ + 1 + ] + }, + "response": { + "$id": "#/properties/report/properties/response", + "type": "object", + "title": "The response schema", + "description": "Transport response from the notification.", + "default": {}, + "examples": [ + { + "statusCode": "202", + "statusDescription": "Accepted", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}" + } + ], + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "$id": "#/properties/report/properties/response/properties/statusCode", + "type": "string", + "title": "The statusCode schema", + "description": "Transport specific response code.", + "default": "", + "examples": [ + "202" + ] + }, + "statusDescription": { + "$id": "#/properties/report/properties/response/properties/statusDescription", + "type": "string", + "title": "The statusDescription schema", + "description": "Transport specific response code description if available.", + "default": "", + "examples": [ + "Accepted" + ] + }, + "headers": { + "$id": "#/properties/payload/properties/headers", + "type": "object", + "title": "The headers schema", + "description": "An explanation about the purpose of this instance.", + "default": {}, + "examples": [ + { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payeefsp", + "fspiop-destination": "payerfsp" + } + ], + "required": [], + "additionalProperties": {"type": "string"} + }, + "body": { + "$id": "#/properties/report/properties/response/properties/body", + "type": "string", + "title": "The body schema", + "description": "An explanation about the purpose of this instance.", + "default": "", + "examples": [ + "{}" + ] + } + }, + "additionalProperties": false + }, + "accepted": { + "$id": "#/properties/report/properties/accepted", + "type": "boolean", + "title": "The accepted schema", + "description": "Boolean indicated if the notification was delivered.", + "default": false, + "examples": [ + true + ] + }, + "errorInformation": { + "$id": "#/properties/report/properties/errorInformation", + "type": "object", + "title": "The errorInformation schema", + "description": "Notification delivery error information.", + "default": {}, + "examples": [ + { + "errorCode": "408", + "errorDescription": "ECONNABORTED\ntimeout of 2ms exceeded\nError: timeout of 2ms exceeded\n at createError (/node_modules/axios/lib/core/createError.js:16:15)\n at Timeout.handleRequestTimeout (/node_modules/axios/lib/adapters/http.js:252:16)\n at listOnTimeout (timers.js:324:15)\n at processTimers (timers.js:268:5)" + } + ], + "required": [ + "errorCode", + "errorDescription" + ], + "properties": { + "errorCode": { + "$id": "#/properties/report/properties/errorInformation/properties/errorCode", + "type": "string", + "title": "The errorCode schema", + "description": "Internal error code.", + "default": "", + "examples": [ + "408" + ] + }, + "errorDescription": { + "$id": "#/properties/report/properties/errorInformation/properties/errorDescription", + "type": "string", + "title": "The errorDescription schema", + "description": "Description of the error. This could be a stack-trace.", + "default": "", + "examples": [ + "ECONNABORTED\ntimeout of 2ms exceeded\nError: timeout of 2ms exceeded\n at createError (/node_modules/axios/lib/core/createError.js:16:15)\n at Timeout.handleRequestTimeout (/node_modules/axios/lib/adapters/http.js:252:16)\n at listOnTimeout (timers.js:324:15)\n at processTimers (timers.js:268:5)" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "traceInfo": { + "$id": "#/properties/traceInfo", + "type": "object", + "title": "The traceInfo schema", + "description": "Distributed tracing metadata for the event.", + "default": {}, + "examples": [ + { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } + ], + "required": [ + "traceParent", + "traceState", + "service", + "startTimestamp", + "finishTimestamp" + ], + "properties": { + "traceParent": { + "$id": "#/properties/traceInfo/properties/traceParent", + "type": "string", + "title": "The traceParent schema", + "description": "Identifier for the incoming request in a tracing system. Ref: https://w3c.github.io/trace-context/#traceparent-header", + "default": "", + "examples": [ + "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21" + ] + }, + "traceState": { + "$id": "#/properties/traceInfo/properties/traceState", + "type": "string", + "title": "The traceState schema", + "description": "Provides additional vendor-specific trace identification information across different distributed tracing systems and is a companion header for the traceparent field. Ref: https://w3c.github.io/trace-context/#tracestate-header", + "default": "", + "examples": [ + "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==" + ] + }, + "service": { + "$id": "#/properties/traceInfo/properties/service", + "type": "string", + "title": "The service schema", + "description": "The service name of the event producer.", + "default": "", + "examples": [ + "notification-cmd-handler" + ] + }, + "startTimestamp": { + "$id": "#/properties/traceInfo/properties/startTimestamp", + "type": "integer", + "title": "The startTimestamp schema", + "description": "Epoch/Unix timestamp of the trace-span's start.", + "default": 0, + "examples": [ + 1607677081837 + ] + }, + "finishTimestamp": { + "$id": "#/properties/traceInfo/properties/finishTimestamp", + "type": "integer", + "title": "The finishTimestamp schema", + "description": "Epoch/Unix timestamp of the trace-span's end.", + "default": 0, + "examples": [ + 2007677081838 + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": true +} \ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index f4cca77df..5cfba9195 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -353,6 +353,8 @@ group Send notification to Participants activate NOTIFY_HANDLER_CMD deactivate TOPIC_NOTIFICATIONS_CMD + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate Transport-type && Transport-Content-Type + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message ' retry logic goes here diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index 5125b4862..b5593fab3 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -1,4 +1,4 @@ - + @@ -7,39 +7,39 @@ - + 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - - + + Central Service - - + + Notification Engine - - + + Financial Service Provider (Participant) - - - + + + - - + + Notification-Topic - - - + + + Notification-Topic @@ -47,74 +47,74 @@ - + Notification Event Handler - - + + Central Service API - + Central Service API - - - - Persistant Store - - - - - Persistant Store - - - - - - + + + + Persistent Store + + + + + Persistent Store + + + + + + NotificationsCommand - - - + + + NotificationsCommand - + Notification Cmd Handler - - - + + + Notification Cmd Handler - - - - - + + + + + NotificationsEvent - - - + + + NotificationsEvent - + Participant - - - + + + Participant - - - + + + - + Send notification to Participants @@ -127,15 +127,15 @@ Consume Notification event - + alt [transport.options.deliver-report === true] - - + + 2 @@ -856,12 +856,12 @@ Construct NotifyCmd Command Message with notficiation-payload & transport-data - + For-each NotifyCmd Command Messages - - + + 28 @@ -876,138 +876,146 @@ Commit Notification event - - - + + + 30 - + Consume NotifyCmd Command Message - - - + + + 31 - + + Validate Transport-type && Transport-Content-Type + + + + + 32 + + Construct Transport Message - - - + + + Retry Transport Mechanism based on transport options - - - + + + "transport": { - + "options": { - + "deliveryReport": true, - + "retry": { - + "count": 3, - + "type": "noDelay|exponentialDelay", - + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - + } - + } - + } - - - - 32 + + + + 33 - + Notification with Prepare/fulfil result/error to - + Payer DFSP to specified Endpoint - PUT - + Error code: - + 1001 - - - - 33 + + + + 34 - + HTTP 200 OK - - - - 34 + + + + 35 - + Prepare Delivery Report - - - + + + alt - + [transport.options.deliver-report === true] - - - - 35 + + + + 36 - + Publish NotifyDeliveryReport event - - - - 36 + + + + 37 - + Consume NotifyDeliveryReport event - - - - 37 + + + + 38 - + Record NotifyDeliveryReport event - - - - 38 + + + + 39 - + Commit NotifyDeliveryReport event - - - - 39 + + + + 40 - + Commit NotifyCmd event From 2a9c3657d5b0d5fe927df14c3f8bb3e1d67af9cd Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Mon, 8 Mar 2021 18:36:35 +0200 Subject: [PATCH 19/39] Updates to package-lock and bug fix to plantuml_diff script --- package-lock.json | 10 +++++++--- scripts/_build_plantuml_diff.sh | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index caed69910..00a952012 100644 --- a/package-lock.json +++ b/package-lock.json @@ -259,7 +259,8 @@ "acorn": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "optional": true }, "acorn-globals": { "version": "1.0.9", @@ -1547,7 +1548,8 @@ "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o=" + "integrity": "sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o=", + "optional": true }, "cssstyle": { "version": "0.2.37", @@ -10733,7 +10735,8 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "optional": true }, "prepend-http": { "version": "2.0.0", @@ -12564,6 +12567,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "optional": true, "requires": { "prelude-ls": "~1.1.2" } diff --git a/scripts/_build_plantuml_diff.sh b/scripts/_build_plantuml_diff.sh index 99a0a7529..c6cfa0939 100755 --- a/scripts/_build_plantuml_diff.sh +++ b/scripts/_build_plantuml_diff.sh @@ -24,7 +24,7 @@ docker run -d --rm \ for i in $(git diff --staged --name-only `find ${DIR}/.. -name '*.p*uml'`); do echo "rendering .puml -> .svg for diagram diagram: $i" - ${DIR}/_render_svg.js $1 + ${DIR}/_render_svg.js $i done docker stop puml-local From 7b6881d1eaf8dfc334385fc6f63d8f9627a7ac22 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Mon, 8 Mar 2021 18:39:23 +0200 Subject: [PATCH 20/39] Updates to SD for notification --- .../sequence/seq-notify-v2-1.0.0.plantuml | 43 ++-- .../assets/sequence/seq-notify-v2-1.0.0.svg | 234 +++++++++--------- 2 files changed, 146 insertions(+), 131 deletions(-) diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index 5cfba9195..34b51d22e 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -353,29 +353,32 @@ group Send notification to Participants activate NOTIFY_HANDLER_CMD deactivate TOPIC_NOTIFICATIONS_CMD - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate Transport-type && Transport-Content-Type - - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message - - ' retry logic goes here - group Retry Transport Mechanism based on transport options - note right of NOTIFY_HANDLER_CMD #yellow - "transport": { - "options": { - "deliveryReport": true, - "retry": { - "count": 3, - "type": "noDelay|exponentialDelay", - "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + alt If transport.type && transport.content-type match handlers configuration + + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message + + ' retry logic goes here + group Retry Transport Mechanism based on transport options + note right of NOTIFY_HANDLER_CMD #yellow + "transport": { + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } } } - } - end note - NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification with Prepare/fulfil result/error to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 - NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP 200 OK - end + end note + NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification with Prepare/fulfil result/error to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 + NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP 200 OK + end - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report + else + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification + end alt transport.options.deliver-report === true NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyDeliveryReport event diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index b5593fab3..faf68066b 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -1,4 +1,4 @@ - + @@ -7,39 +7,42 @@ - + 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - + Central Service - - + + Notification Engine - - + + Financial Service Provider (Participant) - - + + - - + + + + + Notification-Topic - - - + + + Notification-Topic @@ -47,39 +50,39 @@ - + Notification Event Handler - - + + Central Service API - + Central Service API - - + + Persistent Store - + Persistent Store - - + + NotificationsCommand - - - + + + NotificationsCommand @@ -87,34 +90,34 @@ - + Notification Cmd Handler - - - - - + + + + + NotificationsEvent - - - + + + NotificationsEvent - + Participant - - - + + + Participant - - - + + + - + Send notification to Participants @@ -884,138 +887,147 @@ Consume NotifyCmd Command Message - - - - 31 + + + + alt - - Validate Transport-type && Transport-Content-Type + + [If transport.type && transport.content-type match handlers configuration] - - - - 32 + + + + 31 - + Construct Transport Message - - - + + + Retry Transport Mechanism based on transport options - - - + + + "transport": { - + "options": { - + "deliveryReport": true, - + "retry": { - + "count": 3, - + "type": "noDelay|exponentialDelay", - + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - + } - + } - + } - - - - 33 + + + + 32 - + Notification with Prepare/fulfil result/error to - + Payer DFSP to specified Endpoint - PUT - + Error code: - + 1001 - - - - 34 + + + + 33 - + HTTP 200 OK - - - - 35 + + + + 34 - + Prepare Delivery Report - - - + + + + + 35 + + + Ignore Notification + + + + alt - + [transport.options.deliver-report === true] - - - + + + 36 - + Publish NotifyDeliveryReport event - - - + + + 37 - + Consume NotifyDeliveryReport event - - - + + + 38 - + Record NotifyDeliveryReport event - - - + + + 39 - + Commit NotifyDeliveryReport event - - - + + + 40 - + Commit NotifyCmd event From bc9c8fc53c9e3c0af8c8c263e920bab5c2f66ca8 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Mon, 8 Mar 2021 18:45:11 +0200 Subject: [PATCH 21/39] Updated notification sd flow for alt path --- .../sequence/seq-notify-v2-1.0.0.plantuml | 12 +- .../assets/sequence/seq-notify-v2-1.0.0.svg | 249 +++++++++--------- 2 files changed, 136 insertions(+), 125 deletions(-) diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index 34b51d22e..7438503c6 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -353,7 +353,9 @@ group Send notification to Participants activate NOTIFY_HANDLER_CMD deactivate TOPIC_NOTIFICATIONS_CMD - alt If transport.type && transport.content-type match handlers configuration + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration + +alt If transport.type && transport.content-type match handlers configuration NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message @@ -376,9 +378,7 @@ group Send notification to Participants end NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report - else - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification - end + alt transport.options.deliver-report === true NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyDeliveryReport event @@ -397,6 +397,10 @@ group Send notification to Participants deactivate TOPIC_NOTIFICATIONS_EVT end +else + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification +end + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event activate TOPIC_NOTIFICATIONS_CMD deactivate TOPIC_NOTIFICATIONS_CMD diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index faf68066b..54bc03eb0 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -1,4 +1,4 @@ - + @@ -7,42 +7,41 @@ - + 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - + Central Service - - + + Notification Engine - - + + Financial Service Provider (Participant) - - + + - - - - - + + + + Notification-Topic - - - + + + Notification-Topic @@ -50,39 +49,39 @@ - + Notification Event Handler - - + + Central Service API - + Central Service API - - + + Persistent Store - + Persistent Store - - + + NotificationsCommand - - - + + + NotificationsCommand @@ -90,34 +89,34 @@ - + Notification Cmd Handler - - - - - + + + + + NotificationsEvent - - - + + + NotificationsEvent - + Participant - - - + + + Participant - - - + + + - + Send notification to Participants @@ -887,147 +886,155 @@ Consume NotifyCmd Command Message - - - + + + + 31 + + + Validate transport.type && transport.content-type match handlers configuration + + + + alt - + [If transport.type && transport.content-type match handlers configuration] - - - - 31 + + + + 32 - + Construct Transport Message - - - + + + Retry Transport Mechanism based on transport options - - - + + + "transport": { - + "options": { - + "deliveryReport": true, - + "retry": { - + "count": 3, - + "type": "noDelay|exponentialDelay", - + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - + } - + } - + } - - - - 32 + + + + 33 - + Notification with Prepare/fulfil result/error to - + Payer DFSP to specified Endpoint - PUT - + Error code: - + 1001 - - - - 33 - - - HTTP 200 OK - - - - + + + 34 - - Prepare Delivery Report + + HTTP 200 OK - - - - + + + 35 - - Ignore Notification + + Prepare Delivery Report - - - + + + alt - + [transport.options.deliver-report === true] - - - + + + 36 - + Publish NotifyDeliveryReport event - - - + + + 37 - + Consume NotifyDeliveryReport event - - - + + + 38 - + Record NotifyDeliveryReport event - - - + + + 39 - + Commit NotifyDeliveryReport event - - - + + + + 40 - + + Ignore Notification + + + + + 41 + + Commit NotifyCmd event From 16b6becd9e7ee090d48434f2ee0067720ae55421 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 9 Mar 2021 13:48:40 +0200 Subject: [PATCH 22/39] Added example for multiple transports --- .../notifications/README.md | 225 +++++++++++++++++- ...Engine-Multiple-Transport-Example-v1.0.svg | 3 + ...rch-End-to-End-with-Notify-Engine-v1.0.svg | 2 +- 3 files changed, 225 insertions(+), 5 deletions(-) create mode 100644 mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 855a9a02f..51e2e9936 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -135,6 +135,7 @@ This design proposes the seperation of the current Notification capabilities (tr "transport": { // Transport information required by the notification-engine "type": "HTTP", // Transport type "method": "GET", // Optional method for the associated transport + "contentType": "application/vnd.interoperability.paries+json;version=1.0", "recipient": { "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", // Templated endpoint. It can be a hardcoded string with all parameters pre-rendered into the string. "params": { // Optional template parameters @@ -203,11 +204,11 @@ This design proposes the seperation of the current Notification capabilities (tr "content-type": "application/vnd.interoperability.transfers+json;version=1.0", "date": "2019-05-28T16:34:41.000Z" }, - "body": "{}", + "body": "{}" }, "accepted": true, "errorInformation": { // Only applicable if "accepted"=false, and expected to occur if we are not able to deliver the notification due to a transport issues: connectivity, timeout or certificate. - "errorCode": "408", // Internal error code - may be the same as statusCode + "errorCode": "408", // Internal error code "errorDescription": "ECONNABORTED\ntimeout of 2ms exceeded\nError: timeout of 2ms exceeded\n at createError (/node_modules/axios/lib/core/createError.js:16:15)\n at Timeout.handleRequestTimeout (/node_modules/axios/lib/adapters/http.js:252:16)\n at listOnTimeout (timers.js:324:15)\n at processTimers (timers.js:268:5)" // Can include a stringified stack trace. } }, @@ -223,8 +224,224 @@ This design proposes the seperation of the current Notification capabilities (tr ## 4. Example Scenarios -### 4.1. Standard FSPIOP example +### 4.1. Multiple Transports + +![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg) + +The above scenario depicts two FSPs each utilsing two different transports for FSPIOP Transfer interactions: +- FSP1 (payer) is using HTTP transport +- FSP2 (payee) is using gRCP transport + +Each of the FSPs in this example have had their associated callbacks registered which includes their transport preference (i.e. HTTP vs gRPC). + +```http +POST /participants/FSP1/endpoints HTTP/1.1 +Host: central-ledger-admin-api.mojaloop.live +Content-Type: application/json + +{ + "type": "FSPIOP_CALLBACK_URL_TRANSFER_POST", + "value": "http://fsp2.com/transfers" +} +``` + +```http +POST /participants/FSP2/endpoints HTTP/1.1 +Host: central-ledger-admin-api.mojaloop.live +Content-Type: application/json + +{ + "type": "FSPIOP_CALLBACK_URL_TRANSFER_PUT", + "value": "grpc://fsp2.com/transfers" +} +``` + +With this design it is possible to achieve this by introducing two different ML-API-Adapters for each of the different Transports (i.e. HTTP, gRPC), and similiarly two different Notification Engines for each of these transports handling callbacks. + +Each of the Notification Engines will only listen to event messages that match their intended transport types, and will thus discard non-applicable ones. + +This therefore allows the Central-Ledger components to be isolated from the transport specific logic (and transformations if applicable) for notification callbacks. + +The delivery-report for each of the POST/PUT interactions provides the assurance that the notifications results are recorded by the Central-Service Notification-Evt-Handler component. This component is able to raise alerts or alternatively handle any compensating actions independantly of the FSP's transport preferences. + +#### 4.1.a. gRPC Transport example for a POST Transfer Callback Notification Messages for FSP1 to FSP2 + +NotifyCmd Command Event: +```JSON +{ + "msgId": "66a2ec9a-9d4f-4439-8d38-19c3aa21d54e", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": "Command", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "transport": { + "type": "GRPC", + "method": "POST", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "fsp2.com/transfers" + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "exponentialDelay", + "condition": "isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "FSP1", + "fspiop-destination": "FSP2" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-PREPARE-REQUEST" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + +NotifyDelivered Domain Event: +```JSON +{ + "msgId": "0ee9331a-1a71-4efc-a22d-868fcbf59658", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyDelivered", + "msgType": "Domain", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 2007677081820, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "report": { + "requestTimestamp": 1507677081120, + "deliveryTimestamp": 1607677081840, + "deliveryReqLatency": 100, + "retryAttempts": 0, + "response": { + "statusCode": "0", + "statusDescription": "OK", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}", + }, + "accepted": true + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-Cmd-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + -### 4.2. ISO-2022 example +#### 4.1.b. HTTP Transport example for a PUT Transfer Callback Notification Messages for FSP2 to FSP1 +NotifyCmd Command Event: +```JSON +{ + "msgId": "6db168a3-61bd-485b-9921-b7012651243e", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": "Command", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "2c9f52ad-fa48-4a57-8794-b73729acf184", + "transport": { + "type": "HTTP", + "method": "PUT", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "fsp2.com/transfers/{{transferId}}", + "params": { + "transferId": "861b86e6-c3da-48b3-ba17-896710287d1f" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "exponentialDelay", + "condition": "isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "FSP2", + "fspiop-destination": "FSP1" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-FULFIL-REQUEST" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` +NotifyDelivered Domain Event: +```JSON +{ + "msgId": "cfa82358-7a92-42bd-8943-f37d22784b15", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyDelivered", + "msgType": "Domain", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 2007677081820, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "2c9f52ad-fa48-4a57-8794-b73729acf184", + "report": { + "requestTimestamp": 1507677081120, + "deliveryTimestamp": 1607677081840, + "deliveryReqLatency": 100, + "retryAttempts": 1, + "response": { + "statusCode": "200", + "statusDescription": "Ok", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}", + }, + "accepted": true + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-Cmd-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` \ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg new file mode 100644 index 000000000..946cb5f23 --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg @@ -0,0 +1,3 @@ + + +
Notification
Engine
Notification...
Central - Services
Central - Services
1.6 Prepare Notification
1.6 Prepare Notification
1.0 Transfer 
Request

1.0 Transfer...
2.6 Fulfil Notification
2.6 Fulfil Notification
ML-Adapter
ML-Adapter
Transfer
API
(HTTP)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
notificati...
FSP1
(Payer)

FSP1...
1.2 Accepted
1.2 Accepted
fulfils
fulfils
2.1 Fulfil 
Success
2.1 Fulfil...
2.3 Fulfil
Success
Consume
2.3 Fulfil...
2.7.1 OK
2.7.1 OK
2.7 Fulfil Notify Callback
2.7 Fulfil Notify Callback
Notification Cmd Handler
(HTTP / FSPIOP)
Notification Cmd H...
GET 
/{participant}/endpoints
GET...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
2,7.2 Publish
Delivery Report
2,7.2 Publish...
2.7.3 Record Notify 
Success
2.7.3 Record Notify...
1.6.1 / 2.6.1 Retrieve Endpoints
1.6.1 / 2.6.1 Retrieve Endpoints
2.6.2 Publish Notify
Command
2.6.2 Publish Notify...
Admin API
Admin API
Central Ledger
Central Ledger
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
FSP2
(Payee)
FSP2...
Transfer
API
(gRPC)
Transfer...
2.0 Fulfil 
Success
2...
2.2 OK
2.2 OK
1.7.1 OK
1.7.1 OK
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
1.7 Prepare Notify /...
Notification Cmd Handler
(gRPC / FSPIOP)
Notification Cmd H...
1,7.2 Publish
Delivery Report
1,7.2 Publish...
1.1
Prepare
Request
1.1...
1.4.Validate Position (FSP1)
1.5.
Increment Position (FSP1)
1.4.Validate Position (FSP1)...
2.4.Validate Fulfil
2.5.
Decrement Position (FSP2)
2.4.Validate Fulfil...
1.6.2 Publish Notify
Command
1.6.2 Publish Notify...
1.7.3 Record Notify 
Success
1.7.3 Record Notify...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg index a71b38181..b4eafe599 100644 --- a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg @@ -1,3 +1,3 @@ -
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accpeted
(202)
1.2 Accpeted...
Transfer
API
(Fulfil)
Transfer...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
GET 
/{participant}/endpoints
GET...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1,7.2 Publish
Delivery Report
1,7.2 Publish...
1.7.3 Record Notify 
Success / Failure
1.7.3 Record Notify...
1.6.1 Retrieve Endpoints
1.6.1 Retrieve Endpoints
1.6.2 Publish Notify
Command
1.6.2 Publish Notify...
Admin API
Admin API
Viewer does not support full SVG 1.1
\ No newline at end of file +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Transfer
API
(Fulfil)
Transfer...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
GET 
/{participant}/endpoints
GET...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.7.3 / 2.7.3 Record Notify 
Success / Failure
1.7.3 / 2.7.3 Record Notify...
1.6.1 / 2.6.1 Retrieve
Endpoints
1.6.1 / 2.6.1 Retrieve...
1.6.2 / 2.6.2 Publish Notify
Command
1.6.2 / 2.6.2 Publish Notify...
Admin API
Admin API
Viewer does not support full SVG 1.1
\ No newline at end of file From 2bced120dc5614dbfdcbe72e4e996ad1981a256c Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 9 Mar 2021 15:19:28 +0200 Subject: [PATCH 23/39] Updated description for notification cmd handler --- mojaloop-technical-overview/notifications/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 51e2e9936..b50ddc875 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -38,7 +38,7 @@ This design proposes the seperation of the current Notification capabilities (tr | Components | Description | APIs | Notes | | --- | --- | --- | --- | | Notification Evt Handler | Consumes existing Notification events, then interprates (in context of Mojaloop use-cases) those events into an appropriate NotifyCmd message to some explicit receipient. This component is stateful, and will store information of the notification events and delivery reports as required. | API operations to query stored deliveryReports | This component is a "Central-Service" | -| Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistence or caching stores. This allows for multiple pluggable Cmd Handlers to exist to handle different transports as required. This component will also manage message and transport security aspects such as TLS (Transport Layer Security) and JWS Signing for HTTP transports. | API operations to send notifications synchronously | This component is a "Supporting-Service" | +| Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistence or caching stores. This allows for multiple pluggable Cmd Handlers to exist to handle different combinations of transports (transport.type) and content-types(transpport.contentType) as required. This component will also manage message and transport security aspects such as TLS (Transport Layer Security) and JWS Signing for HTTP transports. | API operations to send notifications synchronously | This component is a "Supporting-Service" | ... From fbe27aa95e3d2afbe0990a4c1da83f5b1e15334a Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 9 Mar 2021 18:20:28 +0200 Subject: [PATCH 24/39] Fixes for circleci --- .circleci/config.yml | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2765aa333..d23ab3701 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -217,16 +217,17 @@ workflows: jobs: - pr-tools/pr-title-check: context: org-global + filters: + tags: + ignore: /.*/ + branches: + ignore: + - master - setup: context: org-global filters: tags: only: /.*/ - branches: - ignore: - - /feature.*/ - - /bugfix.*/ - - gh-pages - test-svg: context: org-global requires: @@ -234,10 +235,6 @@ workflows: filters: tags: only: /.*/ - branches: - ignore: - - /feature*/ - - /bugfix*/ - build: context: org-global requires: @@ -246,10 +243,7 @@ workflows: tags: only: /.*/ branches: - ignore: - - /feature.*/ - - /bugfix.*/ - - gh-pages + only: master - deploy: context: org-global requires: From 1220fbd425afea9874bcede5bf6eb1696e840a6e Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 9 Mar 2021 18:21:39 +0200 Subject: [PATCH 25/39] fixes for circleci config --- .circleci/config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d23ab3701..135773656 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -242,8 +242,6 @@ workflows: filters: tags: only: /.*/ - branches: - only: master - deploy: context: org-global requires: From 76746366f2d05c30848ba5bee7838486f7fddb4e Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 26 Mar 2021 14:22:46 +0200 Subject: [PATCH 26/39] Updates to notif rel end2end arch diagrams --- .../Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg | 2 +- .../Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg index b4eafe599..db7a5fbd9 100644 --- a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg @@ -1,3 +1,3 @@ -
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Transfer
API
(Fulfil)
Transfer...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
GET 
/{participant}/endpoints
GET...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.7.3 / 2.7.3 Record Notify 
Success / Failure
1.7.3 / 2.7.3 Record Notify...
1.6.1 / 2.6.1 Retrieve
Endpoints
1.6.1 / 2.6.1 Retrieve...
1.6.2 / 2.6.2 Publish Notify
Command
1.6.2 / 2.6.2 Publish Notify...
Admin API
Admin API
Viewer does not support full SVG 1.1
\ No newline at end of file +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Callback
Handler
Callback...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.7.3 / 2.7.3 Record Notify 
Success / Failure
1.7.3 / 2.7.3 Record Notify...
1.6.4 / 2.6.1 Retrieve
Endpoints
1.6.4 / 2.6.1 Retrieve...
1.6.5 / 2.6.2 Publish Notify
Command
1.6.5 / 2.6.2 Publish Notify...
Admin API
Admin API
Callback
Handler
Callback...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.3
Request to
Notification Event Engine
1.6.3...
Transfer
API
(Fulfil)
Transfer...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg new file mode 100644 index 000000000..9aa69aa6d --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg @@ -0,0 +1,3 @@ + + +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Callback
Handler
Callback...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
1.6.4 / 2.6.4 Retrieve
Endpoints
1.6.4 / 2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
Callback
Handler
Callback...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request to
Notification Event Engine
2.6.3...
Transfer
API
(Fulfil)
Transfer...
1.6.2
Request to
Notification Event Engine
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
Viewer does not support full SVG 1.1
\ No newline at end of file From 08f004c360fb6da650e9b122bfb2f110d8df485c Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 26 Mar 2021 14:24:23 +0200 Subject: [PATCH 27/39] Removed unused folder --- .../notifications/assets/architecture/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mojaloop-technical-overview/notifications/assets/architecture/.gitkeep diff --git a/mojaloop-technical-overview/notifications/assets/architecture/.gitkeep b/mojaloop-technical-overview/notifications/assets/architecture/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 68600511efde725b1cbe8591d9e2bb33151e1b26 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 26 Mar 2021 14:57:48 +0200 Subject: [PATCH 28/39] Updates to notification v2 e2e arch diagram --- .../Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg index 9aa69aa6d..012f58dae 100644 --- a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg @@ -1,3 +1,3 @@ -
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Callback
Handler
Callback...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
1.6.4 / 2.6.4 Retrieve
Endpoints
1.6.4 / 2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
Callback
Handler
Callback...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request to
Notification Event Engine
2.6.3...
Transfer
API
(Fulfil)
Transfer...
1.6.2
Request to
Notification Event Engine
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Callback
Handler
Callback...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
Callback
Handler
Callback...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
Transfer
API
(Fulfil)
Transfer...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Viewer does not support full SVG 1.1
\ No newline at end of file From 91b6d407d677287b5d3cd6323ff70f4c182699c3 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Fri, 26 Mar 2021 16:41:20 +0200 Subject: [PATCH 29/39] Updated notification v2 e2e arch diagram --- .../Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg index 012f58dae..859a64697 100644 --- a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg @@ -1,3 +1,3 @@ -
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Callback
Handler
Callback...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
Callback
Handler
Callback...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
Transfer
API
(Fulfil)
Transfer...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Callback
Handler
Callback...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
Callback
Handler
Callback...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
Transfer
API
(Fulfil)
Transfer...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Viewer does not support full SVG 1.1
\ No newline at end of file From 175edb91561732bf98ca60fd317b39677c0b0860 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Mon, 29 Mar 2021 16:14:04 +0200 Subject: [PATCH 30/39] updated notify design v2 --- .../notifications/README.md | 30 +- ...rch-End-to-End-with-Notify-Engine-v2.0.svg | 2 +- .../sequence/seq-notify-v2-1.0.0.plantuml | 139 +- .../assets/sequence/seq-notify-v2-1.0.0.svg | 1162 +- package-lock.json | 15695 +++++++++++++++- 5 files changed, 16082 insertions(+), 946 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index b50ddc875..c760de8a3 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -37,27 +37,40 @@ This design proposes the seperation of the current Notification capabilities (tr | Components | Description | APIs | Notes | | --- | --- | --- | --- | -| Notification Evt Handler | Consumes existing Notification events, then interprates (in context of Mojaloop use-cases) those events into an appropriate NotifyCmd message to some explicit receipient. This component is stateful, and will store information of the notification events and delivery reports as required. | API operations to query stored deliveryReports | This component is a "Central-Service" | +| ML-Adapter Callback Handler | This component understands the context and semantics of the FSPIOP Specification. Consumes existing Notification (internal) events, then interprates (in context of Mojaloop use-cases) those events into an appropriate event message to some explicit receipient. Also handles feedback loop and compensating actions (defined by configurable rules) from Delivery Reports. | N/A | This component is part of the "ML-API-Adapter" | +| Notification Evt Handler | Consumes existing Notification events, then interprates (without contextual dependencies) those events into an appropriate NotifyCmd. This component is stateful, and will store information of the notification events and delivery reports as required. | API operations to request notifications (async & sync) and query stored deliveryReports | This component is a "Supporting-Service" | | Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistence or caching stores. This allows for multiple pluggable Cmd Handlers to exist to handle different combinations of transports (transport.type) and content-types(transpport.contentType) as required. This component will also manage message and transport security aspects such as TLS (Transport Layer Security) and JWS Signing for HTTP transports. | API operations to send notifications synchronously | This component is a "Supporting-Service" | ... -![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v1.0.svg) +![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg) -### 2.2. Sequence Diagram +### 2.2. Sequence Diagrams + +#### 2.1.1. Golden path ![example](assets/sequence/seq-notify-v2-1.0.0.svg) -### 2.3 Types of Notifications +#### 2.1.2. Failure Scenarios + +##### 2.1.2.1. Notification Cmd Handler Failure mid-processing retries + +Notes: +- Handle failure attempts + +##### 2.1.2.2. Callback Handler / Notification Engine Unavailable + +### 2.3. Types of Notifications | Event | Description | Notes | | --- | --- | --- | -| Notification | Existing Notification event currently produced by Central-Service components which is the result of some Mojaloop use-case. | | -| NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler. This message is generic, and can be used for any notification purposes. It is not context aware, nor does it have any knowledge of a Mojaloop use-case. It contains only the transport specific information requires to delivery the notification. | | -| NotifyDelivered | Domain event message to broadcast Delivery reports to Central-Services. This event can be consumed by the Central-Services (currently the Notification Evt Handler) to persist this information to a store. | | +| Notification | Internal existing notification event currently produced by Central-Service components which is the result of some internal process (e.g. Transfer Prepared, Transfer Fulfiled, etc) | | +| NotificationReady | Domain Event produced by context aware Callback Handler. This message is generic and not contextual. It containts everything that is needed for the notification to be processed by the Notification Engine, which includes the transport specific information required for delivery, and reliability configuration (i.e. delivery report enabled, retry attempts, etc). | | +| NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler as a result of the NotificationReady event. | | +| NotifyDelivered | Domain event message to broadcast Delivery reports within the Notification Engine and Callback Handlers (for compensating actions). This event is consumed by the Notification Evt Handler and persisted for reporting and compensating purposes. | | ## 3. Models @@ -222,8 +235,7 @@ This design proposes the seperation of the current Notification capabilities (tr } ``` -## 4. Example Scenarios - +## 4. Scenarios ### 4.1. Multiple Transports ![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg) diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg index 859a64697..2395693c4 100644 --- a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg @@ -1,3 +1,3 @@ -
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
Transfer
API
(Prepare)
Transfer...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
Callback
Handler
Callback...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
Callback
Handler
Callback...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
Transfer
API
(Fulfil)
Transfer...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
FSPIOP 
Transfer API
(Prepare)
FSPIOP...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
FSPIOP
Callback
Handler
FSPIOP...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
FSPIOP
Callback
Handler
FSPIOP...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
FSPIOP
Transfer API
(Fulfil)
FSPIOP...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index 7438503c6..c08facd4f 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -45,12 +45,13 @@ actor "Participant" as PARTICIPANT control "Notification Event Handler" as NOTIFY_HANDLER_EVT control "Notification Cmd Handler" as NOTIFY_HANDLER_CMD boundary "Central Service API" as CSAPI -collections "Notification-Topic" as TOPIC_NOTIFICATIONS -collections "NotificationsCommand" as TOPIC_NOTIFICATIONS_CMD -collections "NotificationsEvent" as TOPIC_NOTIFICATIONS_EVT +control "FSPIOP Callback Handler" as MLCALLBACKHANDLER +collections "notifications\n(Internal)\nTopic" as TOPIC_NOTIFICATIONS +collections "notificationsCommand\n(Cmd Event)\nTopic" as TOPIC_NOTIFICATIONS_CMD +collections "notificationsEvent\n(Domain Event)\nTopic" as TOPIC_NOTIFICATIONS_EVT ' entity "Participant DAO" as PARTICIPANT_DAO ' entity "Notifications DAO" as NOTIFICATIONS_DAO -database "Persistent Store" as DB +database "Notify Persistent Store" as NOTIFYDB ' box "Financial Service Provider (Payer)" #lightGray ' participant PAYER_DFSP @@ -62,19 +63,33 @@ database "Persistent Store" as DB box "Central Service" #LightYellow participant TOPIC_NOTIFICATIONS - participant NOTIFY_HANDLER_EVT + participant CSAPI ' participant NOTIFICATIONS_DAO - participant DB participant TOPIC_NOTIFICATIONS_EVT ' participant PARTICIPANT_DAO ' participant DB end box -box "Notification Engine" #LightCyan +box "Mojaloop Adapter" #LightCyan + participant MLCALLBACKHANDLER + ' participant TOPIC_NOTIFICATIONS + + ' participant CSAPI + ' participant NOTIFICATIONS_DAO + ' participant DB + ' participant TOPIC_NOTIFICATIONS_EVT + ' participant PARTICIPANT_DAO + ' participant DB +end box + +box "Notification Engine" #LightBlue + participant TOPIC_NOTIFICATIONS_EVT + participant NOTIFY_HANDLER_EVT participant TOPIC_NOTIFICATIONS_CMD + participant NOTIFYDB participant NOTIFY_HANDLER_CMD - participant TOPIC_NOTIFICATIONS_EVT + ' participant TOPIC_NOTIFICATIONS_EVT end box box "Financial Service Provider (Participant)" #lightGray @@ -95,24 +110,22 @@ group Send notification to Participants ' } ' end note - TOPIC_NOTIFICATIONS <- NOTIFY_HANDLER_EVT: Consume Notification event - activate NOTIFY_HANDLER_EVT + TOPIC_NOTIFICATIONS <- MLCALLBACKHANDLER: Consume Notification event + activate MLCALLBACKHANDLER activate TOPIC_NOTIFICATIONS deactivate TOPIC_NOTIFICATIONS - alt transport.options.deliver-report === true - NOTIFY_HANDLER_EVT -> DB: Record Notification event - end + ' put logic here to route command-type based on incoming events group Routing logic alt event.type === 'notification' && event.action === 'prepare' && event.status === 'success' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\n
Error codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> TOPIC_NOTIFICATIONS_EVT: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "POST", @@ -125,12 +138,12 @@ group Send notification to Participants } end note else event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -143,12 +156,12 @@ group Send notification to Participants } end note else event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -161,12 +174,12 @@ group Send notification to Participants } end note else event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -183,12 +196,12 @@ group Send notification to Participants ' - To confirm if action=reserve results in sending out a payee notification <-- I assume this is for FSPIOP v1.1 changes ' - This is also only applicabble for "off-us" transfers alt (Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -202,12 +215,12 @@ group Send notification to Participants end note end else event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -220,12 +233,12 @@ group Send notification to Participants } end note else event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -238,12 +251,12 @@ group Send notification to Participants } end note else event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -256,12 +269,12 @@ group Send notification to Participants } end note else event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payer-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -278,12 +291,12 @@ group Send notification to Participants ' - To confirm if action=reserve results in sending out a payee notification <-- I assume this is for FSPIOP v1.1 changes ' - This is also only applicabble for "off-us" transfers ' alt (Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Payee-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -297,12 +310,12 @@ group Send notification to Participants end note ' end else event.type === 'notification' && event.action === 'get' && event.status === 'success' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Requesting-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Requesting-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -315,12 +328,12 @@ group Send notification to Participants } end note else event.type === 'notification' && event.action === 'get' && event.status === 'error' - CSAPI <-> NOTIFY_HANDLER_EVT: Return Endpoint details for Requesting-Participant\nError codes: 3202, 3203 + CSAPI <-> MLCALLBACKHANDLER: Return Endpoint details for Requesting-Participant\nError codes: 3202, 3203 activate CSAPI deactivate CSAPI - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with enriched message & endpoint data - note right of NOTIFY_HANDLER_EVT #yellow + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Construct NotificationReady Event Message with enriched message & endpoint data + note right of MLCALLBACKHANDLER #yellow "transport": { "type": "HTTP", "method": "PUT", @@ -333,8 +346,14 @@ group Send notification to Participants } end note end + MLCALLBACKHANDLER -> TOPIC_NOTIFICATIONS_EVT: Publish NotificationReady Event Message end + ' TODO1 + TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotificationReady Event + activate NOTIFY_HANDLER_EVT + activate TOPIC_NOTIFICATIONS_EVT + deactivate TOPIC_NOTIFICATIONS_EVT NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with notficiation-payload & transport-data group For-each NotifyCmd Command Messages @@ -343,9 +362,9 @@ group Send notification to Participants end - NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS: Commit Notification event - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS + NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit Notification event + activate TOPIC_NOTIFICATIONS_EVT + deactivate TOPIC_NOTIFICATIONS_EVT deactivate NOTIFY_HANDLER_EVT @@ -353,6 +372,10 @@ group Send notification to Participants activate NOTIFY_HANDLER_CMD deactivate TOPIC_NOTIFICATIONS_CMD + alt transport.options.deliver-report === true + NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification event + end + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration alt If transport.type && transport.content-type match handlers configuration @@ -373,14 +396,15 @@ alt If transport.type && transport.content-type match handlers configuration } } end note - NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification with Prepare/fulfil result/error to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 - NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP 200 OK + NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 + NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP Response end + alt transport.options.deliver-report === true NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report - - alt transport.options.deliver-report === true + NOTIFY_HANDLER_CMD -> NOTIFYDB: Record NotifyDeliveryReport results + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyDeliveryReport event activate TOPIC_NOTIFICATIONS_EVT @@ -388,9 +412,6 @@ alt If transport.type && transport.content-type match handlers configuration deactivate TOPIC_NOTIFICATIONS_EVT activate NOTIFY_HANDLER_EVT - NOTIFY_HANDLER_EVT -> DB: Record NotifyDeliveryReport event - - NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyDeliveryReport event deactivate NOTIFY_HANDLER_EVT activate TOPIC_NOTIFICATIONS_EVT diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index 54bc03eb0..d4c82f043 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -1,4 +1,4 @@ - + @@ -7,1034 +7,1100 @@ - + 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - - + + Central Service - - + + + Mojaloop Adapter + + + Notification Engine - - + + Financial Service Provider (Participant) - - - - - - - - - - - - - - - - Notification-Topic - - - - - Notification-Topic - - + + + + + + + + + + + + + + + + notifications + + + (Internal) + + + Topic + + + + + notifications + + + (Internal) + + + Topic + + + Central Service API + + + + + Central Service API + + + + + FSPIOP Callback Handler + + + + + FSPIOP Callback Handler + + + + + + + notificationsEvent + + + (Domain Event) + + + Topic + + + + + notificationsEvent + + + (Domain Event) + + + Topic + + Notification Event Handler - - - + + + Notification Event Handler - - - - Central Service API + + + + + + notificationsCommand - - - - Central Service API + + (Cmd Event) - - - - Persistent Store - - - - - Persistent Store - - - - - - - NotificationsCommand - - - - - NotificationsCommand - - - Notification Cmd Handler + + Topic - - - - Notification Cmd Handler + + + + notificationsCommand + + + (Cmd Event) + + + Topic + + + Notify Persistent Store - - - - - - NotificationsEvent + + + + Notify Persistent Store - - - - NotificationsEvent + + + + Notification Cmd Handler + + + + + Notification Cmd Handler - + + + Participant - - - + + + Participant - - - + + + - + Send notification to Participants - - - + + + 1 - + Consume Notification event - - - - alt - - - [transport.options.deliver-report === true] - - - - - 2 - - - Record Notification event - - - - + + + Routing logic - - - + + + alt - + [event.type === 'notification' && event.action === 'prepare' && event.status === 'success'] - - - - 3 + + + + 2 - + Return Endpoint details for Payee-Participant - + Error codes: - + 3202, 3203 - - - - 4 + + + + 3 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "POST", - + "recipient": { - + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'prepare.*|position-prepare' && event.status === 'error'] - - - - 5 + + + + 4 - + Return Endpoint details for Payer-Participant - + Error codes: - + 3202, 3203 - - - - 6 + + + + 5 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'prepare-duplicate' && event.status === 'success'] - - - - 7 + + + + 6 - + Return Endpoint details for Payer-Participant - + Error codes: - + 3202, 3203 - - - - 8 + + + + 7 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'success'] - - - - 9 + + + + 8 - + Return Endpoint details for Payer-Participant - + Error codes: - + 3202, 3203 - - - - 10 + + + + 9 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payer-Participant/transfers/{{transferId}}", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - - + + + alt - + [(Config.SEND_TRANSFER_CONFIRMATION_TO_PAYEE === true || event.action === 'reserve') && to!=from] - - - - 11 + + + + 10 - + Return Endpoint details for Payee-Participant - + Error codes: - + 3202, 3203 - - - - 12 + + + + 11 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payee-Participant/transfers/{{transferId}}", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'reject|abort' && event.status === 'success'] - - - - 13 + + + + 12 - + Return Endpoint details for Payee-Participant - + Error codes: - + 3202, 3203 - - - - 14 + + + + 13 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'commit|reserve' && event.status === 'error'] - - - - 15 + + + + 14 - + Return Endpoint details for Payee-Participant - + Error codes: - + 3202, 3203 - - - - 16 + + + + 15 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'timeout-received' && event.status === 'error'] - - - - 17 + + + + 16 - + Return Endpoint details for Payee-Participant - + Error codes: - + 3202, 3203 - - - - 18 + + + + 17 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'timeout-reserved' && event.status === 'success'] - - - - 19 + + + + 18 - + Return Endpoint details for Payer-Participant - + Error codes: - + 3202, 3203 - - - - 20 + + + + 19 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payer-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - - - 21 + + + + 20 - + Return Endpoint details for Payee-Participant - + Error codes: - + 3202, 3203 - - - - 22 + + + + 21 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Payee-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'get' && event.status === 'success'] - - - - 23 + + + + 22 - + Return Endpoint details for Requesting-Participant - + Error codes: - + 3202, 3203 - - - - 24 + + + + 23 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - + + [event.type === 'notification' && event.action === 'get' && event.status === 'error'] - - - - 25 + + + + 24 - + Return Endpoint details for Requesting-Participant - + Error codes: - + 3202, 3203 - - - - 26 + + + + 25 - - Construct NotifyCmd Command Message with enriched message & endpoint data + + Construct NotificationReady Event Message with enriched message & endpoint data - - - + + + "transport": { - + "type": "HTTP", - + "method": "PUT", - + "recipient": { - + "endpoint": "http://Requesting-Participant/transfers/{{transferId}}/error", - + "params": { - + "transferId": "{transferId}" - + } - + } - + } - - - + + + + 26 + + + Publish NotificationReady Event Message + + + + 27 - + + Consume NotificationReady Event + + + + + 28 + + Construct NotifyCmd Command Message with notficiation-payload & transport-data - - - + + + For-each NotifyCmd Command Messages - - - - 28 + + + + 29 - + Publish NotifyCmd Command Message - - - - 29 + + + + 30 - + Commit Notification event - - - - 30 + + + + 31 - + Consume NotifyCmd Command Message - - - - 31 + + + + alt + + + [transport.options.deliver-report === true] - + + + + 32 + + + Record Notification event + + + + + 33 + + Validate transport.type && transport.content-type match handlers configuration - - - + + + alt - + [If transport.type && transport.content-type match handlers configuration] - - - - 32 + + + + 34 - + Construct Transport Message - - - + + + Retry Transport Mechanism based on transport options - - - + + + "transport": { - + "options": { - + "deliveryReport": true, - + "retry": { - + "count": 3, - + "type": "noDelay|exponentialDelay", - + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - + } - + } - + } - - - - 33 + + + + 35 - - Notification with Prepare/fulfil result/error to + + Notification to - + Payer DFSP to specified Endpoint - PUT - + Error code: - + 1001 - - - - 34 - - - HTTP 200 OK - - - - - 35 + + + + 36 - - Prepare Delivery Report + + HTTP Response - - - + + + alt - + [transport.options.deliver-report === true] - - - - 36 - - - Publish NotifyDeliveryReport event - - - - + + + 37 - - Consume NotifyDeliveryReport event + + Prepare Delivery Report - - - + + + 38 - - Record NotifyDeliveryReport event + + Record NotifyDeliveryReport results - - - + + + 39 - - Commit NotifyDeliveryReport event + + Publish NotifyDeliveryReport event - - - - + + + 40 - - Ignore Notification + + Consume NotifyDeliveryReport event - - - + + + 41 - + + Commit NotifyDeliveryReport event + + + + + + 42 + + + Ignore Notification + + + + + 43 + + Commit NotifyCmd event diff --git a/package-lock.json b/package-lock.json index 00a952012..201ec5223 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,15342 @@ { "name": "documentation", "version": "11.3.2", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "version": "11.3.2", + "license": "ISC", + "dependencies": { + "express": "4.17.1", + "gitbook-cli": "2.3.2", + "gitbook-plugin-back-to-top-button": "0.1.4", + "gitbook-plugin-changelog": "1.0.1", + "gitbook-plugin-collapsible-chapters": "0.1.8", + "gitbook-plugin-editlink": "1.0.2", + "gitbook-plugin-fontsettings": "2.0.0", + "gitbook-plugin-include": "0.1.0", + "gitbook-plugin-insert-logo": "0.1.5", + "gitbook-plugin-page-toc": "1.1.1", + "gitbook-plugin-plantuml-svg": "1.0.1", + "gitbook-plugin-swagger": "0.2.0", + "gitbook-plugin-theme-api": "1.1.2", + "gitbook-plugin-uml": "1.0.1", + "gitbook-plugin-variables": "1.1.0", + "svgexport": "0.4.1" + }, + "devDependencies": { + "directory-tree": "^2.2.5", + "got": "^11.8.0", + "husky": "^4.2.5", + "license-checker": "25.0.1", + "node-plantuml": "^0.5.0", + "npm-audit-resolver": "2.2.1", + "npm-check-updates": "7.0.2", + "plantuml-encoder": "^1.4.0", + "strip-comments": "^2.0.1", + "svgo": "^1.3.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@korzio/djv-draft-04": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@korzio/djv-draft-04/-/djv-draft-04-2.0.1.tgz", + "integrity": "sha512-MeTVcNsfCIYxK6T7jW1sroC7dBAb4IfLmQe6RoCqlxHN5NFkzNpgdnBPR+/0D2wJDUJHM9s9NQv+ouhxKjvUjg==", + "dev": true, + "optional": true + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@npmcli/ci-detect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", + "integrity": "sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==", + "dev": true + }, + "node_modules/@npmcli/git": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.3.tgz", + "integrity": "sha512-c/ODsV5ppjB12VDXKc6hzVNgg6ZJX/etILUn3WgF5NLAYBhQLJ3fBq6uB2jQD4OwqOzJdPT1/xA3Xh3aaWGk5w==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^1.1.0", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "semver": "^7.3.2", + "unique-filename": "^1.1.1", + "which": "^2.0.2" + } + }, + "node_modules/@npmcli/git/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "dev": true, + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.2.0.tgz", + "integrity": "sha512-nFtqjVETliApiRdjbYwKwhlSHx2ZMagyj5b9YbNt0BWeeOVxJd47ZVE2u16vxDHyTOZvk+YLV7INwfAE9a2uow==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/@npmcli/run-script": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.4.0.tgz", + "integrity": "sha512-evlD0Ur2ILGyTP7FfMYi90x80bto9+nEbGjoWzdF+gmIX3HuA1nW0Ghj91JFaTJAHiXnDEEduZS24oAve/aeOA==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^1.2.0", + "infer-owner": "^1.0.4", + "node-gyp": "^6.1.0", + "read-package-json-fast": "^1.1.3" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz", + "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "13.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.2.tgz", + "integrity": "sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A==" + }, + "node_modules/@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==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "optional": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "optional": true, + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.3.tgz", + "integrity": "sha512-wn8fw19xKZwdGPO47jivonaHRTd+nGOMP1z11sgGeQzDy2xd5FG0R67dIMcKHDE2cJ5y+YXV30XVGUBPRSY7Hg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/agentkeepalive/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "node_modules/ansistyles": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", + "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" + }, + "node_modules/anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "dependencies": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "node_modules/apache-crypt": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.4.tgz", + "integrity": "sha512-Icze5ny5W5uv3xgMgl8U+iGmRCC0iIDrb2PVPuRBtL3Zy1Y5TMewXP1Vtc4r5X9eNNBEk7KYPu0Qby9m/PmcHg==", + "dependencies": { + "unix-crypt-td-js": "^1.1.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/apache-md5": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.5.tgz", + "integrity": "sha512-sbLEIMQrkV7RkIruqTPXxeCMkAAycv4yzTkBzRgOR1BrR5UB7qZtupqxkersTJSf0HZ3sbaNRrNV80TnnM7cUw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/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==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "devOptional": true + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/audit-resolve-core": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/audit-resolve-core/-/audit-resolve-core-1.1.8.tgz", + "integrity": "sha512-F3IWaxu1Xw4OokmtG9hkmsKoJt8DQS7RZvot52zXHsANKvzFRMKVNTP1DAz1ztlRGmJx1XV16PcE+6m35bYoTA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^4.1.1", + "djv": "^2.1.2", + "spawn-shell": "^2.1.0", + "yargs-parser": "^18.1.3" + } + }, + "node_modules/audit-resolve-core/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/audit-resolve-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/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=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "node_modules/bash-color": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bash-color/-/bash-color-0.0.4.tgz", + "integrity": "sha1-6b6M4zVAytpIgXaMWb1jhlc26RM=" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/bootprint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bootprint/-/bootprint-1.0.2.tgz", + "integrity": "sha1-dEU4so0kTJY0RqIuiAW7kbED9XM=", + "dependencies": { + "commander": "^2.6.0", + "customize-engine-handlebars": "^1.0.0", + "customize-engine-less": "^1.0.1", + "customize-engine-uglify": "^1.0.0", + "customize-watch": "^1.0.0", + "customize-write-files": "^1.0.0", + "debug": "^2.1.2", + "get-promise": "^1.3.1", + "js-yaml": "^3.8.2", + "live-server": "^1.2.0", + "q": "^1.4.1", + "trace-and-clarify-if-possible": "^1.0.3" + }, + "bin": { + "bootprint": "bin/bootprint.js" + } + }, + "node_modules/bootprint-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bootprint-base/-/bootprint-base-1.1.0.tgz", + "integrity": "sha1-svYgtki/pvxuAnGzhxz8nPeM0DA=", + "dependencies": { + "bootstrap": "^3.3.2", + "cheerio": "^0.19.0", + "handlebars": "^3.0.0", + "highlight.js": "^8.4.0", + "jquery": "^2", + "json-stable-stringify": "^1.0.0", + "marked": "^0.3.3" + } + }, + "node_modules/bootprint-json-schema": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bootprint-json-schema/-/bootprint-json-schema-1.1.0.tgz", + "integrity": "sha1-UI6PoRINyW0Lwsa6g0HrzdVFhSg=", + "dependencies": { + "bootprint-base": "^1.0.0", + "lodash": "^4.17.2" + } + }, + "node_modules/bootprint-swagger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bootprint-swagger/-/bootprint-swagger-1.0.1.tgz", + "integrity": "sha1-ykYPsXnZDXVymWwBaFJXroDNHDM=", + "dependencies": { + "bootprint-json-schema": "^1.0.0", + "highlight.js": "^8.9.1", + "json-stable-stringify": "^1.0.1", + "lodash": "^3.9.3", + "m-io": "^0.3.1" + } + }, + "node_modules/bootprint-swagger/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/bootprint-swagger/node_modules/m-io": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/m-io/-/m-io-0.3.1.tgz", + "integrity": "sha1-SgeSJG9oGfdFyLxdlzzeiC8NHvs=", + "dependencies": { + "mkdirp": "^0.5.1", + "q": "^1.4.1", + "rimraf": "^2.5.3" + } + }, + "node_modules/bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha1-w6NH1Bniia0R9AM+PEEyuHwIHXI=", + "engines": { + "node": ">=6" + } + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "node_modules/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==" + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz", + "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, + "node_modules/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=" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "dependencies": { + "css-select": "~1.0.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^3.2.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dependencies": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "optionalDependencies": { + "fsevents": "^1.0.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", + "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=", + "dev": true + }, + "node_modules/clarify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clarify/-/clarify-2.1.0.tgz", + "integrity": "sha1-jdSFOeIC5OAJ0sf6f+G2nN8mJSc=", + "optional": true, + "dependencies": { + "stack-chain": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-table/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/cliui/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha1-xQSRR51MG9rtLJztMs98fcI2D3g=", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/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=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "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" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dependencies": { + "boom": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "1.0", + "domutils": "1.4", + "nth-check": "~1.0.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", + "engines": { + "node": "*" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/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==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/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==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o=", + "optional": true + }, + "node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "optional": true, + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/customize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/customize/-/customize-1.1.1.tgz", + "integrity": "sha512-ldop1CRxbtctT+u8oBcihwoEC78m2xCJ4vyEsz/X/k49k8RouTosZeafkht+GzYKPQSnIdx+n8AZzr8o/zBfsg==", + "dependencies": { + "debug": "^2.2.0", + "deep-aplus": "^1.0.4", + "jsonschema": "^1.0.2", + "jsonschema-extra": "^1.2.0", + "lodash": "^3.9.3", + "m-io": "^0.5.0", + "minimatch": "^3.0.0", + "q": "^1.4.1" + } + }, + "node_modules/customize-engine-handlebars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/customize-engine-handlebars/-/customize-engine-handlebars-1.0.3.tgz", + "integrity": "sha512-o9XSiASy/rsD7Hzy2MYIG1iGdsf7Nqu3hSSw6pH+TVTLdBNusnPxWTYkqxgUCJUnhIKq2Lx6qixZc9hXQGckYg==", + "dependencies": { + "debug": "^2.2.0", + "handlebars": "^3.0.3", + "lodash": "^3.9.3", + "promised-handlebars": "^1.0.0", + "q": "^1.4.1", + "q-deep": "^1.0.1" + } + }, + "node_modules/customize-engine-handlebars/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/customize-engine-less": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/customize-engine-less/-/customize-engine-less-1.0.1.tgz", + "integrity": "sha1-rl//DPOSgGx9Dx1NqPfUsuZRCSk=", + "dependencies": { + "less": "^2.7.1", + "lodash": "^3.10.1", + "q": "^1.4.1" + } + }, + "node_modules/customize-engine-less/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/customize-engine-uglify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/customize-engine-uglify/-/customize-engine-uglify-1.0.0.tgz", + "integrity": "sha1-Eb3Mqslhn4zHCZHHGtB2K0cB+ug=", + "dependencies": { + "lodash": "^3.10.1", + "q": "^1.4.1", + "uglify-js": "^2.7.5" + } + }, + "node_modules/customize-engine-uglify/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/customize-watch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/customize-watch/-/customize-watch-1.0.1.tgz", + "integrity": "sha512-2wPI3gLoz0hH9E0kg/srTVYYFyyCZsFmxm2whcXvTQERMBoXhdmGJAxyiI3dXvDbkRk7MoD8lOnonpF3i1Tn9Q==", + "dependencies": { + "chokidar": "^1.2.0", + "customize": "^1.0.0", + "debug": "^2.2.0", + "deep-aplus": "^1.0.4", + "lodash": "^3.10.1", + "m-io": "^0.5.0", + "q": "^1.4.1" + } + }, + "node_modules/customize-watch/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/customize-write-files": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/customize-write-files/-/customize-write-files-1.1.1.tgz", + "integrity": "sha512-zPcxlElbfDgDkY1lDFK+jiGor6W93iQ7GDcWFLFiIOcZdjQCeW9KeKXt5Yx8Kfpv7cw3w24xaqlJcNQMKqrHMg==", + "dependencies": { + "debug": "^2.2.0", + "deep-aplus": "^1.0.4", + "m-io": "^0.5.0", + "q": "^1.4.1", + "stream-equal": "^0.1.12" + } + }, + "node_modules/customize/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/deep-aplus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/deep-aplus/-/deep-aplus-1.0.4.tgz", + "integrity": "sha1-4exMEKALUEa1ng3dBRnRAa4xXo8=", + "dependencies": { + "lodash.isplainobject": "^4.0.6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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=", + "optional": true + }, + "node_modules/default-shell": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/default-shell/-/default-shell-1.0.1.tgz", + "integrity": "sha1-dSMEvdxhdPSespy5iP7qC4gTyLw=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/directory-tree": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/directory-tree/-/directory-tree-2.2.5.tgz", + "integrity": "sha512-qmeuql8N7hQB5b+cnlvbcHSjKBNpRjLY5KcvyFd9CTC5uTN7sJshEQ/ExZidAcEUEYcC/76i8ikLtbBMG81YRg==", + "dev": true, + "engines": { + "node": ">=4.2" + } + }, + "node_modules/djv": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/djv/-/djv-2.1.2.tgz", + "integrity": "sha512-ltQSINn+7aMTp7pKeQpfZg2ACd/Gy6VrL3LYuT25/plwPBb7xlGOekr463Luqn816AWJLuP7KZQGFct2JICyeA==", + "dev": true, + "optionalDependencies": { + "@korzio/djv-draft-04": "^2.0.1" + } + }, + "node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha1-HsQFnihLq+027sKUHUqXChic58A=", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=" + }, + "node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=" + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" + }, + "node_modules/errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "optional": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "optional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-glob/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "optional": true + }, + "node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "dependencies": { + "semver-regex": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat/node_modules/is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "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" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/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=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-promise": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-promise/-/get-promise-1.4.0.tgz", + "integrity": "sha1-RDBFyGUwvrvtIihh7+0TwNNv9qA=", + "dependencies": { + "lodash": "^3.8.0", + "q": "^1.2.0" + }, + "engines": { + "node": ">=0.12.2 <0.14" + } + }, + "node_modules/get-promise/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gitbook-cli": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/gitbook-cli/-/gitbook-cli-2.3.2.tgz", + "integrity": "sha512-eyGtkY7jKHhmgpfuvgAP5fZcUob/FBz4Ld0aLRdEmiTrS1RklimN9epzPp75dd4MWpGhYvSbiwxnpyLiv1wh6A==", + "dependencies": { + "bash-color": "0.0.4", + "commander": "2.11.0", + "fs-extra": "3.0.1", + "lodash": "4.17.4", + "npm": "5.1.0", + "npmi": "1.0.1", + "optimist": "0.6.1", + "q": "1.5.0", + "semver": "5.3.0", + "tmp": "0.0.31", + "user-home": "2.0.0" + }, + "bin": { + "gitbook": "bin/gitbook.js" + } + }, + "node_modules/gitbook-cli/node_modules/lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "node_modules/gitbook-plugin-back-to-top-button": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/gitbook-plugin-back-to-top-button/-/gitbook-plugin-back-to-top-button-0.1.4.tgz", + "integrity": "sha1-5iGDOLDvGdWOb2YAmUNQt26ANd8=", + "engines": { + "gitbook": ">=3.1.1" + } + }, + "node_modules/gitbook-plugin-changelog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-changelog/-/gitbook-plugin-changelog-1.0.1.tgz", + "integrity": "sha1-CaEBwqXHm7q1NDyI3/qvZ9GPCVE=", + "dependencies": { + "lodash": "^4.17.4", + "moment": "^2.18.1" + }, + "engines": { + "gitbook": "*" + } + }, + "node_modules/gitbook-plugin-collapsible-chapters": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/gitbook-plugin-collapsible-chapters/-/gitbook-plugin-collapsible-chapters-0.1.8.tgz", + "integrity": "sha1-dxVcYcrBlRch2L9Es/ImphoeZcU=", + "engines": { + "gitbook": ">=0.4.6" + } + }, + "node_modules/gitbook-plugin-editlink": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gitbook-plugin-editlink/-/gitbook-plugin-editlink-1.0.2.tgz", + "integrity": "sha1-ej2Bk/guYfCUF83w52h2MfW2GV4=", + "engines": { + "gitbook": ">=2.5.0" + } + }, + "node_modules/gitbook-plugin-fontsettings": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gitbook-plugin-fontsettings/-/gitbook-plugin-fontsettings-2.0.0.tgz", + "integrity": "sha1-g1+QCuPdERCG/n7UQl7j3gJIYas=", + "engines": { + "gitbook": ">=2.4.0" + } + }, + "node_modules/gitbook-plugin-include": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gitbook-plugin-include/-/gitbook-plugin-include-0.1.0.tgz", + "integrity": "sha1-w1/0dlYKXv/e+tv2OYIknBy8dNw=", + "dependencies": { + "q": "*" + }, + "engines": { + "gitbook": "*" + } + }, + "node_modules/gitbook-plugin-insert-logo": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/gitbook-plugin-insert-logo/-/gitbook-plugin-insert-logo-0.1.5.tgz", + "integrity": "sha1-2q6N2kGiNtVPE5MeVwsmcpVXiFo=", + "engines": { + "gitbook": ">1.x.x" + } + }, + "node_modules/gitbook-plugin-page-toc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-page-toc/-/gitbook-plugin-page-toc-1.1.1.tgz", + "integrity": "sha1-YEZUSvoRNEJ2nwwLO0F8H+TfQRs=", + "engines": { + "gitbook": "3.*" + } + }, + "node_modules/gitbook-plugin-plantuml-svg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-plantuml-svg/-/gitbook-plugin-plantuml-svg-1.0.1.tgz", + "integrity": "sha1-4QfoSCp/Gu3j0/IXzk1C/BWe6Qk=", + "dependencies": { + "js-base64": "^2.4.0", + "lodash": "^4.17.4", + "request": "^2.83.0", + "request-promise": "^4.2.2" + }, + "engines": { + "gitbook": ">=2.0.0" + } + }, + "node_modules/gitbook-plugin-search": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-search/-/gitbook-plugin-search-2.2.1.tgz", + "integrity": "sha1-bSW1p3aZD6mP39+jfeMx944PaxM=", + "engines": { + "gitbook": ">=3.0.0-pre.0" + } + }, + "node_modules/gitbook-plugin-swagger": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/gitbook-plugin-swagger/-/gitbook-plugin-swagger-0.2.0.tgz", + "integrity": "sha1-g33zIY/9q9/LVu2Xr9SVYinZ0h0=", + "dependencies": { + "bootprint": "^1.0.0", + "bootprint-swagger": "^1.0.1" + }, + "engines": { + "gitbook": ">=3" + } + }, + "node_modules/gitbook-plugin-theme-api": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gitbook-plugin-theme-api/-/gitbook-plugin-theme-api-1.1.2.tgz", + "integrity": "sha1-jBRaS61JoSE8AlApC5vZtyrqiPw=", + "dependencies": { + "cheerio": "0.20.0", + "gitbook-plugin-search": ">=2.0.0", + "lodash": "4.12.0", + "q": "1.4.1", + "q-plus": "0.0.8" + }, + "engines": { + "gitbook": ">=3.0.4" + } + }, + "node_modules/gitbook-plugin-theme-api/node_modules/cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^4.1.0" + }, + "engines": { + "node": ">= 0.6" + }, + "optionalDependencies": { + "jsdom": "^7.0.2" + } + }, + "node_modules/gitbook-plugin-theme-api/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/gitbook-plugin-theme-api/node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", + "engines": { + "node": "*" + } + }, + "node_modules/gitbook-plugin-theme-api/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/gitbook-plugin-theme-api/node_modules/lodash": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", + "integrity": "sha1-K9bcRqBA9Z5obJcu0h2T3FkFMlg=" + }, + "node_modules/gitbook-plugin-theme-api/node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/gitbook-plugin-uml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-uml/-/gitbook-plugin-uml-1.0.1.tgz", + "integrity": "sha512-j9kWSFsfF7Y53LcfegQSkRUSc0cKcA93v0Sxg4wVzca7A9V1ridXiXcSeaKy7OZi386FB2mG+KihViUVZwfcCA==", + "dependencies": { + "crypto": "^1.0.1", + "fs-extra": "^4.0.1", + "node-plantuml": "^0.6.2", + "q": "^1.5.0" + }, + "engines": { + "gitbook": "*" + } + }, + "node_modules/gitbook-plugin-uml/node_modules/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==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/gitbook-plugin-uml/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/gitbook-plugin-uml/node_modules/node-plantuml": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/node-plantuml/-/node-plantuml-0.6.2.tgz", + "integrity": "sha512-4/nf/gBvKVm4+EbBgFQZf0n8N3jfAA7mRExs3NfgujSsaouktZwYkUzBUqUR8nRzIWDmJ4hA1QiWOjpEArTiZQ==", + "dependencies": { + "commander": "^2.8.1", + "node-nailgun-client": "^0.1.0", + "node-nailgun-server": "^0.1.3", + "plantuml-encoder": "^1.2.5" + }, + "bin": { + "puml": "index.js" + }, + "engines": { + "node": ">= 4.x" + } + }, + "node_modules/gitbook-plugin-variables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gitbook-plugin-variables/-/gitbook-plugin-variables-1.1.0.tgz", + "integrity": "sha1-3I69ZQ1OFoyV0KWIYcGgRtRrCSc=", + "dependencies": { + "fast-glob": "^2.2.2", + "fs-extra": "^7.0.0", + "js-yaml": "^3.12.0", + "lodash": "^4.17.10", + "native-require": "^1.1.4" + }, + "engines": { + "gitbook": ">= 3.0.0", + "node": ">= 8.0.0" + } + }, + "node_modules/gitbook-plugin-variables/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/gitbook-plugin-variables/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/gitbook-plugin-variables/node_modules/lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/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=" + }, + "node_modules/global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "dependencies": { + "ini": "^1.3.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/got": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.0.tgz", + "integrity": "sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "node_modules/handlebars": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.8.tgz", + "integrity": "sha512-frzSzoxbJZSB719r+lM3UFKrnHIY6VPY/j47+GNOHVnBHxO+r+Y/iDjozAbj1SztmmMpr2CcZY6rLeN5mqX8zA==", + "dependencies": { + "optimist": "^0.6.1", + "source-map": "^0.1.40", + "uglify-js": "^2.6" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dependencies": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/highlight.js": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-8.9.1.tgz", + "integrity": "sha1-uKnFSTISqTkvAiK2SclhFJfr+4g=", + "engines": { + "node": "*" + } + }, + "node_modules/hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + }, + "node_modules/htmlparser2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/http-auth": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", + "integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=", + "dependencies": { + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.3.0", + "uuid": "^3.0.0" + }, + "engines": { + "node": ">=4.6.1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.0-beta.5.2", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", + "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "husky-run": "bin/run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/husky/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/husky/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/husky/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/husky/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "engines": { + "node": "*" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/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=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "node_modules/is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" + }, + "node_modules/is-my-json-valid": { + "version": "2.20.5", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.5.tgz", + "integrity": "sha512-VTPuvvGQtxvCeghwspQu1rBgjYUT6FGxPlvFKbYuFtgc4ADsX3U5ihZOYN0qyU6u+d4X9xXb0IT5O6QpXKt87A==", + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "dev": true + }, + "node_modules/jquery": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", + "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" + }, + "node_modules/js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" + }, + "node_modules/js-quantities": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/js-quantities/-/js-quantities-1.7.5.tgz", + "integrity": "sha512-4rnv5eKQSDyRPREOkzw6OG/IY7/zfAlTgjvUcfA2eQ76/sYND3eo0fMl5q5uQEjdAnfDmZNJZrJvlOJzgqV6AA==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "optional": true, + "dependencies": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-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==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", + "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==", + "dev": true + }, + "node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "dev": true, + "dependencies": { + "jju": "^1.1.0" + } + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" + }, + "node_modules/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=", + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/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=" + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "node_modules/jsonlines": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", + "integrity": "sha1-T80kbcXQ44aRkHxEqwAveC0dlMw=", + "dev": true + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonpointer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz", + "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonschema": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.6.tgz", + "integrity": "sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA==", + "engines": { + "node": "*" + } + }, + "node_modules/jsonschema-extra": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsonschema-extra/-/jsonschema-extra-1.2.0.tgz", + "integrity": "sha1-52eGotlQdb4ja5izuAUrD2wVTXs=", + "dependencies": { + "js-quantities": "^1.5.0", + "lodash.isplainobject": "^2.4.1" + } + }, + "node_modules/jsonschema-extra/node_modules/lodash.isplainobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-2.4.1.tgz", + "integrity": "sha1-rHOF4uqawDIfMNw7gDKm0iMagBE=", + "dependencies": { + "lodash._isnative": "~2.4.1", + "lodash._shimisplainobject": "~2.4.1" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/keyv": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", + "dependencies": { + "graceful-fs": "^4.1.2", + "mime": "^1.2.11", + "mkdirp": "^0.5.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=0.12" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "image-size": "~0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" + } + }, + "node_modules/less/node_modules/ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "optional": true, + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/less/node_modules/assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/less/node_modules/aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/less/node_modules/form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/less/node_modules/har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "optional": true, + "dependencies": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "optional": true, + "dependencies": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/less/node_modules/oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/less/node_modules/performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "optional": true + }, + "node_modules/less/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + }, + "node_modules/less/node_modules/qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "optional": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/less/node_modules/request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "optional": true, + "dependencies": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/less/node_modules/tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "optional": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libnpmconfig": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", + "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + } + }, + "node_modules/license-checker": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz", + "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "read-installed": "~4.0.3", + "semver": "^5.5.0", + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-satisfies": "^4.0.0", + "treeify": "^1.1.0" + }, + "bin": { + "license-checker": "bin/license-checker" + } + }, + "node_modules/license-checker/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/license-checker/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/license-checker/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/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=", + "dev": true + }, + "node_modules/live-server": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz", + "integrity": "sha1-ZwYw3UCdIv6cUTqxwYlGhsdXFT4=", + "dependencies": { + "chokidar": "^2.0.4", + "colors": "^1.4.0", + "connect": "^3.6.6", + "cors": "^2.8.5", + "event-stream": "3.3.4", + "faye-websocket": "0.11.x", + "http-auth": "3.1.x", + "morgan": "^1.9.1", + "object-assign": "^4.1.1", + "opn": "^6.0.0", + "proxy-middleware": "^0.15.0", + "send": "^0.17.1", + "serve-index": "^1.9.1" + }, + "bin": { + "live-server": "live-server.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/live-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "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" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/live-server/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/live-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/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==" + }, + "node_modules/live-server/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/live-server/node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "node_modules/lodash._basebind": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", + "integrity": "sha1-6UC5690nwyfgqNqxtVkWxTQelXU=", + "dependencies": { + "lodash._basecreate": "~2.4.1", + "lodash._setbinddata": "~2.4.1", + "lodash._slice": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "node_modules/lodash._basecreate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "integrity": "sha1-+Ob1tXip405UEXm1a47uv0oofgg=", + "dependencies": { + "lodash._isnative": "~2.4.1", + "lodash.isobject": "~2.4.1", + "lodash.noop": "~2.4.1" + } + }, + "node_modules/lodash._basecreatecallback": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", + "integrity": "sha1-fQsmdknLKeehOdAQO3wR+uhOSFE=", + "dependencies": { + "lodash._setbinddata": "~2.4.1", + "lodash.bind": "~2.4.1", + "lodash.identity": "~2.4.1", + "lodash.support": "~2.4.1" + } + }, + "node_modules/lodash._basecreatewrapper": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", + "integrity": "sha1-TTHy595+E0+/KAN2K4FQsyUZZm8=", + "dependencies": { + "lodash._basecreate": "~2.4.1", + "lodash._setbinddata": "~2.4.1", + "lodash._slice": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "node_modules/lodash._createwrapper": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", + "integrity": "sha1-UdaVeXPaTtVW43KQ2MGhjFPeFgc=", + "dependencies": { + "lodash._basebind": "~2.4.1", + "lodash._basecreatewrapper": "~2.4.1", + "lodash._slice": "~2.4.1", + "lodash.isfunction": "~2.4.1" + } + }, + "node_modules/lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=" + }, + "node_modules/lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=" + }, + "node_modules/lodash._setbinddata": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", + "integrity": "sha1-98IAzRuS7yNrOZ7s9zxkjReqlNI=", + "dependencies": { + "lodash._isnative": "~2.4.1", + "lodash.noop": "~2.4.1" + } + }, + "node_modules/lodash._shimisplainobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimisplainobject/-/lodash._shimisplainobject-2.4.1.tgz", + "integrity": "sha1-AeyTsu5j5Z8aqDiZrG+gkFrHWW8=", + "dependencies": { + "lodash.forin": "~2.4.1", + "lodash.isfunction": "~2.4.1" + } + }, + "node_modules/lodash._slice": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", + "integrity": "sha1-dFz0GlNZexj2iImFREBe+isG2Q8=" + }, + "node_modules/lodash.bind": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", + "integrity": "sha1-XRn6AFyMTSNvr0dCx7eh/Kvikmc=", + "dependencies": { + "lodash._createwrapper": "~2.4.1", + "lodash._slice": "~2.4.1" + } + }, + "node_modules/lodash.forin": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.forin/-/lodash.forin-2.4.1.tgz", + "integrity": "sha1-gInq7X0lsIZyt8Zv0HrFXQYjIOs=", + "dependencies": { + "lodash._basecreatecallback": "~2.4.1", + "lodash._objecttypes": "~2.4.1" + } + }, + "node_modules/lodash.identity": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz", + "integrity": "sha1-ZpTP+mX++TH3wxzobHRZfPVg9PE=" + }, + "node_modules/lodash.isfunction": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", + "integrity": "sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE=" + }, + "node_modules/lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dependencies": { + "lodash._objecttypes": "~2.4.1" + } + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.noop": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", + "integrity": "sha1-T7VPgWZS5a4Q6PcvcXo4jHMmU4o=" + }, + "node_modules/lodash.support": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", + "integrity": "sha1-Mg4LZwMWc8KNeiu12eAzGkUkBRU=", + "dependencies": { + "lodash._isnative": "~2.4.1" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/m-io": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/m-io/-/m-io-0.5.0.tgz", + "integrity": "sha1-chuybdjUN13Oy1bY3AFm64vp0AM=", + "dependencies": { + "fs-extra": "^2.0.0", + "q": "^1.4.1" + } + }, + "node_modules/m-io/node_modules/fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "node_modules/m-io/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.9.tgz", + "integrity": "sha512-uHa4gv/NIdm9cUvfOhYb57nxrCY08iyMRXru0jbpaH57Q3NCge/ypY7fOvgCr8tPyucKrGbVndKhjXE0IX0VfQ==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.0", + "cacache": "^15.0.0", + "http-cache-semantics": "^4.0.4", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha1-XUf3CcTJ/Dwha21GEnKA9As515A=", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw=" + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha1-WzZu6DsvFYLEj4fkfPGpNSEDyoE=", + "engines": { + "node": ">= 6" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dependencies": { + "mime-db": "1.43.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.0.tgz", + "integrity": "sha512-Yb23ESZZ/8QxiBvSpJ4atbVMVDx2CXrerzrtQzQ67eLqKg+zFIkYFTagk3xh6fdo+e/FvDtVuCD4QcuYDRR3hw==", + "dev": true, + "dependencies": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mkdirp/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s=", + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/native-require": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/native-require/-/native-require-1.1.4.tgz", + "integrity": "sha1-4hb6dhlA6xYtIMpwNdG9tx4Cybc=" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-gyp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz", + "integrity": "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==", + "dev": true, + "dependencies": { + "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" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/node-gyp/node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/node-gyp/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/node-nailgun-client": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/node-nailgun-client/-/node-nailgun-client-0.1.2.tgz", + "integrity": "sha512-OC611lR0fsDUSptwnhBf8d3sj4DZ5fiRKfS2QaGPe0kR3Dt9YoZr1MY7utK0scFPTbXuQdSBBbeoKYVbME1q5g==", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "node-nailgun-client": "index.js" + } + }, + "node_modules/node-nailgun-server": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/node-nailgun-server/-/node-nailgun-server-0.1.4.tgz", + "integrity": "sha512-e0Hbh6XPb/7GqATJ45BePaUEO5AwR7InRW/pGeMKHH1cqPMBFCeqdBNfvi+bkVLnsbYOOQE+pAek9nmNoD8sYw==", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "node-nailgun-server": "index.js" + } + }, + "node_modules/node-plantuml": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/node-plantuml/-/node-plantuml-0.5.0.tgz", + "integrity": "sha1-A8LthW5rJyxxShVoRTp0fCZv3B8=", + "dev": true, + "dependencies": { + "commander": "^2.8.1", + "node-nailgun-client": "^0.1.0", + "node-nailgun-server": "^0.1.3", + "plantuml-encoder": "^1.2.4" + }, + "bin": { + "puml": "index.js" + } + }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-5.1.0.tgz", + "integrity": "sha512-pt5ClxEmY/dLpb60SmGQQBKi3nB6Ljx1FXmpoCUdAULlGqGVn2uCyXxPCWFbcuHGthT7qGiaGa1wOfs/UjGYMw==", + "dependencies": { + "abbrev": "~1.1.0", + "ansi-regex": "~3.0.0", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "~1.1.2", + "archy": "~1.0.0", + "bluebird": "~3.5.0", + "cacache": "~9.2.9", + "call-limit": "~1.1.0", + "chownr": "~1.0.1", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.11", + "debuglog": "*", + "detect-indent": "~5.0.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "fstream": "~1.0.11", + "fstream-npm": "~1.2.1", + "glob": "~7.1.2", + "graceful-fs": "~4.1.11", + "has-unicode": "~2.0.1", + "hosted-git-info": "~2.5.0", + "iferr": "~0.1.5", + "imurmurhash": "*", + "inflight": "~1.0.6", + "inherits": "~2.0.3", + "ini": "~1.3.4", + "init-package-json": "~1.10.1", + "JSONStream": "~1.3.1", + "lazy-property": "~1.0.0", + "lockfile": "~1.0.3", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "~4.1.1", + "mississippi": "~1.3.0", + "mkdirp": "~0.5.1", + "move-concurrently": "~1.0.1", + "node-gyp": "~3.6.2", + "nopt": "~4.0.1", + "normalize-package-data": "~2.4.0", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-package-arg": "~5.1.2", + "npm-registry-client": "~8.4.0", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "~1.4.3", + "osenv": "~0.1.4", + "pacote": "~2.7.38", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "~2.0.9", + "read-package-tree": "~5.1.6", + "readable-stream": "~2.3.2", + "readdir-scoped-modules": "*", + "request": "~2.81.0", + "retry": "~0.10.1", + "rimraf": "~2.6.1", + "safe-buffer": "~5.1.1", + "semver": "~5.3.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "~4.1.6", + "strip-ansi": "~4.0.0", + "tar": "~2.2.1", + "text-table": "~0.2.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "~1.1.0", + "unpipe": "~1.0.0", + "update-notifier": "~2.2.0", + "uuid": "~3.1.0", + "validate-npm-package-license": "*", + "validate-npm-package-name": "~3.0.0", + "which": "~1.2.14", + "worker-farm": "~1.3.1", + "wrappy": "~1.0.2", + "write-file-atomic": "~2.1.0" + }, + "bin": { + "npm": "bin/npm-cli.js" + } + }, + "node_modules/npm-audit-resolver": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/npm-audit-resolver/-/npm-audit-resolver-2.2.1.tgz", + "integrity": "sha512-9Jo5EdxREaXRrFm7eiuT1qu7fXKDfO+oiu+EgvJ/JCd2PIAgzVGF+xFoNK9AnyUsMFvSTdJM6+YlgUgF/N86GA==", + "dev": true, + "dependencies": { + "audit-resolve-core": "^1.1.8", + "chalk": "^2.4.2", + "djv": "^2.1.2", + "jsonlines": "^0.1.1", + "read": "^1.0.7", + "spawn-shell": "^2.1.0", + "yargs-parser": "^18.1.3", + "yargs-unparser": "^1.6.3" + }, + "bin": { + "check-audit": "check.js", + "resolve-audit": "resolve.js" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-check-updates": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-7.0.2.tgz", + "integrity": "sha512-MyH17fUCFbYShuIyxZj6yqB6YZ47+AjPCgXQiH1oqNe3vElBoJ0toY7nwy88qJbfXnFqjTFigzs9lsoKSK0iUw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "cint": "^8.2.1", + "cli-table": "^0.3.1", + "commander": "^5.1.0", + "find-up": "4.1.0", + "get-stdin": "^8.0.0", + "json-parse-helpfulerror": "^1.0.3", + "libnpmconfig": "^1.2.1", + "lodash": "^4.17.19", + "p-map": "^4.0.0", + "pacote": "^11.1.10", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "rc-config-loader": "^3.0.0", + "requireg": "^0.2.2", + "semver": "^7.3.2", + "semver-utils": "^1.1.4", + "spawn-please": "^0.3.0", + "update-notifier": "^4.1.0" + }, + "bin": { + "ncu": "bin/ncu.js", + "npm-check-updates": "bin/npm-check-updates.js" + }, + "engines": { + "node": ">=10.17" + } + }, + "node_modules/npm-check-updates/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-check-updates/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-check-updates/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm-check-updates/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/npm-check-updates/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm-check-updates/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-check-updates/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-check-updates/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-check-updates/node_modules/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-check-updates/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-check-updates/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-check-updates/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.2.tgz", + "integrity": "sha512-eByPaP+wsKai0BJX5pmb58d3mfR0zUATcnyuvSxIudTEn+swCPFLxh7srCmqB4hr7i9V24/DPjjq5b2qUtbgXQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.1.3.tgz", + "integrity": "sha512-xpBFcg13wkFR0SsscvemmrIe1Sxe1SPgGUOAb7+5Uo6fR8SIRMenMHeDSjfyulv1px66/y0Ib40rtKO20PcgPg==", + "dev": true, + "dependencies": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch/node_modules/minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "1.1.0", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" + }, + "node_modules/npm/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/npm/node_modules/agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "3.0.0", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/ansicolors": { + "version": "0.3.2", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "node_modules/npm/node_modules/ansistyles": { + "version": "0.1.3", + "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" + }, + "node_modules/npm/node_modules/aproba": { + "version": "1.1.2", + "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "node_modules/npm/node_modules/bluebird": { + "version": "3.5.0", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "node_modules/npm/node_modules/cacache": { + "version": "9.2.9", + "integrity": "sha512-ghg1j5OyTJ6qsrqU++dN23QiTDxb5AZCFGsF3oB+v9v/gY+F4X8L/0gdQMEjd+8Ot3D29M2etX5PKozHRn2JQw==", + "dependencies": { + "bluebird": "^3.5.0", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^1.3.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.1", + "ssri": "^4.1.6", + "unique-filename": "^1.1.0", + "y18n": "^3.2.1" + } + }, + "node_modules/npm/node_modules/call-limit": { + "version": "1.1.0", + "integrity": "sha1-b9YbA/PaQqLNDsK2DwK9DnGZH+o=" + }, + "node_modules/npm/node_modules/chownr": { + "version": "1.0.1", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "2.0.2", + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", + "dependencies": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.5.4", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dependencies": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/wcwidth": { + "version": "1.0.1", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults": { + "version": "1.0.3", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone": { + "version": "1.0.2", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/config-chain": { + "version": "1.1.11", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/npm/node_modules/config-chain/node_modules/proto-list": { + "version": "1.2.4", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "node_modules/npm/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/detect-indent": { + "version": "5.0.0", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/dezalgo": { + "version": "1.0.3", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/dezalgo/node_modules/asap": { + "version": "2.0.5", + "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" + }, + "node_modules/npm/node_modules/editor": { + "version": "1.0.0", + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=" + }, + "node_modules/npm/node_modules/fs-vacuum": { + "version": "1.2.10", + "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", + "dependencies": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/npm/node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/npm/node_modules/fstream-npm": { + "version": "1.2.1", + "integrity": "sha512-iBHpm/LmD1qw0TlHMAqVd9rwdU6M+EHRUnPkXpRi5G/Hf0FIFH+oZFryodAU2MFNfGRh/CzhUFlMKV3pdeOTDw==", + "dependencies": { + "fstream-ignore": "^1.0.0", + "inherits": "2" + } + }, + "node_modules/npm/node_modules/fstream-npm/node_modules/fstream-ignore": { + "version": "1.0.5", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dependencies": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "node_modules/npm/node_modules/fstream-npm/node_modules/fstream-ignore/node_modules/minimatch": { + "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/fstream-npm/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.8", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/fstream-npm/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.0", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/npm/node_modules/fstream-npm/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/npm/node_modules/glob": { + "version": "7.1.2", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/glob/node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/npm/node_modules/glob/node_modules/minimatch": { + "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.8", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.0", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/npm/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/npm/node_modules/glob/node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.1.11", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "2.5.0", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + }, + "node_modules/npm/node_modules/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==" + }, + "node_modules/npm/node_modules/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==", + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/npm/node_modules/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==", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/npm/node_modules/iferr": { + "version": "0.1.5", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/inherits": { + "version": "2.0.3", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/npm/node_modules/ini": { + "version": "1.3.4", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "1.10.1", + "integrity": "sha1-zYc6FneWvvuZYSsodioLY5P9j2o=", + "dependencies": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.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" + } + }, + "node_modules/npm/node_modules/init-package-json/node_modules/promzard": { + "version": "0.3.0", + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "dependencies": { + "read": "1" + } + }, + "node_modules/npm/node_modules/JSONStream": { + "version": "1.3.1", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "index.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/JSONStream/node_modules/jsonparse": { + "version": "1.3.1", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/npm/node_modules/JSONStream/node_modules/through": { + "version": "2.3.8", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/npm/node_modules/lazy-property": { + "version": "1.0.0", + "integrity": "sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=" + }, + "node_modules/npm/node_modules/lockfile": { + "version": "1.0.3", + "integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=" + }, + "node_modules/npm/node_modules/lodash._baseindexof": { + "version": "3.1.0", + "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=" + }, + "node_modules/npm/node_modules/lodash._baseuniq": { + "version": "4.6.0", + "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", + "dependencies": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "node_modules/npm/node_modules/lodash._baseuniq/node_modules/lodash._createset": { + "version": "4.0.3", + "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=" + }, + "node_modules/npm/node_modules/lodash._baseuniq/node_modules/lodash._root": { + "version": "3.0.1", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + }, + "node_modules/npm/node_modules/lodash._bindcallback": { + "version": "3.0.1", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "node_modules/npm/node_modules/lodash._cacheindexof": { + "version": "3.0.2", + "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=" + }, + "node_modules/npm/node_modules/lodash._createcache": { + "version": "3.1.2", + "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", + "dependencies": { + "lodash._getnative": "^3.0.0" + } + }, + "node_modules/npm/node_modules/lodash._getnative": { + "version": "3.9.1", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "node_modules/npm/node_modules/lodash.clonedeep": { + "version": "4.5.0", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "node_modules/npm/node_modules/lodash.restparam": { + "version": "3.6.1", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "node_modules/npm/node_modules/lodash.union": { + "version": "4.6.0", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "node_modules/npm/node_modules/lodash.uniq": { + "version": "4.5.0", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/npm/node_modules/lodash.without": { + "version": "4.4.0", + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=" + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "4.1.1", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/npm/node_modules/lru-cache/node_modules/pseudomap": { + "version": "1.0.2", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/npm/node_modules/lru-cache/node_modules/yallist": { + "version": "2.1.2", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-2.6.0.tgz", + "integrity": "sha512-FFq0lNI0ax+n9IWzWpH8A4JdgYiAp2DDYIZ3rsaav8JDe8I+72CzK6PQW/oom15YDZpV5bYW/9INd6nIJ2ZfZw==", + "dependencies": { + "agentkeepalive": "^3.3.0", + "cacache": "^10.0.0", + "http-cache-semantics": "^3.8.0", + "http-proxy-agent": "^2.0.0", + "https-proxy-agent": "^2.1.0", + "lru-cache": "^4.1.1", + "mississippi": "^1.2.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^3.0.1", + "ssri": "^5.0.0" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dependencies": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/cacache/node_modules/mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dependencies": { + "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": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/rimraf/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "node_modules/npm/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/npm/node_modules/mississippi": { + "version": "1.3.0", + "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", + "dependencies": { + "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": "^1.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/concat-stream": { + "version": "1.6.0", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/concat-stream/node_modules/typedarray": { + "version": "0.0.6", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/npm/node_modules/mississippi/node_modules/duplexify": { + "version": "3.5.0", + "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", + "dependencies": { + "end-of-stream": "1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/duplexify/node_modules/end-of-stream": { + "version": "1.0.0", + "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/duplexify/node_modules/end-of-stream/node_modules/once": { + "version": "1.3.3", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/duplexify/node_modules/stream-shift": { + "version": "1.0.0", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "node_modules/npm/node_modules/mississippi/node_modules/end-of-stream": { + "version": "1.4.0", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/flush-write-stream": { + "version": "1.0.2", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/from2": { + "version": "2.3.0", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/parallel-transform": { + "version": "1.1.0", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dependencies": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/parallel-transform/node_modules/cyclist": { + "version": "0.2.2", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "node_modules/npm/node_modules/mississippi/node_modules/pump": { + "version": "1.0.2", + "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/pumpify": { + "version": "1.3.5", + "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", + "dependencies": { + "duplexify": "^3.1.2", + "inherits": "^2.0.1", + "pump": "^1.0.0" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/stream-each": { + "version": "1.2.0", + "integrity": "sha1-HpXUdXP1gNgU3A/4zQ9m8c5TyZE=", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/stream-each/node_modules/stream-shift": { + "version": "1.0.0", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "node_modules/npm/node_modules/mississippi/node_modules/through2": { + "version": "2.0.3", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dependencies": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "node_modules/npm/node_modules/mississippi/node_modules/through2/node_modules/xtend": { + "version": "4.0.1", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/npm/node_modules/move-concurrently": { + "version": "1.0.1", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "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" + } + }, + "node_modules/npm/node_modules/move-concurrently/node_modules/run-queue": { + "version": "1.0.3", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.3.tgz", + "integrity": "sha512-7789TDMqJpv5iHxn1cAESCBEC/sBHAFxAvgXAcvzWenEWl0qf6E2Kk/Xwdl5ZclktUJzxJPVa27OMkBvaHKqCQ==", + "dependencies": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": ">=2.9.0 <2.82.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "3.0.6", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "4.0.1", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "2.4.0", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/npm/node_modules/normalize-package-data/node_modules/is-builtin-module": { + "version": "1.0.0", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dependencies": { + "builtin-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data/node_modules/is-builtin-module/node_modules/builtin-modules": { + "version": "1.1.1", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npm-cache-filename": { + "version": "1.0.2", + "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=" + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "3.0.0", + "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", + "dependencies": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "5.1.2", + "integrity": "sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==", + "dependencies": { + "hosted-git-info": "^2.4.2", + "osenv": "^0.1.4", + "semver": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-client": { + "version": "8.4.0", + "integrity": "sha512-PVNfqq0lyRdFnE//nDmn3CC9uqTsr8Bya9KPLIevlXMfkP0m4RpCVyFFk0W1Gfx436kKwyhLA6J+lV+rgR81gQ==", + "dependencies": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^4.1.2" + } + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream": { + "version": "1.6.0", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/typedarray": { + "version": "0.0.6", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.0", + "integrity": "sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE=" + }, + "node_modules/npm/node_modules/npmlog": { + "version": "4.1.2", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": { + "version": "1.1.4", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates": { + "version": "1.0.0", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/npm/node_modules/npmlog/node_modules/console-control-strings": { + "version": "1.1.0", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge": { + "version": "2.7.4", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "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" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/object-assign": { + "version": "4.1.1", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.2", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at": { + "version": "1.1.0", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan": { + "version": "1.0.1", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/wide-align": { + "version": "1.1.2", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dependencies": { + "string-width": "^1.0.2" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/set-blocking": { + "version": "2.0.0", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/npm/node_modules/once": { + "version": "1.4.0", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/opener": { + "version": "1.4.3", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "bin": { + "opener": "opener.js" + } + }, + "node_modules/npm/node_modules/osenv": { + "version": "0.1.4", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/npm/node_modules/osenv/node_modules/os-homedir": { + "version": "1.0.2", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/osenv/node_modules/os-tmpdir": { + "version": "1.0.2", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "2.7.38", + "integrity": "sha512-XxHUyHQB7QCVBxoXeVu0yKxT+2PvJucsc0+1E+6f95lMUxEAYERgSAc71ckYXrYr35Ew3xFU/LrhdIK21GQFFA==", + "dependencies": { + "bluebird": "^3.5.0", + "cacache": "^9.2.9", + "glob": "^7.1.2", + "lru-cache": "^4.1.1", + "make-fetch-happen": "^2.4.13", + "minimatch": "^3.0.4", + "mississippi": "^1.2.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^5.1.2", + "npm-pick-manifest": "^1.0.4", + "osenv": "^0.1.4", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^4.0.0", + "safe-buffer": "^5.1.1", + "semver": "^5.3.0", + "ssri": "^4.1.6", + "tar-fs": "^1.15.3", + "tar-stream": "^1.5.4", + "unique-filename": "^1.1.0", + "which": "^1.2.12" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/minimatch": { + "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.8", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.0", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/npm/node_modules/pacote/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/npm/node_modules/pacote/node_modules/npm-pick-manifest": { + "version": "1.0.4", + "integrity": "sha512-MKxNdeyOZysPRTTbHtW0M5Fw38Jo/3ARsoGw5qjCfS+XGjvNB/Gb4qtAZUFmKPM2mVum+eX559eHvKywU856BQ==", + "dependencies": { + "npm-package-arg": "^5.1.2", + "semver": "^5.3.0" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/promise-retry": { + "version": "1.1.1", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dependencies": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/promise-retry/node_modules/err-code": { + "version": "1.1.2", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" + }, + "node_modules/npm/node_modules/pacote/node_modules/protoduck": { + "version": "4.0.0", + "integrity": "sha1-/kh02MeRM2bP2erRJFOiLNNlf44=", + "dependencies": { + "genfun": "^4.0.1" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/protoduck/node_modules/genfun": { + "version": "4.0.1", + "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=" + }, + "node_modules/npm/node_modules/pacote/node_modules/tar-stream": { + "version": "1.5.4", + "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", + "dependencies": { + "bl": "^1.0.0", + "end-of-stream": "^1.0.0", + "readable-stream": "^2.0.0", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/tar-stream/node_modules/bl": { + "version": "1.2.1", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "dependencies": { + "readable-stream": "^2.0.5" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/tar-stream/node_modules/end-of-stream": { + "version": "1.4.0", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/npm/node_modules/pacote/node_modules/tar-stream/node_modules/xtend": { + "version": "4.0.1", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/npm/node_modules/path-is-inside": { + "version": "1.0.2", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/npm/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/npm/node_modules/read": { + "version": "1.0.7", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "1.0.1", + "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", + "dependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/npm/node_modules/read-installed": { + "version": "4.0.3", + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", + "dependencies": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "node_modules/npm/node_modules/read-installed/node_modules/util-extend": { + "version": "1.0.3", + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "2.0.9", + "integrity": "sha512-vuV8p921IgyelL4UOKv3FsRuRZSaRn30HanLAOKargsr8TbBEq+I3MgloSRXYuKhNdYP1wlEGilMWAIayA2RFg==", + "dependencies": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-helpfulerror": "^1.0.2", + "normalize-package-data": "^2.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json/node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "dependencies": { + "jju": "^1.1.0" + } + }, + "node_modules/npm/node_modules/read-package-json/node_modules/json-parse-helpfulerror/node_modules/jju": { + "version": "1.3.0", + "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" + }, + "node_modules/npm/node_modules/read-package-tree": { + "version": "5.1.6", + "integrity": "sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "node_modules/npm/node_modules/read/node_modules/mute-stream": { + "version": "0.0.7", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "2.3.2", + "integrity": "sha1-WgTfBeT1f+Pw3Gj90R3FyXx+b00=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.0", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npm/node_modules/readable-stream/node_modules/core-util-is": { + "version": "1.0.2", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.0.3", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/npm/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.0.2", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/npm/node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/npm/node_modules/request": { + "version": "2.81.0", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dependencies": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/request/node_modules/aws-sign2": { + "version": "0.6.0", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/request/node_modules/aws4": { + "version": "1.6.0", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "node_modules/npm/node_modules/request/node_modules/caseless": { + "version": "0.12.0", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/npm/node_modules/request/node_modules/combined-stream": { + "version": "1.0.5", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream": { + "version": "1.0.0", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/extend": { + "version": "3.0.1", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "node_modules/npm/node_modules/request/node_modules/forever-agent": { + "version": "0.6.1", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/request/node_modules/form-data": { + "version": "2.1.4", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/npm/node_modules/request/node_modules/form-data/node_modules/asynckit": { + "version": "0.4.0", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/npm/node_modules/request/node_modules/har-validator": { + "version": "4.2.1", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dependencies": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/ajv": { + "version": "4.11.8", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/ajv/node_modules/co": { + "version": "4.6.0", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/ajv/node_modules/json-stable-stringify": { + "version": "1.0.1", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/ajv/node_modules/json-stable-stringify/node_modules/jsonify": { + "version": "0.0.0", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/har-schema": { + "version": "1.0.5", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk": { + "version": "3.1.3", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dependencies": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/boom": { + "version": "2.10.1", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles": { + "version": "2.0.5", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dependencies": { + "boom": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/hoek": { + "version": "2.16.3", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/sntp": { + "version": "1.0.9", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature": { + "version": "1.1.1", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dependencies": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/assert-plus": { + "version": "0.2.0", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim": { + "version": "1.4.0", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/assert-plus": { + "version": "1.0.0", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf": { + "version": "1.0.2", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema": { + "version": "0.2.3", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror": { + "version": "1.3.6", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "extsprintf": "1.0.2" + } + }, + "node_modules/npm/node_modules/request/node_modules/is-typedarray": { + "version": "1.0.0", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/npm/node_modules/request/node_modules/isstream": { + "version": "0.1.2", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/npm/node_modules/request/node_modules/json-stringify-safe": { + "version": "5.0.1", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/npm/node_modules/request/node_modules/mime-types": { + "version": "2.1.15", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dependencies": { + "mime-db": "~1.27.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db": { + "version": "1.27.0", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/oauth-sign": { + "version": "0.8.2", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/request/node_modules/performance-now": { + "version": "0.2.0", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "node_modules/npm/node_modules/request/node_modules/qs": { + "version": "6.4.0", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/stringstream": { + "version": "0.0.5", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "node_modules/npm/node_modules/request/node_modules/tough-cookie": { + "version": "2.3.2", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/tough-cookie/node_modules/punycode": { + "version": "1.4.1", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/npm/node_modules/request/node_modules/tunnel-agent": { + "version": "0.6.0", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.10.1", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/rimraf": { + "version": "2.6.1", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.1.1", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/npm/node_modules/semver": { + "version": "5.3.0", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm/node_modules/sha": { + "version": "2.0.1", + "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", + "dependencies": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + } + }, + "node_modules/npm/node_modules/slide": { + "version": "1.1.6", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "engines": { + "node": ">= 0.10.15", + "npm": ">= 1.3.5" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "dependencies": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + }, + "engines": { + "node": ">= 0.10.0", + "npm": ">= 1.3.5" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "dependencies": { + "agent-base": "^4.1.0", + "socks": "^1.1.10" + } + }, + "node_modules/npm/node_modules/sorted-object": { + "version": "2.0.1", + "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=" + }, + "node_modules/npm/node_modules/sorted-union-stream": { + "version": "2.1.3", + "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", + "dependencies": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + } + }, + "node_modules/npm/node_modules/sorted-union-stream/node_modules/from2": { + "version": "1.3.0", + "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "node_modules/npm/node_modules/sorted-union-stream/node_modules/from2/node_modules/readable-stream": { + "version": "1.1.14", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/npm/node_modules/sorted-union-stream/node_modules/from2/node_modules/readable-stream/node_modules/core-util-is": { + "version": "1.0.2", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/npm/node_modules/sorted-union-stream/node_modules/from2/node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/npm/node_modules/sorted-union-stream/node_modules/from2/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/npm/node_modules/sorted-union-stream/node_modules/stream-iterate": { + "version": "1.2.0", + "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", + "dependencies": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + } + }, + "node_modules/npm/node_modules/sorted-union-stream/node_modules/stream-iterate/node_modules/stream-shift": { + "version": "1.0.0", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "node_modules/npm/node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ssri": { + "version": "4.1.6", + "integrity": "sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "4.0.0", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "3.0.0", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/npm/node_modules/uid-number": { + "version": "0.0.6", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/umask": { + "version": "1.1.0", + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "1.1.0", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename/node_modules/unique-slug": { + "version": "2.0.0", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/npm/node_modules/unpipe": { + "version": "1.0.0", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/npm/node_modules/update-notifier": { + "version": "2.2.0", + "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", + "dependencies": { + "boxen": "^1.0.0", + "chalk": "^1.0.0", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen": { + "version": "1.1.0", + "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=", + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^1.1.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^0.1.0", + "widest-line": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/ansi-align": { + "version": "2.0.0", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/camelcase": { + "version": "4.1.0", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/cli-boxes": { + "version": "1.0.0", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/string-width": { + "version": "2.1.0", + "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size": { + "version": "0.1.1", + "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", + "dependencies": { + "execa": "^0.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size/node_modules/execa": { + "version": "0.4.0", + "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", + "dependencies": { + "cross-spawn-async": "^2.1.1", + "is-stream": "^1.1.0", + "npm-run-path": "^1.0.0", + "object-assign": "^4.0.1", + "path-key": "^1.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size/node_modules/execa/node_modules/cross-spawn-async": { + "version": "2.2.5", + "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", + "dependencies": { + "lru-cache": "^4.0.0", + "which": "^1.2.8" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size/node_modules/execa/node_modules/is-stream": { + "version": "1.1.0", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size/node_modules/execa/node_modules/npm-run-path": { + "version": "1.0.0", + "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", + "dependencies": { + "path-key": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size/node_modules/execa/node_modules/object-assign": { + "version": "4.1.1", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size/node_modules/execa/node_modules/path-key": { + "version": "1.0.0", + "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/term-size/node_modules/execa/node_modules/strip-eof": { + "version": "1.0.0", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/widest-line": { + "version": "1.0.0", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dependencies": { + "string-width": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/widest-line/node_modules/string-width": { + "version": "1.0.2", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/widest-line/node_modules/string-width/node_modules/code-point-at": { + "version": "1.1.0", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/widest-line/node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/widest-line/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan": { + "version": "1.0.1", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/widest-line/node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/boxen/node_modules/widest-line/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk": { + "version": "1.1.3", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk/node_modules/ansi-styles": { + "version": "2.2.1", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk/node_modules/has-ansi": { + "version": "2.0.0", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/configstore": { + "version": "3.1.0", + "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=", + "dependencies": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/configstore/node_modules/dot-prop": { + "version": "4.1.1", + "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/configstore/node_modules/dot-prop/node_modules/is-obj": { + "version": "1.0.1", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/configstore/node_modules/make-dir": { + "version": "1.0.0", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "dependencies": { + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/configstore/node_modules/make-dir/node_modules/pify": { + "version": "2.3.0", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/configstore/node_modules/unique-string": { + "version": "1.0.0", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/configstore/node_modules/unique-string/node_modules/crypto-random-string": { + "version": "1.0.0", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/import-lazy": { + "version": "2.1.0", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/is-npm": { + "version": "1.0.0", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version": { + "version": "3.1.0", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json": { + "version": "4.0.1", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got": { + "version": "6.7.1", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/create-error-class": { + "version": "3.0.2", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/create-error-class/node_modules/capture-stack-trace": { + "version": "1.0.0", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/duplexer3": { + "version": "0.1.4", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/is-redirect": { + "version": "1.0.0", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/is-retry-allowed": { + "version": "1.1.0", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/is-stream": { + "version": "1.1.0", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { + "version": "1.0.0", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/timed-out": { + "version": "4.0.1", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/unzip-response": { + "version": "2.0.1", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/url-parse-lax": { + "version": "1.0.0", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/url-parse-lax/node_modules/prepend-http": { + "version": "1.0.4", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url": { + "version": "3.1.0", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/semver-diff": { + "version": "2.1.0", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/update-notifier/node_modules/xdg-basedir": { + "version": "3.0.0", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/uuid": { + "version": "3.1.0", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.1", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dependencies": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-correct": { + "version": "1.0.2", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dependencies": { + "spdx-license-ids": "^1.0.2" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-correct/node_modules/spdx-license-ids": { + "version": "1.2.2", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "1.0.4", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "3.0.0", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name/node_modules/builtins": { + "version": "1.0.3", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "node_modules/npm/node_modules/which": { + "version": "1.2.14", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "2.0.0", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/npm/node_modules/worker-farm": { + "version": "1.3.1", + "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=", + "dependencies": { + "errno": ">=0.1.1 <0.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/npm/node_modules/worker-farm/node_modules/errno": { + "version": "0.1.4", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dependencies": { + "prr": "~0.0.0" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/npm/node_modules/worker-farm/node_modules/errno/node_modules/prr": { + "version": "0.0.0", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + }, + "node_modules/npm/node_modules/worker-farm/node_modules/xtend": { + "version": "4.0.1", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "2.1.0", + "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "node_modules/npm/node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "node_modules/npmi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npmi/-/npmi-1.0.1.tgz", + "integrity": "sha1-FddpJzVHVF5oCdzwzhiu1IsCkOI=", + "dependencies": { + "npm": "^2.1.12", + "semver": "^4.1.0" + } + }, + "node_modules/npmi/node_modules/ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/npmi/node_modules/assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npmi/node_modules/aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npmi/node_modules/builtins": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", + "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=" + }, + "node_modules/npmi/node_modules/form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/npmi/node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/npmi/node_modules/har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npmi/node_modules/har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dependencies": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npmi/node_modules/http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dependencies": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/npmi/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/npmi/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/npmi/node_modules/node-gyp": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.3.tgz", + "integrity": "sha512-7789TDMqJpv5iHxn1cAESCBEC/sBHAFxAvgXAcvzWenEWl0qf6E2Kk/Xwdl5ZclktUJzxJPVa27OMkBvaHKqCQ==", + "dependencies": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": ">=2.9.0 <2.82.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/npmi/node_modules/node-gyp/node_modules/semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npmi/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npmi/node_modules/npm": { + "version": "2.15.12", + "resolved": "https://registry.npmjs.org/npm/-/npm-2.15.12.tgz", + "integrity": "sha1-33w+1aJ3w/nUtdgZsFMR0QogCuY=", + "dependencies": { + "abbrev": "~1.0.9", + "ansi": "~0.3.1", + "ansi-regex": "*", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "archy": "~1.0.0", + "async-some": "~1.0.2", + "block-stream": "0.0.9", + "char-spinner": "~1.0.1", + "chmodr": "~1.0.2", + "chownr": "~1.0.1", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.10", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "fs-vacuum": "~1.2.9", + "fs-write-stream-atomic": "~1.0.8", + "fstream": "~1.0.10", + "fstream-npm": "~1.1.1", + "github-url-from-git": "~1.4.0", + "github-url-from-username-repo": "~1.0.2", + "glob": "~7.0.6", + "graceful-fs": "~4.1.6", + "hosted-git-info": "~2.1.5", + "imurmurhash": "*", + "inflight": "~1.0.4", + "inherits": "~2.0.3", + "ini": "~1.3.4", + "init-package-json": "~1.9.4", + "lockfile": "~1.0.1", + "lru-cache": "~4.0.1", + "minimatch": "~3.0.3", + "mkdirp": "~0.5.1", + "node-gyp": "~3.6.0", + "nopt": "~3.0.6", + "normalize-git-url": "~3.0.2", + "normalize-package-data": "~2.3.5", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~1.0.7", + "npm-package-arg": "~4.1.0", + "npm-registry-client": "~7.2.1", + "npm-user-validate": "~0.1.5", + "npmlog": "~2.0.4", + "once": "~1.4.0", + "opener": "~1.4.1", + "osenv": "~0.1.3", + "path-is-inside": "~1.0.0", + "read": "~1.0.7", + "read-installed": "~4.0.3", + "read-package-json": "~2.0.4", + "readable-stream": "~2.1.5", + "realize-package-specifier": "~3.0.1", + "request": "~2.74.0", + "retry": "~0.10.0", + "rimraf": "~2.5.4", + "semver": "~5.1.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.0", + "spdx-license-ids": "~1.2.2", + "strip-ansi": "~3.0.1", + "tar": "~2.2.1", + "text-table": "~0.2.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "validate-npm-package-license": "~3.0.1", + "validate-npm-package-name": "~2.2.2", + "which": "~1.2.11", + "wrappy": "~1.0.2", + "write-file-atomic": "~1.1.4" + }, + "bin": { + "npm": "bin/npm-cli.js" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" + }, + "node_modules/npmi/node_modules/npm/node_modules/ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "node_modules/npmi/node_modules/npm/node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/async-some": { + "version": "1.0.2", + "integrity": "sha1-TYqBYg1ZWHkbW5j4AtMgd3bpVQk=", + "dependencies": { + "dezalgo": "^1.0.2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/char-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", + "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/chmodr": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-1.0.2.tgz", + "integrity": "sha1-BGYrky0PAuxm3qorDqQoEZaOPrk=" + }, + "node_modules/npmi/node_modules/npm/node_modules/chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/cmd-shim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", + "dependencies": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dependencies": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/columnify/node_modules/wcwidth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz", + "integrity": "sha1-AtBZ/3qPx0Hg9rXaHmmytA2uym8=", + "dependencies": { + "defaults": "^1.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/config-chain": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.10.tgz", + "integrity": "sha1-f8OD3g/MhNcRy0Zb0XZXnK1hI0Y=", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/config-chain/node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "node_modules/npmi/node_modules/npm/node_modules/dezalgo": { + "version": "1.0.3", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/dezalgo/node_modules/asap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.3.tgz", + "integrity": "sha1-H8HRVk7hFiDfym1nAphQkT+fRnk=" + }, + "node_modules/npmi/node_modules/npm/node_modules/editor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=" + }, + "node_modules/npmi/node_modules/npm/node_modules/fs-vacuum": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.9.tgz", + "integrity": "sha1-T5AZOrjqAokJlbzU6ARlml02ay0=", + "dependencies": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/fs-write-stream-atomic": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.8.tgz", + "integrity": "sha1-5Jqt3yiPh9Rv+eiC8hahOrxAd4s=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/fstream-npm": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fstream-npm/-/fstream-npm-1.1.1.tgz", + "integrity": "sha1-a5F122I5qD2CCeIyQmxJTbspaQw=", + "dependencies": { + "fstream-ignore": "^1.0.0", + "inherits": "2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/fstream-npm/node_modules/fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dependencies": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/github-url-from-git": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.4.0.tgz", + "integrity": "sha1-KF5rUggZABveEoZ0cEN55P8D4N4=" + }, + "node_modules/npmi/node_modules/npm/node_modules/github-url-from-username-repo": { + "version": "1.0.2", + "integrity": "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo=" + }, + "node_modules/npmi/node_modules/npm/node_modules/glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/glob/node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/npmi/node_modules/npm/node_modules/glob/node_modules/path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/hosted-git-info": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", + "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=" + }, + "node_modules/npmi/node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/inflight": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", + "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/npmi/node_modules/npm/node_modules/ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/init-package-json": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.9.4.tgz", + "integrity": "sha1-tAU9C0Dwz4QqQZZpN8s9wPU06FY=", + "dependencies": { + "glob": "^6.0.0", + "npm-package-arg": "^4.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": "^2.0.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/init-package-json/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/init-package-json/node_modules/glob/node_modules/path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/init-package-json/node_modules/promzard": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "dependencies": { + "read": "1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/lockfile": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.1.tgz", + "integrity": "sha1-nTU+z+P1TRULtX+J1RdGk1o5xPU=" + }, + "node_modules/npmi/node_modules/npm/node_modules/lru-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", + "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", + "dependencies": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/lru-cache/node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/npmi/node_modules/npm/node_modules/lru-cache/node_modules/yallist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", + "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=" + }, + "node_modules/npmi/node_modules/npm/node_modules/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/nopt": { + "version": "3.0.6", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/normalize-git-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-git-url/-/normalize-git-url-3.0.2.tgz", + "integrity": "sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q=" + }, + "node_modules/npmi/node_modules/npm/node_modules/normalize-package-data": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", + "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", + "dependencies": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/normalize-package-data/node_modules/is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dependencies": { + "builtin-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/normalize-package-data/node_modules/is-builtin-module/node_modules/builtin-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.0.tgz", + "integrity": "sha1-EFOVX9mUpXRuUl5Kxxe4HK8HSRw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-cache-filename": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz", + "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-install-checks": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-1.0.7.tgz", + "integrity": "sha1-bZGu2grJaAHx7Xqt7hFqbAoIalc=", + "dependencies": { + "npmlog": "0.1 || 1 || 2", + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-package-arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-4.1.0.tgz", + "integrity": "sha1-LgFfisAHN8uX+ZfJy/BZ9Cp0Un0=", + "dependencies": { + "hosted-git-info": "^2.1.4", + "semver": "4 || 5" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.2.1.tgz", + "integrity": "sha1-x5ImawiMwxP4Ul5+NSSGJscj23U=", + "dependencies": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0", + "npmlog": "~2.0.0 || ~3.1.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/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=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-registry-client/node_modules/retry": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.0.tgz", + "integrity": "sha1-ZJ4VykCEItmDGBYZNef31lLUNd0=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npm-user-validate": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-0.1.5.tgz", + "integrity": "sha1-UkZdUMLSApSlcSW5lrrtv1bFAEs=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "dependencies": { + "ansi": "~0.3.1", + "are-we-there-yet": "~1.1.2", + "gauge": "~1.2.5" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", + "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "dependencies": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz", + "integrity": "sha1-o82Wwwe6QdVZxaLuQIwSoRxMLsM=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash._baseslice": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash._baseslice/-/lodash._baseslice-4.0.0.tgz", + "integrity": "sha1-9c4d+YKUjsr/Y/IjhTQVt7l2NwQ=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash._basetostring": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", + "integrity": "sha1-kyfJ3FFYhmt/pLnUL0Y45XZt2d8=" + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.pad": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.4.0.tgz", + "integrity": "sha1-+qON8mwKaexQhqgiRslY4VDcsas=", + "dependencies": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.padend": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.5.0.tgz", + "integrity": "sha1-oonpN37i5t6Lp/EfOo6zJgcLdhk=", + "dependencies": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.padstart": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.5.0.tgz", + "integrity": "sha1-PqGQ9nNIQcM2TSedEeBWcmtgp5o=", + "dependencies": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.tostring": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.4.tgz", + "integrity": "sha1-Vgwn0fjq3eA8LM4Zj+9cAx2CmPs=" + }, + "node_modules/npmi/node_modules/npm/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/opener": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.1.tgz", + "integrity": "sha1-iXWQrNGu0zEbcDtYvMtNQ/VvKJU=", + "bin": { + "opener": "opener.js" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/osenv": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz", + "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/osenv/node_modules/os-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.0.tgz", + "integrity": "sha1-43B4vGG1hpBjBTiXJX457BJhtwI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/osenv/node_modules/os-tmpdir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", + "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-installed": { + "version": "4.0.3", + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", + "dependencies": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-installed/node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-installed/node_modules/readdir-scoped-modules": { + "version": "1.0.2", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-installed/node_modules/util-extend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.1.tgz", + "integrity": "sha1-u3A7eUgCk93Nz7PGqf6iD0g0Fbw=" + }, + "node_modules/npmi/node_modules/npm/node_modules/read-package-json": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.4.tgz", + "integrity": "sha1-Ye0bIlbqQ42ACIlQkL6EuOeZyFM=", + "dependencies": { + "glob": "^6.0.0", + "graceful-fs": "^4.1.2", + "json-parse-helpfulerror": "^1.0.2", + "normalize-package-data": "^2.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-package-json/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-package-json/node_modules/glob/node_modules/path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-package-json/node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "dependencies": { + "jju": "^1.1.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/read-package-json/node_modules/json-parse-helpfulerror/node_modules/jju": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", + "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" + }, + "node_modules/npmi/node_modules/npm/node_modules/read/node_modules/mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + }, + "node_modules/npmi/node_modules/npm/node_modules/readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "dependencies": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/readable-stream/node_modules/buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "node_modules/npmi/node_modules/npm/node_modules/readable-stream/node_modules/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=" + }, + "node_modules/npmi/node_modules/npm/node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "node_modules/npmi/node_modules/npm/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/npmi/node_modules/npm/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/npmi/node_modules/npm/node_modules/realize-package-specifier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/realize-package-specifier/-/realize-package-specifier-3.0.1.tgz", + "integrity": "sha1-/eMukmRI44+ZM02Vt7CNUeOpjZ8=", + "dependencies": { + "dezalgo": "^1.0.1", + "npm-package-arg": "^4.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request": { + "version": "2.74.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", + "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", + "dependencies": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc4", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/aws4": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz", + "integrity": "sha1-/efVKSRm0jDl7g9OA42d+qsI/GE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/bl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "dependencies": { + "readable-stream": "~2.0.5" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/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=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/form-data": { + "version": "1.0.0-rc4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", + "dependencies": { + "async": "^1.5.2", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.10" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/form-data/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dependencies": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + }, + "bin": { + "har-validator": "bin/har-validator" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dependencies": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/hawk/node_modules/boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dependencies": { + "boom": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/hawk/node_modules/hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/hawk/node_modules/sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dependencies": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", + "integrity": "sha1-zi4b74NSBLTzCZkoxgL4tq5hVlA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "extsprintf": "1.0.2", + "json-schema": "0.2.2", + "verror": "1.3.6" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", + "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "extsprintf": "1.0.2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/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=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/mime-types": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", + "dependencies": { + "mime-db": "~1.23.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/node-uuid": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/qs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", + "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/tough-cookie": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz", + "integrity": "sha1-mcd9+7fYBCSeiimdTLD9gf7wg/0=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/request/node_modules/tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/retry": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.0.tgz", + "integrity": "sha1-ZJ4VykCEItmDGBYZNef31lLUNd0=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/rimraf": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/sha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", + "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", + "dependencies": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/sha/node_modules/readable-stream": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", + "integrity": "sha1-vsgb6ujPRVFovC5bKzH1vPrtmxs=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.0", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/core-util-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=" + }, + "node_modules/npmi/node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/npmi/node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz", + "integrity": "sha1-4nLu2CXV6fTqdNjXOx/jEcO+tjA=" + }, + "node_modules/npmi/node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/npmi/node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz", + "integrity": "sha1-NVaj0TxMaqeYPX4kJUeBlxmbeIE=" + }, + "node_modules/npmi/node_modules/npm/node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/sorted-object": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.0.tgz", + "integrity": "sha1-HP6pgWCQR9gEOAekkKnZmzF/r38=" + }, + "node_modules/npmi/node_modules/npm/node_modules/spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "node_modules/npmi/node_modules/npm/node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/umask": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" + }, + "node_modules/npmi/node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dependencies": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dependencies": { + "spdx-license-ids": "^1.0.2" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", + "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", + "dependencies": { + "spdx-exceptions": "^1.0.4", + "spdx-license-ids": "^1.0.0" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/node_modules/spdx-exceptions": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", + "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=" + }, + "node_modules/npmi/node_modules/npm/node_modules/validate-npm-package-name": { + "version": "2.2.2", + "integrity": "sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU=", + "dependencies": { + "builtins": "0.0.7" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/which": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", + "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", + "dependencies": { + "isexe": "^1.1.1" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npmi/node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=" + }, + "node_modules/npmi/node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/npmi/node_modules/npm/node_modules/write-file-atomic": { + "version": "1.1.4", + "integrity": "sha1-sfUtwujcDjywTRh6JfdYo4qQyjs=", + "dependencies": { + "graceful-fs": "^4.1.2", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "node_modules/npmi/node_modules/oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "engines": { + "node": "*" + } + }, + "node_modules/npmi/node_modules/performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "node_modules/npmi/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/npmi/node_modules/qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/npmi/node_modules/request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dependencies": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npmi/node_modules/semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npmi/node_modules/tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "node_modules/npmi/node_modules/tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha1-IoVjHzSpXw0Dlc2QDJbtObWPNG4=", + "optional": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha1-PFsNtnbV+X2hIz0e1C0YK8WifS0=", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "optional": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/package-json/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/package-json/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/package-json/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pacote": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.11.tgz", + "integrity": "sha512-r6PHtCEhkaGv+QPx1JdE/xRdkSkZUG7dE2oloNk/CGTPGNOtaJyYqZPFeN6d6UcUrTPRvZXFo3IBzJIBopPuSA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.3.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^8.1.3", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.3", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.1" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pacote/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pacote/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "optional": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.1.tgz", + "integrity": "sha1-mNjx0DC/BL167uShulSF1AMY/Yk=" + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/plantuml-encoder": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/plantuml-encoder/-/plantuml-encoder-1.4.0.tgz", + "integrity": "sha512-sxMwpDw/ySY1WB2CE3+IdMuEcWibJ72DDOsXLkSmEaSzwEUaYBT6DWgOfBiHGCux4q433X6+OEFWjlVqp7gL6g==" + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "optional": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "optional": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dependencies": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/promised-handlebars": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promised-handlebars/-/promised-handlebars-1.0.6.tgz", + "integrity": "sha1-2ZfglDsD9j/oL/I8uQSyes/AUNg=", + "dependencies": { + "deep-aplus": "^1.0.2", + "q": "^1.4.1" + } + }, + "node_modules/prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "optional": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.3.0.tgz", + "integrity": "sha512-23zNqRltZ1PPoK28uRefWJ/zKb5Jhnzbbwbpcna2o5+QMn17F0khq5s1bdH3vPlyj+J36pubccR8wiNA/VE0Vw==", + "dependencies": { + "debug": "^4.1.0", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/puppeteer/node_modules/bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/puppeteer/node_modules/bl/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/puppeteer/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/puppeteer/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/puppeteer/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/puppeteer/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/puppeteer/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/puppeteer/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/puppeteer/node_modules/tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/puppeteer/node_modules/tar-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", + "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", + "dependencies": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", + "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/q-deep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/q-deep/-/q-deep-1.0.3.tgz", + "integrity": "sha1-zQcD2irMuuZXDmAMaKVt5mEHkMs=", + "dependencies": { + "deep-aplus": "^1.0.1", + "q": "^1.1.2" + } + }, + "node_modules/q-plus": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/q-plus/-/q-plus-0.0.8.tgz", + "integrity": "sha1-TMZssZvRRbQ+nhtUAjYUI3e2Hqs=", + "dependencies": { + "q": "^1.1.2" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=", + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-config-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-3.0.0.tgz", + "integrity": "sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "js-yaml": "^3.12.0", + "json5": "^2.1.1", + "require-from-string": "^2.0.2" + } + }, + "node_modules/rc-config-loader/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/rc-config-loader/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/rc/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-installed": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "node_modules/read-package-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", + "dev": true, + "dependencies": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/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==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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=" + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz", + "integrity": "sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg==", + "dependencies": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-core/node_modules/lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dev": true, + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/resolve": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", + "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-alpn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", + "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "node_modules/responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "engines": { + "node": "*" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "devOptional": true + }, + "node_modules/semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", + "dev": true + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/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=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" + }, + "node_modules/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==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/socks": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.4.1.tgz", + "integrity": "sha512-8mWHeYC1OA0500qzb+sqwm0Hzi8oBpeuI1JugoBVMEJtJvxSgco8xFSK+NRnZcHeeWjTbF82KUDo5sXH22TY5A==", + "dev": true, + "dependencies": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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==", + "dependencies": { + "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" + } + }, + "node_modules/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=" + }, + "node_modules/spawn-please": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-0.3.0.tgz", + "integrity": "sha1-2zOOxM/2Orxp8dDgjO6euL69nRE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-shell": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spawn-shell/-/spawn-shell-2.1.0.tgz", + "integrity": "sha512-mjlYAQbZPHd4YsoHEe+i0Xbp9sJefMKN09JPp80TqrjC5NSuo+y1RG3NBireJlzl1dDV2NIkIfgS6coXtyqN/A==", + "dev": true, + "dependencies": { + "default-shell": "^1.0.1", + "merge-options": "~1.0.1", + "npm-run-path": "^2.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/spdx-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", + "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.2", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "node_modules/spdx-ranges": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", + "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", + "dev": true + }, + "node_modules/spdx-satisfies": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz", + "integrity": "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==", + "dev": true, + "dependencies": { + "spdx-compare": "^1.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "dependencies": { + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stack-chain": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz", + "integrity": "sha1-1z0Rcq+JVl8HQ4tbzAhoMbZomy0=", + "optional": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "node_modules/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==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-equal": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/stream-equal/-/stream-equal-0.1.13.tgz", + "integrity": "sha1-F8LXz43lVw0P+5njpRQqWMdrxK4=", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "node_modules/stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=" + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgexport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/svgexport/-/svgexport-0.4.1.tgz", + "integrity": "sha512-qRQuxZA6gT34xMs+9m/BGVlxFxQ1ftLi1HB1gUiOGYrp/Jm6whhTZEmYchQFy+wHKGdkyLB93w5MXoEcNtbcNg==", + "dependencies": { + "async": "^3.2.0", + "puppeteer": "^3.0.2" + }, + "bin": { + "svgexport": "bin/index.js" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "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" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha1-QwY30ki6d+B4iDlR+5qg7tfGP6I=", + "optional": true + }, + "node_modules/tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dependencies": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/tar-fs/node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/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==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "optional": true + }, + "node_modules/trace": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/trace/-/trace-3.1.1.tgz", + "integrity": "sha1-Bh7r8BKAVhHLAhOEQLxxaXmw6xE=", + "optional": true, + "dependencies": { + "stack-chain": "^2.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trace-and-clarify-if-possible": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trace-and-clarify-if-possible/-/trace-and-clarify-if-possible-1.0.5.tgz", + "integrity": "sha1-b62AJfacRHbqdNmsYZhE8fEFE7s=", + "optionalDependencies": { + "clarify": "^2.1.0", + "trace": "^3.1.1" + } + }, + "node_modules/treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unix-crypt-td-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util-extend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "node_modules/util.promisify/node_modules/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==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/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=", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "optional": true + }, + "node_modules/websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha1-otTg1PTxFvHmKX66WLBdQwEA6fk=", + "dependencies": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "optional": true, + "dependencies": { + "tr46": "~0.0.1" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "optional": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.3.tgz", + "integrity": "sha512-xI32EGCq5mJiSCsQaEPLljD+R3Hq/VG08YGoLTOqu/gHAtCa2S4qPMG20ol4TpKWgSU7j3KMZHvSirNPK0DSjA==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", + "flat": "^4.1.0", + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/yargs-unparser/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/yargs-unparser/node_modules/yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.10.4", @@ -482,7 +15816,8 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "devOptional": true }, "asn1": { "version": "0.2.4", @@ -5566,7 +20901,6 @@ "resolved": "https://registry.npmjs.org/npm/-/npm-5.1.0.tgz", "integrity": "sha512-pt5ClxEmY/dLpb60SmGQQBKi3nB6Ljx1FXmpoCUdAULlGqGVn2uCyXxPCWFbcuHGthT7qGiaGa1wOfs/UjGYMw==", "requires": { - "JSONStream": "~1.3.1", "abbrev": "~1.1.0", "ansi-regex": "~3.0.0", "ansicolors": "~0.3.2", @@ -5598,6 +20932,7 @@ "inherits": "~2.0.3", "ini": "~1.3.4", "init-package-json": "~1.10.1", + "JSONStream": "~1.3.1", "lazy-property": "~1.0.0", "lockfile": "~1.0.3", "lodash._baseindexof": "*", @@ -5664,30 +20999,8 @@ "write-file-atomic": "~2.1.0" }, "dependencies": { - "JSONStream": { - "version": "1.3.1", - "resolved": false, - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "dependencies": { - "jsonparse": { - "version": "1.3.1", - "resolved": false, - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "through": { - "version": "2.3.8", - "resolved": false, - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - } - } - }, "abbrev": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" }, "agent-base": { @@ -5708,37 +21021,30 @@ }, "ansi-regex": { "version": "3.0.0", - "resolved": false, "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansicolors": { "version": "0.3.2", - "resolved": false, "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" }, "ansistyles": { "version": "0.1.3", - "resolved": false, "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" }, "aproba": { "version": "1.1.2", - "resolved": false, "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==" }, "archy": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, "bluebird": { "version": "3.5.0", - "resolved": false, "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "cacache": { "version": "9.2.9", - "resolved": false, "integrity": "sha512-ghg1j5OyTJ6qsrqU++dN23QiTDxb5AZCFGsF3oB+v9v/gY+F4X8L/0gdQMEjd+8Ot3D29M2etX5PKozHRn2JQw==", "requires": { "bluebird": "^3.5.0", @@ -5758,17 +21064,14 @@ }, "call-limit": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-b9YbA/PaQqLNDsK2DwK9DnGZH+o=" }, "chownr": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "cmd-shim": { "version": "2.0.2", - "resolved": false, "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", "requires": { "graceful-fs": "^4.1.2", @@ -5777,7 +21080,6 @@ }, "columnify": { "version": "1.5.4", - "resolved": false, "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "requires": { "strip-ansi": "^3.0.0", @@ -5786,7 +21088,6 @@ "dependencies": { "strip-ansi": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -5794,14 +21095,12 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "wcwidth": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "requires": { "defaults": "^1.0.3" @@ -5809,7 +21108,6 @@ "dependencies": { "defaults": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "requires": { "clone": "^1.0.2" @@ -5817,7 +21115,6 @@ "dependencies": { "clone": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" } } @@ -5828,7 +21125,6 @@ }, "config-chain": { "version": "1.1.11", - "resolved": false, "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "requires": { "ini": "^1.3.4", @@ -5837,7 +21133,6 @@ "dependencies": { "proto-list": { "version": "1.2.4", - "resolved": false, "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" } } @@ -5852,17 +21147,14 @@ }, "debuglog": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" }, "detect-indent": { "version": "5.0.0", - "resolved": false, "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" }, "dezalgo": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { "asap": "^2.0.0", @@ -5871,19 +21163,16 @@ "dependencies": { "asap": { "version": "2.0.5", - "resolved": false, "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" } } }, "editor": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=" }, "fs-vacuum": { "version": "1.2.10", - "resolved": false, "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", "requires": { "graceful-fs": "^4.1.2", @@ -5893,7 +21182,6 @@ }, "fs-write-stream-atomic": { "version": "1.0.10", - "resolved": false, "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { "graceful-fs": "^4.1.2", @@ -5904,7 +21192,6 @@ }, "fstream-npm": { "version": "1.2.1", - "resolved": false, "integrity": "sha512-iBHpm/LmD1qw0TlHMAqVd9rwdU6M+EHRUnPkXpRi5G/Hf0FIFH+oZFryodAU2MFNfGRh/CzhUFlMKV3pdeOTDw==", "requires": { "fstream-ignore": "^1.0.0", @@ -5913,7 +21200,6 @@ "dependencies": { "fstream-ignore": { "version": "1.0.5", - "resolved": false, "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "requires": { "fstream": "^1.0.0", @@ -5923,7 +21209,6 @@ "dependencies": { "minimatch": { "version": "3.0.4", - "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -5931,7 +21216,6 @@ "dependencies": { "brace-expansion": { "version": "1.1.8", - "resolved": false, "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "^1.0.0", @@ -5940,12 +21224,10 @@ "dependencies": { "balanced-match": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "concat-map": { "version": "0.0.1", - "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -5958,7 +21240,6 @@ }, "glob": { "version": "7.1.2", - "resolved": false, "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "^1.0.0", @@ -5971,12 +21252,10 @@ "dependencies": { "fs.realpath": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "minimatch": { "version": "3.0.4", - "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -5984,7 +21263,6 @@ "dependencies": { "brace-expansion": { "version": "1.1.8", - "resolved": false, "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "^1.0.0", @@ -5993,12 +21271,10 @@ "dependencies": { "balanced-match": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "concat-map": { "version": "0.0.1", - "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -6007,24 +21283,20 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" } } }, "graceful-fs": { "version": "4.1.11", - "resolved": false, "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "has-unicode": { "version": "2.0.1", - "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "hosted-git-info": { "version": "2.5.0", - "resolved": false, "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" }, "http-cache-semantics": { @@ -6052,17 +21324,14 @@ }, "iferr": { "version": "0.1.5", - "resolved": false, "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "imurmurhash": { "version": "0.1.4", - "resolved": false, "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", - "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", @@ -6071,17 +21340,14 @@ }, "inherits": { "version": "2.0.3", - "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", - "resolved": false, "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, "init-package-json": { "version": "1.10.1", - "resolved": false, "integrity": "sha1-zYc6FneWvvuZYSsodioLY5P9j2o=", "requires": { "glob": "^7.1.1", @@ -6096,7 +21362,6 @@ "dependencies": { "promzard": { "version": "0.3.0", - "resolved": false, "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "requires": { "read": "1" @@ -6104,24 +21369,38 @@ } } }, + "JSONStream": { + "version": "1.3.1", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "dependencies": { + "jsonparse": { + "version": "1.3.1", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "through": { + "version": "2.3.8", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + } + } + }, "lazy-property": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=" }, "lockfile": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=" }, "lodash._baseindexof": { "version": "3.1.0", - "resolved": false, "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=" }, "lodash._baseuniq": { "version": "4.6.0", - "resolved": false, "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "requires": { "lodash._createset": "~4.0.0", @@ -6130,29 +21409,24 @@ "dependencies": { "lodash._createset": { "version": "4.0.3", - "resolved": false, "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=" }, "lodash._root": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" } } }, "lodash._bindcallback": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" }, "lodash._cacheindexof": { "version": "3.0.2", - "resolved": false, "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=" }, "lodash._createcache": { "version": "3.1.2", - "resolved": false, "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "requires": { "lodash._getnative": "^3.0.0" @@ -6160,37 +21434,30 @@ }, "lodash._getnative": { "version": "3.9.1", - "resolved": false, "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, "lodash.clonedeep": { "version": "4.5.0", - "resolved": false, "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, "lodash.restparam": { "version": "3.6.1", - "resolved": false, "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" }, "lodash.union": { "version": "4.6.0", - "resolved": false, "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, "lodash.uniq": { "version": "4.5.0", - "resolved": false, "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "lodash.without": { "version": "4.4.0", - "resolved": false, "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=" }, "lru-cache": { "version": "4.1.1", - "resolved": false, "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "requires": { "pseudomap": "^1.0.2", @@ -6199,12 +21466,10 @@ "dependencies": { "pseudomap": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "yallist": { "version": "2.1.2", - "resolved": false, "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } @@ -6316,7 +21581,6 @@ }, "mississippi": { "version": "1.3.0", - "resolved": false, "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", "requires": { "concat-stream": "^1.5.0", @@ -6333,7 +21597,6 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "resolved": false, "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", @@ -6343,14 +21606,12 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "resolved": false, "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } }, "duplexify": { "version": "3.5.0", - "resolved": false, "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", "requires": { "end-of-stream": "1.0.0", @@ -6361,7 +21622,6 @@ "dependencies": { "end-of-stream": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", "requires": { "once": "~1.3.0" @@ -6369,7 +21629,6 @@ "dependencies": { "once": { "version": "1.3.3", - "resolved": false, "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" @@ -6379,14 +21638,12 @@ }, "stream-shift": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "end-of-stream": { "version": "1.4.0", - "resolved": false, "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", "requires": { "once": "^1.4.0" @@ -6394,7 +21651,6 @@ }, "flush-write-stream": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", "requires": { "inherits": "^2.0.1", @@ -6403,7 +21659,6 @@ }, "from2": { "version": "2.3.0", - "resolved": false, "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", @@ -6412,7 +21667,6 @@ }, "parallel-transform": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { "cyclist": "~0.2.2", @@ -6422,14 +21676,12 @@ "dependencies": { "cyclist": { "version": "0.2.2", - "resolved": false, "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" } } }, "pump": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { "end-of-stream": "^1.1.0", @@ -6438,7 +21690,6 @@ }, "pumpify": { "version": "1.3.5", - "resolved": false, "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", "requires": { "duplexify": "^3.1.2", @@ -6448,7 +21699,6 @@ }, "stream-each": { "version": "1.2.0", - "resolved": false, "integrity": "sha1-HpXUdXP1gNgU3A/4zQ9m8c5TyZE=", "requires": { "end-of-stream": "^1.1.0", @@ -6457,14 +21707,12 @@ "dependencies": { "stream-shift": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "through2": { "version": "2.0.3", - "resolved": false, "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { "readable-stream": "^2.1.5", @@ -6473,7 +21721,6 @@ "dependencies": { "xtend": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } @@ -6490,7 +21737,6 @@ }, "move-concurrently": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { "aproba": "^1.1.1", @@ -6503,7 +21749,6 @@ "dependencies": { "run-queue": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { "aproba": "^1.1.1" @@ -6533,7 +21778,6 @@ "dependencies": { "nopt": { "version": "3.0.6", - "resolved": false, "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" @@ -6543,7 +21787,6 @@ }, "nopt": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { "abbrev": "1", @@ -6552,7 +21795,6 @@ }, "normalize-package-data": { "version": "2.4.0", - "resolved": false, "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { "hosted-git-info": "^2.1.4", @@ -6563,7 +21805,6 @@ "dependencies": { "is-builtin-module": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -6571,7 +21812,6 @@ "dependencies": { "builtin-modules": { "version": "1.1.1", - "resolved": false, "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" } } @@ -6580,12 +21820,10 @@ }, "npm-cache-filename": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=" }, "npm-install-checks": { "version": "3.0.0", - "resolved": false, "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" @@ -6593,7 +21831,6 @@ }, "npm-package-arg": { "version": "5.1.2", - "resolved": false, "integrity": "sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==", "requires": { "hosted-git-info": "^2.4.2", @@ -6604,7 +21841,6 @@ }, "npm-registry-client": { "version": "8.4.0", - "resolved": false, "integrity": "sha512-PVNfqq0lyRdFnE//nDmn3CC9uqTsr8Bya9KPLIevlXMfkP0m4RpCVyFFk0W1Gfx436kKwyhLA6J+lV+rgR81gQ==", "requires": { "concat-stream": "^1.5.2", @@ -6622,7 +21858,6 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "resolved": false, "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", @@ -6632,7 +21867,6 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "resolved": false, "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } @@ -6641,12 +21875,10 @@ }, "npm-user-validate": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE=" }, "npmlog": { "version": "4.1.2", - "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { "are-we-there-yet": "~1.1.2", @@ -6657,7 +21889,6 @@ "dependencies": { "are-we-there-yet": { "version": "1.1.4", - "resolved": false, "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { "delegates": "^1.0.0", @@ -6666,19 +21897,16 @@ "dependencies": { "delegates": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" } } }, "console-control-strings": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "gauge": { "version": "2.7.4", - "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", @@ -6693,17 +21921,14 @@ "dependencies": { "object-assign": { "version": "4.1.1", - "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "signal-exit": { "version": "3.0.2", - "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "string-width": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -6713,12 +21938,10 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -6726,7 +21949,6 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -6735,7 +21957,6 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -6743,14 +21964,12 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "wide-align": { "version": "1.1.2", - "resolved": false, "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { "string-width": "^1.0.2" @@ -6760,14 +21979,12 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" } } }, "once": { "version": "1.4.0", - "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" @@ -6775,12 +21992,10 @@ }, "opener": { "version": "1.4.3", - "resolved": false, "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=" }, "osenv": { "version": "0.1.4", - "resolved": false, "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "requires": { "os-homedir": "^1.0.0", @@ -6789,19 +22004,16 @@ "dependencies": { "os-homedir": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" } } }, "pacote": { "version": "2.7.38", - "resolved": false, "integrity": "sha512-XxHUyHQB7QCVBxoXeVu0yKxT+2PvJucsc0+1E+6f95lMUxEAYERgSAc71ckYXrYr35Ew3xFU/LrhdIK21GQFFA==", "requires": { "bluebird": "^3.5.0", @@ -6829,7 +22041,6 @@ "dependencies": { "minimatch": { "version": "3.0.4", - "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -6837,7 +22048,6 @@ "dependencies": { "brace-expansion": { "version": "1.1.8", - "resolved": false, "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "^1.0.0", @@ -6846,12 +22056,10 @@ "dependencies": { "balanced-match": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "concat-map": { "version": "0.0.1", - "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -6860,7 +22068,6 @@ }, "npm-pick-manifest": { "version": "1.0.4", - "resolved": false, "integrity": "sha512-MKxNdeyOZysPRTTbHtW0M5Fw38Jo/3ARsoGw5qjCfS+XGjvNB/Gb4qtAZUFmKPM2mVum+eX559eHvKywU856BQ==", "requires": { "npm-package-arg": "^5.1.2", @@ -6869,7 +22076,6 @@ }, "promise-retry": { "version": "1.1.1", - "resolved": false, "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "requires": { "err-code": "^1.0.0", @@ -6878,14 +22084,12 @@ "dependencies": { "err-code": { "version": "1.1.2", - "resolved": false, "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" } } }, "protoduck": { "version": "4.0.0", - "resolved": false, "integrity": "sha1-/kh02MeRM2bP2erRJFOiLNNlf44=", "requires": { "genfun": "^4.0.1" @@ -6893,14 +22097,12 @@ "dependencies": { "genfun": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=" } } }, "tar-stream": { "version": "1.5.4", - "resolved": false, "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", "requires": { "bl": "^1.0.0", @@ -6911,7 +22113,6 @@ "dependencies": { "bl": { "version": "1.2.1", - "resolved": false, "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "requires": { "readable-stream": "^2.0.5" @@ -6919,7 +22120,6 @@ }, "end-of-stream": { "version": "1.4.0", - "resolved": false, "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", "requires": { "once": "^1.4.0" @@ -6927,7 +22127,6 @@ }, "xtend": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } @@ -6936,12 +22135,10 @@ }, "path-is-inside": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "promise-inflight": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "pump": { @@ -6955,7 +22152,6 @@ }, "read": { "version": "1.0.7", - "resolved": false, "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "requires": { "mute-stream": "~0.0.4" @@ -6963,14 +22159,12 @@ "dependencies": { "mute-stream": { "version": "0.0.7", - "resolved": false, "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" } } }, "read-cmd-shim": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", "requires": { "graceful-fs": "^4.1.2" @@ -6978,7 +22172,6 @@ }, "read-installed": { "version": "4.0.3", - "resolved": false, "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { "debuglog": "^1.0.1", @@ -6992,14 +22185,12 @@ "dependencies": { "util-extend": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" } } }, "read-package-json": { "version": "2.0.9", - "resolved": false, "integrity": "sha512-vuV8p921IgyelL4UOKv3FsRuRZSaRn30HanLAOKargsr8TbBEq+I3MgloSRXYuKhNdYP1wlEGilMWAIayA2RFg==", "requires": { "glob": "^7.1.1", @@ -7010,7 +22201,6 @@ "dependencies": { "json-parse-helpfulerror": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "requires": { "jju": "^1.1.0" @@ -7018,7 +22208,6 @@ "dependencies": { "jju": { "version": "1.3.0", - "resolved": false, "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" } } @@ -7027,7 +22216,6 @@ }, "read-package-tree": { "version": "5.1.6", - "resolved": false, "integrity": "sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==", "requires": { "debuglog": "^1.0.1", @@ -7039,7 +22227,6 @@ }, "readable-stream": { "version": "2.3.2", - "resolved": false, "integrity": "sha1-WgTfBeT1f+Pw3Gj90R3FyXx+b00=", "requires": { "core-util-is": "~1.0.0", @@ -7053,22 +22240,18 @@ "dependencies": { "core-util-is": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "isarray": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "1.0.7", - "resolved": false, "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "string_decoder": { "version": "1.0.3", - "resolved": false, "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "~5.1.0" @@ -7076,14 +22259,12 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" } } }, "readdir-scoped-modules": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { "debuglog": "^1.0.1", @@ -7103,7 +22284,6 @@ }, "request": { "version": "2.81.0", - "resolved": false, "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "requires": { "aws-sign2": "~0.6.0", @@ -7132,22 +22312,18 @@ "dependencies": { "aws-sign2": { "version": "0.6.0", - "resolved": false, "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" }, "aws4": { "version": "1.6.0", - "resolved": false, "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "caseless": { "version": "0.12.0", - "resolved": false, "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "combined-stream": { "version": "1.0.5", - "resolved": false, "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "~1.0.0" @@ -7155,24 +22331,20 @@ "dependencies": { "delayed-stream": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" } } }, "extend": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "forever-agent": { "version": "0.6.1", - "resolved": false, "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.1.4", - "resolved": false, "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "requires": { "asynckit": "^0.4.0", @@ -7182,14 +22354,12 @@ "dependencies": { "asynckit": { "version": "0.4.0", - "resolved": false, "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" } } }, "har-validator": { "version": "4.2.1", - "resolved": false, "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "requires": { "ajv": "^4.9.1", @@ -7198,7 +22368,6 @@ "dependencies": { "ajv": { "version": "4.11.8", - "resolved": false, "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "requires": { "co": "^4.6.0", @@ -7207,12 +22376,10 @@ "dependencies": { "co": { "version": "4.6.0", - "resolved": false, "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "json-stable-stringify": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { "jsonify": "~0.0.0" @@ -7220,7 +22387,6 @@ "dependencies": { "jsonify": { "version": "0.0.0", - "resolved": false, "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" } } @@ -7229,14 +22395,12 @@ }, "har-schema": { "version": "1.0.5", - "resolved": false, "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" } } }, "hawk": { "version": "3.1.3", - "resolved": false, "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.x.x", @@ -7247,7 +22411,6 @@ "dependencies": { "boom": { "version": "2.10.1", - "resolved": false, "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.x.x" @@ -7255,7 +22418,6 @@ }, "cryptiles": { "version": "2.0.5", - "resolved": false, "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.x.x" @@ -7263,12 +22425,10 @@ }, "hoek": { "version": "2.16.3", - "resolved": false, "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "sntp": { "version": "1.0.9", - "resolved": false, "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.x.x" @@ -7278,7 +22438,6 @@ }, "http-signature": { "version": "1.1.1", - "resolved": false, "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { "assert-plus": "^0.2.0", @@ -7288,12 +22447,10 @@ "dependencies": { "assert-plus": { "version": "0.2.0", - "resolved": false, "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, "jsprim": { "version": "1.4.0", - "resolved": false, "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", "requires": { "assert-plus": "1.0.0", @@ -7304,22 +22461,18 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "extsprintf": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "json-schema": { "version": "0.2.3", - "resolved": false, "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "verror": { "version": "1.3.6", - "resolved": false, "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "requires": { "extsprintf": "1.0.2" @@ -7331,22 +22484,18 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isstream": { "version": "0.1.2", - "resolved": false, "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "json-stringify-safe": { "version": "5.0.1", - "resolved": false, "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "mime-types": { "version": "2.1.15", - "resolved": false, "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "requires": { "mime-db": "~1.27.0" @@ -7354,34 +22503,28 @@ "dependencies": { "mime-db": { "version": "1.27.0", - "resolved": false, "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" } } }, "oauth-sign": { "version": "0.8.2", - "resolved": false, "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "performance-now": { "version": "0.2.0", - "resolved": false, "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" }, "qs": { "version": "6.4.0", - "resolved": false, "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" }, "stringstream": { "version": "0.0.5", - "resolved": false, "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "tough-cookie": { "version": "2.3.2", - "resolved": false, "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "requires": { "punycode": "^1.4.1" @@ -7389,14 +22532,12 @@ "dependencies": { "punycode": { "version": "1.4.1", - "resolved": false, "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "tunnel-agent": { "version": "0.6.0", - "resolved": false, "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -7406,12 +22547,10 @@ }, "retry": { "version": "0.10.1", - "resolved": false, "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" }, "rimraf": { "version": "2.6.1", - "resolved": false, "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "^7.0.5" @@ -7419,17 +22558,14 @@ }, "safe-buffer": { "version": "5.1.1", - "resolved": false, "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.3.0", - "resolved": false, "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, "sha": { "version": "2.0.1", - "resolved": false, "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", "requires": { "graceful-fs": "^4.1.2", @@ -7438,7 +22574,6 @@ }, "slide": { "version": "1.1.6", - "resolved": false, "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, "smart-buffer": { @@ -7466,12 +22601,10 @@ }, "sorted-object": { "version": "2.0.1", - "resolved": false, "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=" }, "sorted-union-stream": { "version": "2.1.3", - "resolved": false, "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", "requires": { "from2": "^1.3.0", @@ -7480,7 +22613,6 @@ "dependencies": { "from2": { "version": "1.3.0", - "resolved": false, "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", "requires": { "inherits": "~2.0.1", @@ -7489,7 +22621,6 @@ "dependencies": { "readable-stream": { "version": "1.1.14", - "resolved": false, "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -7500,17 +22631,14 @@ "dependencies": { "core-util-is": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "isarray": { "version": "0.0.1", - "resolved": false, "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "string_decoder": { "version": "0.10.31", - "resolved": false, "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } @@ -7519,7 +22647,6 @@ }, "stream-iterate": { "version": "1.2.0", - "resolved": false, "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", "requires": { "readable-stream": "^2.1.5", @@ -7528,7 +22655,6 @@ "dependencies": { "stream-shift": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } @@ -7553,7 +22679,6 @@ }, "ssri": { "version": "4.1.6", - "resolved": false, "integrity": "sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==", "requires": { "safe-buffer": "^5.1.0" @@ -7561,7 +22686,6 @@ }, "strip-ansi": { "version": "4.0.0", - "resolved": false, "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" @@ -7569,7 +22693,6 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "resolved": false, "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" } } @@ -7586,22 +22709,18 @@ }, "text-table": { "version": "0.2.0", - "resolved": false, "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "uid-number": { "version": "0.0.6", - "resolved": false, "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" }, "umask": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" }, "unique-filename": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "requires": { "unique-slug": "^2.0.0" @@ -7609,7 +22728,6 @@ "dependencies": { "unique-slug": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "requires": { "imurmurhash": "^0.1.4" @@ -7619,12 +22737,10 @@ }, "unpipe": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "update-notifier": { "version": "2.2.0", - "resolved": false, "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", "requires": { "boxen": "^1.0.0", @@ -7639,7 +22755,6 @@ "dependencies": { "boxen": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=", "requires": { "ansi-align": "^2.0.0", @@ -7653,7 +22768,6 @@ "dependencies": { "ansi-align": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { "string-width": "^2.0.0" @@ -7661,17 +22775,14 @@ }, "camelcase": { "version": "4.1.0", - "resolved": false, "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "cli-boxes": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "string-width": { "version": "2.1.0", - "resolved": false, "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -7680,12 +22791,10 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "strip-ansi": { "version": "4.0.0", - "resolved": false, "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" @@ -7695,7 +22804,6 @@ }, "term-size": { "version": "0.1.1", - "resolved": false, "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", "requires": { "execa": "^0.4.0" @@ -7703,7 +22811,6 @@ "dependencies": { "execa": { "version": "0.4.0", - "resolved": false, "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", "requires": { "cross-spawn-async": "^2.1.1", @@ -7716,7 +22823,6 @@ "dependencies": { "cross-spawn-async": { "version": "2.2.5", - "resolved": false, "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", "requires": { "lru-cache": "^4.0.0", @@ -7725,12 +22831,10 @@ }, "is-stream": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "npm-run-path": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", "requires": { "path-key": "^1.0.0" @@ -7738,17 +22842,14 @@ }, "object-assign": { "version": "4.1.1", - "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "path-key": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" }, "strip-eof": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" } } @@ -7757,7 +22858,6 @@ }, "widest-line": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "requires": { "string-width": "^1.0.1" @@ -7765,7 +22865,6 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -7775,12 +22874,10 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -7788,14 +22885,12 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } }, "strip-ansi": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -7803,7 +22898,6 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } @@ -7816,7 +22910,6 @@ }, "chalk": { "version": "1.1.3", - "resolved": false, "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -7828,17 +22921,14 @@ "dependencies": { "ansi-styles": { "version": "2.2.1", - "resolved": false, "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "escape-string-regexp": { "version": "1.0.5", - "resolved": false, "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "has-ansi": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" @@ -7846,14 +22936,12 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "strip-ansi": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -7861,21 +22949,18 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, "supports-color": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "configstore": { "version": "3.1.0", - "resolved": false, "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=", "requires": { "dot-prop": "^4.1.0", @@ -7888,7 +22973,6 @@ "dependencies": { "dot-prop": { "version": "4.1.1", - "resolved": false, "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", "requires": { "is-obj": "^1.0.0" @@ -7896,14 +22980,12 @@ "dependencies": { "is-obj": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" } } }, "make-dir": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", "requires": { "pify": "^2.3.0" @@ -7911,14 +22993,12 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": false, "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "unique-string": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { "crypto-random-string": "^1.0.0" @@ -7926,7 +23006,6 @@ "dependencies": { "crypto-random-string": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" } } @@ -7935,17 +23014,14 @@ }, "import-lazy": { "version": "2.1.0", - "resolved": false, "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "is-npm": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "latest-version": { "version": "3.1.0", - "resolved": false, "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { "package-json": "^4.0.0" @@ -7953,7 +23029,6 @@ "dependencies": { "package-json": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "requires": { "got": "^6.7.1", @@ -7964,7 +23039,6 @@ "dependencies": { "got": { "version": "6.7.1", - "resolved": false, "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { "create-error-class": "^3.0.0", @@ -7982,7 +23056,6 @@ "dependencies": { "create-error-class": { "version": "3.0.2", - "resolved": false, "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { "capture-stack-trace": "^1.0.0" @@ -7990,54 +23063,44 @@ "dependencies": { "capture-stack-trace": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" } } }, "duplexer3": { "version": "0.1.4", - "resolved": false, "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "get-stream": { "version": "3.0.0", - "resolved": false, "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "is-redirect": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", - "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "lowercase-keys": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "timed-out": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", - "resolved": false, "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "url-parse-lax": { "version": "1.0.0", - "resolved": false, "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" @@ -8045,7 +23108,6 @@ "dependencies": { "prepend-http": { "version": "1.0.4", - "resolved": false, "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" } } @@ -8054,7 +23116,6 @@ }, "registry-url": { "version": "3.1.0", - "resolved": false, "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" @@ -8077,7 +23138,6 @@ }, "semver-diff": { "version": "2.1.0", - "resolved": false, "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" @@ -8085,19 +23145,16 @@ }, "xdg-basedir": { "version": "3.0.0", - "resolved": false, "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, "uuid": { "version": "3.1.0", - "resolved": false, "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "validate-npm-package-license": { "version": "3.0.1", - "resolved": false, "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "requires": { "spdx-correct": "~1.0.0", @@ -8106,7 +23163,6 @@ "dependencies": { "spdx-correct": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "requires": { "spdx-license-ids": "^1.0.2" @@ -8114,21 +23170,18 @@ "dependencies": { "spdx-license-ids": { "version": "1.2.2", - "resolved": false, "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" } } }, "spdx-expression-parse": { "version": "1.0.4", - "resolved": false, "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" } } }, "validate-npm-package-name": { "version": "3.0.0", - "resolved": false, "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "requires": { "builtins": "^1.0.3" @@ -8136,14 +23189,12 @@ "dependencies": { "builtins": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" } } }, "which": { "version": "1.2.14", - "resolved": false, "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "requires": { "isexe": "^2.0.0" @@ -8151,14 +23202,12 @@ "dependencies": { "isexe": { "version": "2.0.0", - "resolved": false, "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" } } }, "worker-farm": { "version": "1.3.1", - "resolved": false, "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=", "requires": { "errno": ">=0.1.1 <0.2.0-0", @@ -8167,7 +23216,6 @@ "dependencies": { "errno": { "version": "0.1.4", - "resolved": false, "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "requires": { "prr": "~0.0.0" @@ -8175,26 +23223,22 @@ "dependencies": { "prr": { "version": "0.0.0", - "resolved": false, "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" } } }, "xtend": { "version": "4.0.1", - "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } }, "wrappy": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.1.0", - "resolved": false, "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", "requires": { "graceful-fs": "^4.1.11", @@ -8718,7 +23762,6 @@ }, "async-some": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-TYqBYg1ZWHkbW5j4AtMgd3bpVQk=", "requires": { "dezalgo": "^1.0.2" @@ -8810,7 +23853,6 @@ }, "dezalgo": { "version": "1.0.3", - "resolved": false, "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { "asap": "^2.0.0", @@ -8885,7 +23927,6 @@ }, "github-url-from-username-repo": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo=" }, "glob": { @@ -9027,7 +24068,6 @@ }, "nopt": { "version": "3.0.6", - "resolved": false, "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" @@ -9318,7 +24358,6 @@ }, "read-installed": { "version": "4.0.3", - "resolved": false, "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { "debuglog": "^1.0.1", @@ -9337,7 +24376,6 @@ }, "readdir-scoped-modules": { "version": "1.0.2", - "resolved": false, "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { "debuglog": "^1.0.1", @@ -9976,7 +25014,6 @@ }, "validate-npm-package-name": { "version": "2.2.2", - "resolved": false, "integrity": "sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU=", "requires": { "builtins": "0.0.7" @@ -10004,7 +25041,6 @@ }, "write-file-atomic": { "version": "1.1.4", - "resolved": false, "integrity": "sha1-sfUtwujcDjywTRh6JfdYo4qQyjs=", "requires": { "graceful-fs": "^4.1.2", @@ -11667,7 +26703,8 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "devOptional": true }, "semver": { "version": "5.3.0", @@ -12215,6 +27252,14 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -12244,14 +27289,6 @@ "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": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "stringstream": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", From c757ab934d9fb5f3d1c21501c6dd2681dd7e7f09 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Mon, 29 Mar 2021 18:31:08 +0200 Subject: [PATCH 31/39] updated notify design v2 --- .../notifications/README.md | 18 +- ...d.schema.json => notifyReport.schema.json} | 4 +- .../sequence/seq-notify-v2-1.0.0.plantuml | 84 ++- .../assets/sequence/seq-notify-v2-1.0.0.svg | 533 ++++++++++++------ 4 files changed, 427 insertions(+), 212 deletions(-) rename mojaloop-technical-overview/notifications/assets/schemas/{notifyDelivered.schema.json => notifyReport.schema.json} (99%) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index c760de8a3..b120ed788 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -68,9 +68,9 @@ Notes: | Event | Description | Notes | | --- | --- | --- | | Notification | Internal existing notification event currently produced by Central-Service components which is the result of some internal process (e.g. Transfer Prepared, Transfer Fulfiled, etc) | | -| NotificationReady | Domain Event produced by context aware Callback Handler. This message is generic and not contextual. It containts everything that is needed for the notification to be processed by the Notification Engine, which includes the transport specific information required for delivery, and reliability configuration (i.e. delivery report enabled, retry attempts, etc). | | -| NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler as a result of the NotificationReady event. | | -| NotifyDelivered | Domain event message to broadcast Delivery reports within the Notification Engine and Callback Handlers (for compensating actions). This event is consumed by the Notification Evt Handler and persisted for reporting and compensating purposes. | | +| NotifyReady | Domain Event produced by context aware Callback Handler. This message is generic and not contextual. It containts everything that is needed for the notification to be processed by the Notification Engine, which includes the transport specific information required for delivery, and reliability configuration (i.e. delivery report enabled, retry attempts, etc). | | +| NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler as a result of the NotifyReady event. | | +| NotifyReport | Domain event message to broadcast Delivery reports within the Notification Engine and Callback Handlers (for compensating actions). This event is consumed by the Notification Evt Handler and persisted for reporting and compensating purposes. | | ## 3. Models @@ -189,7 +189,7 @@ Notes: #### 3.2.1.c. Delivery-report Event produced by Notification Cmd Handler ##### 3.2.1.c.i. Schemas -[notifyDelivered.schema.json](assets/schemas/notifyDelivered.schema.json) +[NotifyReport.schema.json](assets/schemas/notifyReport.schema.json) ##### 3.2.1.c.ii. Examples @@ -197,7 +197,7 @@ Notes: { "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", // Generated by the NotificationEvtHandler "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", // Mapped from the aggregateId, used by Kafka for Key-partitioning - "msgName": "NotifyDelivered", + "msgName": "NotifyReport", "msgType": "Domain", // DomainEvents "msgTopic": "NotificationCommands", // Topic that the message will be published too "msgPartition": null, // Optional partition used for publishing the message to the msgTopic @@ -326,12 +326,12 @@ NotifyCmd Command Event: } ``` -NotifyDelivered Domain Event: +NotifyReport Domain Event: ```JSON { "msgId": "0ee9331a-1a71-4efc-a22d-868fcbf59658", "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", - "msgName": "NotifyDelivered", + "msgName": "NotifyReport", "msgType": "Domain", "msgTopic": "NotificationCommands", "msgPartition": null, @@ -419,12 +419,12 @@ NotifyCmd Command Event: } ``` -NotifyDelivered Domain Event: +NotifyReport Domain Event: ```JSON { "msgId": "cfa82358-7a92-42bd-8943-f37d22784b15", "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", - "msgName": "NotifyDelivered", + "msgName": "NotifyReport", "msgType": "Domain", "msgTopic": "NotificationCommands", "msgPartition": null, diff --git a/mojaloop-technical-overview/notifications/assets/schemas/notifyDelivered.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json similarity index 99% rename from mojaloop-technical-overview/notifications/assets/schemas/notifyDelivered.schema.json rename to mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json index 721f1b703..8ed6f6e02 100644 --- a/mojaloop-technical-overview/notifications/assets/schemas/notifyDelivered.schema.json +++ b/mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema", - "$id": "http://mojaloop.io/events/notifications/NotifyDelivered", + "$id": "http://mojaloop.io/events/notifications/NotifyReport", "type": "object", - "title": "NotifyDelivered", + "title": "NotifyReport", "description": "The root schema comprises the entire JSON document.", "default": {}, "examples": [ diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index c08facd4f..4150f00ad 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -371,12 +371,14 @@ group Send notification to Participants TOPIC_NOTIFICATIONS_CMD <- NOTIFY_HANDLER_CMD: Consume NotifyCmd Command Message activate NOTIFY_HANDLER_CMD deactivate TOPIC_NOTIFICATIONS_CMD + + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration \nError code: 1001 - alt transport.options.deliver-report === true - NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification event - end + NOTIFY_HANDLER_CMD <-> NOTIFYDB: Query Notification Attempt by notifyId, and attemot to re-load existing state into memory if it exists \nNote: this means that we are recovering a 'Notification' event from a mid-flight 'in-progress' Cmd Handler interupption if record found! - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration + alt if transport.options.deliver-report === true and state.status is undefined from in-memory state + NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification event with state.status='received' and state.retry-attempt-count = 0 + end alt If transport.type && transport.content-type match handlers configuration @@ -396,36 +398,80 @@ alt If transport.type && transport.content-type match handlers configuration } } end note - NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 - NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP Response + + loop state.retry-attempt-count++; state.retry-attempt-count < transport.options.retry.count + alt if state.retry-attempt-count == 0 && state.status == 'received' + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with state.status='in-progress' + else + alt if transport.options.retry.type == 'exponentialDelay' + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: With state.retry-attempt-count - Calculate and wait for exponentialDelay to decay + end + end + + alt if state.retry-count < transport.options.retry.count + group Delivery Success + NOTIFY_HANDLER_CMD -> PARTICIPANT: Send Notification to \nPayer DFSP to specified Endpoint \nError code: 1001 + NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP Response + break from loop + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop + end + else Handle Delivery Failure + alt transport.options.deliver-report === true + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with Failure.reason & state.retry-attempt-count + end + alt if Failure.type is NOT of type transport.options.retry.condition + break from loop + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop + end + end + end + else + break from loop + ' alt transport.options.deliver-report === true + ' NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with failure reason 'max retries-attempts exceeded' + ' end + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop + end + end + end end alt transport.options.deliver-report === true - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report (NotifyReport) - NOTIFY_HANDLER_CMD -> NOTIFYDB: Record NotifyDeliveryReport results + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification statewith delivery report details and state.status='success' || 'failure' - NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyDeliveryReport event + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyReport event activate TOPIC_NOTIFICATIONS_EVT + + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event + deactivate TOPIC_NOTIFICATIONS_CMD + deactivate NOTIFY_HANDLER_CMD + + ' TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyReport event + ' deactivate TOPIC_NOTIFICATIONS_EVT + ' activate NOTIFY_HANDLER_EVT + + ' NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyReport event + ' deactivate NOTIFY_HANDLER_EVT + ' activate TOPIC_NOTIFICATIONS_EVT + ' deactivate TOPIC_NOTIFICATIONS_EVT - TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyDeliveryReport event + TOPIC_NOTIFICATIONS_EVT <- MLCALLBACKHANDLER: Consume NotifyReport event deactivate TOPIC_NOTIFICATIONS_EVT - activate NOTIFY_HANDLER_EVT + activate MLCALLBACKHANDLER - NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyDeliveryReport event - deactivate NOTIFY_HANDLER_EVT + MLCALLBACKHANDLER -> MLCALLBACKHANDLER: Handle compensating actions by Custom Rule process + + MLCALLBACKHANDLER -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyReport event + deactivate MLCALLBACKHANDLER activate TOPIC_NOTIFICATIONS_EVT deactivate TOPIC_NOTIFICATIONS_EVT end else - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification end - NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event - activate TOPIC_NOTIFICATIONS_CMD - deactivate TOPIC_NOTIFICATIONS_CMD - deactivate NOTIFY_HANDLER_CMD - end @enduml diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index d4c82f043..176a5d732 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -1,4 +1,4 @@ - + @@ -7,37 +7,49 @@ - + 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - + Central Service - + Mojaloop Adapter - - + + Notification Engine - - + + Financial Service Provider (Participant) - - + + + - - - - + + + + + + + + + + + + + + + @@ -49,15 +61,15 @@ Topic - - - + + + notifications - + (Internal) - + Topic @@ -65,21 +77,21 @@ - + Central Service API - - + + FSPIOP Callback Handler - + FSPIOP Callback Handler - - + + @@ -91,82 +103,83 @@ Topic - - - + + + notificationsEvent - + (Domain Event) - + Topic - + Notification Event Handler - - - + + + Notification Event Handler - - - - - + + + + + notificationsCommand - + (Cmd Event) - + Topic - - - + + + notificationsCommand - + (Cmd Event) - + Topic - + Notify Persistent Store - - - + + + Notify Persistent Store - - - + + + Notification Cmd Handler - - - + + + Notification Cmd Handler - - - + + + Participant - - - + + + Participant - - - + + + + - + Send notification to Participants @@ -892,215 +905,371 @@ Publish NotificationReady Event Message - + 27 Consume NotificationReady Event - - - + + + 28 - + Construct NotifyCmd Command Message with notficiation-payload & transport-data - - - + + + For-each NotifyCmd Command Messages - - - + + + 29 - + Publish NotifyCmd Command Message - + 30 Commit Notification event - - - + + + 31 - + Consume NotifyCmd Command Message - - - - alt + + + + 32 - - [transport.options.deliver-report === true] + + Validate transport.type && transport.content-type match handlers configuration - - - - 32 + + Error code: - - Record Notification event + + 1001 - - - + + + 33 - - Validate transport.type && transport.content-type match handlers configuration + + Query Notification Attempt by notifyId, and attemot to re-load existing state into memory if it exists + + + Note: this means that we are recovering a 'Notification' event from a mid-flight 'in-progress' Cmd Handler interupption if record found! - - - + + + alt - - [If transport.type && transport.content-type match handlers configuration] + + [if transport.options.deliver-report === true and state.status is undefined from in-memory state] - - - + + + 34 - + + Record Notification event with state.status='received' and state.retry-attempt-count = 0 + + + + + alt + + + [If transport.type && transport.content-type match handlers configuration] + + + + + 35 + + Construct Transport Message - - - + + + Retry Transport Mechanism based on transport options - - - + + + "transport": { - + "options": { - + "deliveryReport": true, - + "retry": { - + "count": 3, - + "type": "noDelay|exponentialDelay", - + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - + } - + } - + } - - - - 35 + + + + loop - - Notification to + + [state.retry-attempt-count++; state.retry-attempt-count < transport.options.retry.count] - - Payer DFSP to specified Endpoint - PUT + + + + alt - - Error code: + + [if state.retry-attempt-count == 0 && state.status == 'received'] - - 1001 - - - - + + + 36 - - HTTP Response + + Update Notification state with state.status='in-progress' - - - + + + + alt - - [transport.options.deliver-report === true] + + [if transport.options.retry.type == 'exponentialDelay'] - - - + + + 37 - - Prepare Delivery Report + + With state.retry-attempt-count - Calculate and wait for exponentialDelay to decay + + + + + alt + + + [if state.retry-count < transport.options.retry.count] - - - + + + + Delivery Success + + + + 38 - - Record NotifyDeliveryReport results + + Send Notification to + + + Payer DFSP to specified Endpoint + + + Error code: + + + 1001 - - - + + + 39 - - Publish NotifyDeliveryReport event + + HTTP Response + + + + + break - - - + + [from loop] + + + + 40 - - Consume NotifyDeliveryReport event + + break from loop + + + + [Handle Delivery Failure] - - - + + + + alt + + + [transport.options.deliver-report === true] + + + + 41 - - Commit NotifyDeliveryReport event + + Update Notification state with Failure.reason & state.retry-attempt-count + + + + + alt + + + [if Failure.type is NOT of type transport.options.retry.condition] - - - - + + + + break + + + [from loop] + + + + 42 - - Ignore Notification + + break from loop + + + + + + break + + + [from loop] - - - + + + 43 - + + break from loop + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 44 + + + Prepare Delivery Report (NotifyReport) + + + + + 45 + + + Update Notification statewith delivery report details and state.status='success' || 'failure' + + + + + 46 + + + Publish NotifyReport event + + + + + 47 + + Commit NotifyCmd event + + + + 48 + + + Consume NotifyReport event + + + + + 49 + + + Handle compensating actions by Custom Rule process + + + + + 50 + + + Commit NotifyReport event + + + + + + 51 + + + Ignore Notification + From c0ea05c8da7820d5b5b631f22d5d2f249686aeda Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 30 Mar 2021 16:24:25 +0200 Subject: [PATCH 32/39] updates to notification design v2 - included more detail on re-try logic, and recovery from failures --- .../sequence/seq-notify-v2-2.0.0.plantuml | 229 ++++++++ .../assets/sequence/seq-notify-v2-2.0.0.svg | 511 ++++++++++++++++++ 2 files changed, 740 insertions(+) create mode 100644 mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml create mode 100644 mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml new file mode 100644 index 000000000..e3931a8a9 --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml @@ -0,0 +1,229 @@ + +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Miguel de Barros + * Shashikant Hirugade + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 2.0.0. Send Notification to Participant (Payer/Payee) v2.0 - Error Scenario: Notification Cmd Handler Failure mid-processing retries + +autonumber + +' Actor Keys: +' actor - Payer DFSP, Payee DFSP +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistance Store + +' declare actors +' actor "Payer DFSP\nParticipant" as PAYER_DFSP +actor "Participant" as PARTICIPANT +control "Notification Event Handler" as NOTIFY_HANDLER_EVT +control "Notification Cmd Handler" as NOTIFY_HANDLER_CMD +boundary "Central Service API" as CSAPI +control "FSPIOP Callback Handler" as MLCALLBACKHANDLER +collections "notifications\n(Internal)\nTopic" as TOPIC_NOTIFICATIONS +collections "notificationsCommand\n(Cmd Event)\nTopic" as TOPIC_NOTIFICATIONS_CMD +collections "notificationsEvent\n(Domain Event)\nTopic" as TOPIC_NOTIFICATIONS_EVT +' entity "Participant DAO" as PARTICIPANT_DAO +' entity "Notifications DAO" as NOTIFICATIONS_DAO +database "Notify Persistent Store" as NOTIFYDB + +' box "Financial Service Provider (Payer)" #lightGray +' participant PAYER_DFSP +' end box + +' box "ML API Adapter Service" #LightBlue +' participant NOTIFY_HANDLER +' end box + +box "Central Service" #LightYellow + participant TOPIC_NOTIFICATIONS + + participant CSAPI + ' participant NOTIFICATIONS_DAO + participant TOPIC_NOTIFICATIONS_EVT + ' participant PARTICIPANT_DAO + ' participant DB +end box + +box "Mojaloop Adapter" #LightCyan + participant MLCALLBACKHANDLER + ' participant TOPIC_NOTIFICATIONS + + ' participant CSAPI + ' participant NOTIFICATIONS_DAO + ' participant DB + ' participant TOPIC_NOTIFICATIONS_EVT + ' participant PARTICIPANT_DAO + ' participant DB +end box + +box "Notification Engine" #LightBlue + participant TOPIC_NOTIFICATIONS_EVT + participant NOTIFY_HANDLER_EVT + participant TOPIC_NOTIFICATIONS_CMD + participant NOTIFYDB + participant NOTIFY_HANDLER_CMD + ' participant TOPIC_NOTIFICATIONS_EVT +end box + +box "Financial Service Provider (Participant)" #lightGray + participant PARTICIPANT +end box + +' start flow +group Send notification to Participants + ' note left of NOTIFY_HANDLER_EVT #yellow + ' Message: + ' { + ' payload: { + ' endpoint: { + ' type: , + ' value: + ' } + ' } + ' } + ' end note + + TOPIC_NOTIFICATIONS <- MLCALLBACKHANDLER: Consume Notification event + activate MLCALLBACKHANDLER + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + + + + ' put logic here to route command-type based on incoming events + group Routing logic + note right of MLCALLBACKHANDLER #lightGray + ref: 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 + end note + MLCALLBACKHANDLER <-> MLCALLBACKHANDLER: Handle Routing logic + MLCALLBACKHANDLER -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyReady Event Message\n + end + + ' TODO1 + TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyReady Event + activate NOTIFY_HANDLER_EVT + activate TOPIC_NOTIFICATIONS_EVT + deactivate TOPIC_NOTIFICATIONS_EVT + + NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with notficiation-payload & transport-data + group For-each NotifyCmd Command Messages + NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_CMD: Publish NotifyCmd Command Message + activate TOPIC_NOTIFICATIONS_CMD + end + + + NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit Notification event + activate TOPIC_NOTIFICATIONS_EVT + deactivate TOPIC_NOTIFICATIONS_EVT + deactivate NOTIFY_HANDLER_EVT + + + TOPIC_NOTIFICATIONS_CMD <- NOTIFY_HANDLER_CMD: Consume NotifyCmd Command Message + activate NOTIFY_HANDLER_CMD + deactivate TOPIC_NOTIFICATIONS_CMD + + alt transport.options.deliver-report === true + NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification event + end + + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration + +alt If transport.type && transport.content-type match handlers configuration + + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message + + ' retry logic goes here + group Retry Transport Mechanism based on transport options + note right of NOTIFY_HANDLER_CMD #yellow + "transport": { + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + } + end note + + loop retry-count=0; retry-count++; retry-count < transport.options.retry.count + NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification Attempt + alt if retry-count < transport.options.retry.count + group Delivery Success + NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 + NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP Response + break from loop + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop + end + else Delivery Failure + alt transport.options.deliver-report === true + NOTIFY_HANDLER_CMD -> NOTIFYDB: Record failure attempt + end + end + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Inc retry attempt count + else + break from loop + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop + end + end + end + end + + alt transport.options.deliver-report === true + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report + + NOTIFY_HANDLER_CMD -> NOTIFYDB: Record NotifyReport results + + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyReport event + activate TOPIC_NOTIFICATIONS_EVT + + TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyReport event + deactivate TOPIC_NOTIFICATIONS_EVT + activate NOTIFY_HANDLER_EVT + + NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyReport event + deactivate NOTIFY_HANDLER_EVT + activate TOPIC_NOTIFICATIONS_EVT + deactivate TOPIC_NOTIFICATIONS_EVT + end + +else + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification +end + + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event + activate TOPIC_NOTIFICATIONS_CMD + deactivate TOPIC_NOTIFICATIONS_CMD + deactivate NOTIFY_HANDLER_CMD + +end +@enduml diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg new file mode 100644 index 000000000..8f5ec1785 --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg @@ -0,0 +1,511 @@ + + + + + + + + + + + 2.0.0. Send Notification to Participant (Payer/Payee) v2.0 - Error Scenario: Notification Cmd Handler Failure mid-processing retries + + + + Central Service + + + + Mojaloop Adapter + + + + Notification Engine + + + + Financial Service Provider (Participant) + + + + + + + + + + + + + + + + + + + notifications + + + (Internal) + + + Topic + + + + + notifications + + + (Internal) + + + Topic + + + Central Service API + + + + + Central Service API + + + + + FSPIOP Callback Handler + + + + + FSPIOP Callback Handler + + + + + + + notificationsEvent + + + (Domain Event) + + + Topic + + + + + notificationsEvent + + + (Domain Event) + + + Topic + + + Notification Event Handler + + + + + Notification Event Handler + + + + + + + notificationsCommand + + + (Cmd Event) + + + Topic + + + + + notificationsCommand + + + (Cmd Event) + + + Topic + + + Notify Persistent Store + + + + + Notify Persistent Store + + + + + Notification Cmd Handler + + + + + Notification Cmd Handler + + + + + Participant + + + + + Participant + + + + + + + + Send notification to Participants + + + + + 1 + + + Consume Notification event + + + + + Routing logic + + + + + ref: 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 + + + + + 2 + + + Handle Routing logic + + + + + 3 + + + Publish NotifyReady Event Message + + + + + 4 + + + Consume NotifyReady Event + + + + + 5 + + + Construct NotifyCmd Command Message with notficiation-payload & transport-data + + + + + For-each NotifyCmd Command Messages + + + + + 6 + + + Publish NotifyCmd Command Message + + + + + 7 + + + Commit Notification event + + + + + 8 + + + Consume NotifyCmd Command Message + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 9 + + + Record Notification event + + + + + 10 + + + Validate transport.type && transport.content-type match handlers configuration + + + + + alt + + + [If transport.type && transport.content-type match handlers configuration] + + + + + 11 + + + Construct Transport Message + + + + + Retry Transport Mechanism based on transport options + + + + + "transport": { + + + "options": { + + + "deliveryReport": true, + + + "retry": { + + + "count": 3, + + + "type": "noDelay|exponentialDelay", + + + "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + + + } + + + } + + + } + + + + + loop + + + [retry-count=0; retry-count++; retry-count < transport.options.retry.count] + + + + + 12 + + + Record Notification Attempt + + + + + alt + + + [if retry-count < transport.options.retry.count] + + + + + Delivery Success + + + + + 13 + + + Notification to + + + Payer DFSP to specified Endpoint - PUT + + + Error code: + + + 1001 + + + + + 14 + + + HTTP Response + + + + + break + + + [from loop] + + + + + 15 + + + break from loop + + + + [Delivery Failure] + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 16 + + + Record failure attempt + + + + + 17 + + + Inc retry attempt count + + + + + + break + + + [from loop] + + + + + 18 + + + break from loop + + + + + alt + + + [transport.options.deliver-report === true] + + + + + 19 + + + Prepare Delivery Report + + + + + 20 + + + Record NotifyReport results + + + + + 21 + + + Publish NotifyReport event + + + + + 22 + + + Consume NotifyReport event + + + + + 23 + + + Commit NotifyReport event + + + + + + 24 + + + Ignore Notification + + + + + 25 + + + Commit NotifyCmd event + + From 61c9ea3614a589fb3bd85fea3210fafe83284d0b Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 30 Mar 2021 19:18:43 +0200 Subject: [PATCH 33/39] updates to notification design v2 - included more detail on re-try logic, and recovery from failures --- .../notifications/README.md | 307 ++++-------------- ...rch-End-to-End-with-Notify-Engine-v2.0.svg | 2 +- .../assets/schemas/eventNotifyCmd.schema.json | 13 +- .../assets/schemas/notifyReport.schema.json | 2 +- .../sequence/seq-notify-v2-1.0.0.plantuml | 33 +- 5 files changed, 90 insertions(+), 267 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index b120ed788..66aeac123 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -37,8 +37,8 @@ This design proposes the seperation of the current Notification capabilities (tr | Components | Description | APIs | Notes | | --- | --- | --- | --- | -| ML-Adapter Callback Handler | This component understands the context and semantics of the FSPIOP Specification. Consumes existing Notification (internal) events, then interprates (in context of Mojaloop use-cases) those events into an appropriate event message to some explicit receipient. Also handles feedback loop and compensating actions (defined by configurable rules) from Delivery Reports. | N/A | This component is part of the "ML-API-Adapter" | -| Notification Evt Handler | Consumes existing Notification events, then interprates (without contextual dependencies) those events into an appropriate NotifyCmd. This component is stateful, and will store information of the notification events and delivery reports as required. | API operations to request notifications (async & sync) and query stored deliveryReports | This component is a "Supporting-Service" | +| ML-Adapter Callback Handler | This component understands the context and semantics of the FSPIOP Specification. Consumes existing Notification (internal) events, then interprates (in context of Mojaloop use-cases) those events into an appropriate event message to some explicit receipient. Also handles feedback loop and compensating actions (defined by configurable rules) from Delivery Reports. It must also resolve any notification details required (i.e. URLs, transport type, etc) by querying the Central-Service's Admin API. | N/A | This component is part of the "ML-API-Adapter" | +| Notification Evt Handler | Consumes existing Notification events, then interprates (without contextual dependencies) those events into an appropriate NotifyCmd. | API operations to request notifications (async & sync) and query stored deliveryReports | This component is a "Supporting-Service" | | Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistence or caching stores. This allows for multiple pluggable Cmd Handlers to exist to handle different combinations of transports (transport.type) and content-types(transpport.contentType) as required. This component will also manage message and transport security aspects such as TLS (Transport Layer Security) and JWS Signing for HTTP transports. | API operations to send notifications synchronously | This component is a "Supporting-Service" | @@ -50,19 +50,8 @@ This design proposes the seperation of the current Notification capabilities (tr ### 2.2. Sequence Diagrams -#### 2.1.1. Golden path - ![example](assets/sequence/seq-notify-v2-1.0.0.svg) -#### 2.1.2. Failure Scenarios - -##### 2.1.2.1. Notification Cmd Handler Failure mid-processing retries - -Notes: -- Handle failure attempts - -##### 2.1.2.2. Callback Handler / Notification Engine Unavailable - ### 2.3. Types of Notifications | Event | Description | Notes | @@ -72,6 +61,16 @@ Notes: | NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler as a result of the NotifyReady event. | | | NotifyReport | Domain event message to broadcast Delivery reports within the Notification Engine and Callback Handlers (for compensating actions). This event is consumed by the Notification Evt Handler and persisted for reporting and compensating purposes. | | +### 2.4. Notification Aggregate internal States + +| State | Description | Notes | +| --- | --- | --- | +| received | Indicates that the NotifyCmd event has been receivd by the Notification Cmd Handler. | | +| in-progress | Indicates that the NotifyCmd event is being processed. | | +| success | Indicates that the NotifyCmd event processing has completed successfully, and the Notification was delivered. | | +| failure | Indicates that the NotifyCmd event processing has failed, and the Notification was not delivered. | | +| expired | Indicates that the NotifyCmd event processing has expired, and the Notification was not delivered. | | + ## 3. Models #### 3.2.1. Events @@ -125,74 +124,32 @@ Notes: } ``` -#### 3.2.1.b. Notification Command produced by Notificant Evt Handler +#### 3.2.1.b. Notification Ready produced by Mojaloop Adapter Callback Handler ##### 3.2.1.b.i. Schemas -[eventNotifyCmd.schema.json](assets/schemas/eventNotifyCmd.schema.json) +[eventNotifyReady.schema.json](assets/schemas/eventNotifyReady.schema.json) ##### 3.2.1.b.ii. Examples ```JSON -{ - "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", // Generated by the NotificationEvtHandler - "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", // Mapped from the aggregateId, used by Kafka for Key-partitioning - "msgName": "NotifyCmd", - "msgType": "Command", // DomainEvents - "msgTopic": "NotificationCommands", // Topic that the message will be published too - "msgPartition": null, // Optional partition used for publishing the message to the msgTopic - "msgTimestamp": 1607677081837, // Time of message creation - "aggregateName": "Notifications", - "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", // Generated by the NotificationEvtHandler - "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", // Mapped from the metadata.event.id by the NotificationEvtHandler, used to correlate multiple NotifyCmd. - "transport": { // Transport information required by the notification-engine - "type": "HTTP", // Transport type - "method": "GET", // Optional method for the associated transport - "contentType": "application/vnd.interoperability.paries+json;version=1.0", - "recipient": { - "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", // Templated endpoint. It can be a hardcoded string with all parameters pre-rendered into the string. - "params": { // Optional template parameters - "partyIdType": "MSISDN", - "partyId": "12345", - "value": "ABCD" - } - }, - "options": { // Run-time config options for the notification-engine - "deliveryReport": true, // Enable delivery-reporting - "retry": { //Retry config - "count": 3, - "type": "noDelay|exponentialDelay", // ref for exponentialDelay: https://developers.google.com/analytics/devguides/reporting/core/v3/errors#backoff - "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" // isNetworkOrIdempotentRequestError is default, it retries if it is a network error or (using HTTP as an example) 5xx error on an idempotent request (i.e GET, HEAD, OPTIONS, PUT or DELETE) - } - } - }, - "payload": { - // Headers to be send in request. Note trace-headers (traceParent, traceState) will also included when sending out the request when provided in traceInfo section. - "headers": { - "content-type": "application/vnd.interoperability.transfers+json;version=1.0", - "date": "2019-05-28T16:34:41.000Z", - "fspiop-source": "payerfsp", - "fspiop-destination": "payerfsp" - }, - // Body is optional and may be ignored depending on the transport.method - "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" - }, - "traceInfo": { // Optional. Populate if trace-headers are to be be included in request headers. - "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", - "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", - "service": "notification-evt-handler", - "startTimestamp": 1607677081837, - "finishTimestamp": 2007677081838 - } -} + ``` -#### 3.2.1.c. Delivery-report Event produced by Notification Cmd Handler +#### 3.2.1.c. Notification Command produced by Notificant Evt Handler + ##### 3.2.1.c.i. Schemas -[NotifyReport.schema.json](assets/schemas/notifyReport.schema.json) + +[eventNotifyCmd.schema.json](assets/schemas/eventNotifyCmd.schema.json) ##### 3.2.1.c.ii. Examples +#### 3.2.1.d. Delivery-report Event produced by Notification Cmd Handler +##### 3.2.1.d.i. Schemas +[NotifyReport.schema.json](assets/schemas/notifyReport.schema.json) + +##### 3.2.1.d.ii. Examples + ```JSON { "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", // Generated by the NotificationEvtHandler @@ -236,7 +193,37 @@ Notes: ``` ## 4. Scenarios -### 4.1. Multiple Transports + +#### 4.1. Failure Scenarios + +##### 4.1.1. Notification Cmd Handler Failure mid-processing + +Notification Cmd Handler uses either a cached or persistent repository (depending on requirements) to store the Notification state. + +Once the NotifyCmd is consumed by the Notification Cmd Handler, the managed state within the cached/persistent repository will ensure that the Handler will be able to recover from any mid-processing interruptions. The NotifyCmd event will then be re-loaded the state from the repository, and process the notification accordingly: + +- The Notification will be ignored if the state.status is either `success`, `failed` or `expired`. +- The NotifyCmd will be processed from its last retry-attempt if the state.status = `in-progress` +- The NotifyCmd will be processed normally if state.status = `received` as no retry-atempts have been observed + +The Notification Cmd Handler will only commit the Kafka message once a final state (i.e. `success`, `failed` or `expired`) has been persisted, thus ensuring the that the message will be re-processed as a result of any interupptions. + +##### 4.1.2. Compensating Actions + +The Mojaloop Adapter - FSPIOP Callback Handler (or any other Callback Handler) is able to action compensating actions by processing the NotifyReport domain event. Note that the NotifyReport will only be published by the Notification Engine if the transport.options.deliver-report field is set to true on the NotifyReady domain event. + +The capabilities for the rule processor must support the following operations: +- Create a new (not a duplicate) NotifiyReady request event. This can be used by any Callback Handler to execute additional retry logic that is specific to its own context (i.e. FPSIOP, ISO20022, etc), or instead soley handle retry logic by disabling retries on the Notification Engine (i.e. transport.options.retry.count=). +- Notify Central-Services of the NotifyReport results. This can be used by the Central-Services to inform the Timeout handler of the expiration. + + +##### 4.1.2. Callback Handlers + +There are two approaches to handle unavailable/interruptions to Callback Handler processing: +- the existing Mojaloop Timeout process will manage any transfers that are not in a final commited or aborted state. This could result in a notification being delivered while in parallel the associated transfer is timed-out by the Central-Services, and thus to consistency issues. +- the existing Timeout process will ignore any transfers that are queued for notification, and instead wait for a compensating action from the FSPIOP Callback Handler. This will ensure consistency and is the recommended approach. + +### 4.2. Multiple Transports ( TO BE UPDATED! ) ![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg) @@ -275,185 +262,3 @@ Each of the Notification Engines will only listen to event messages that match t This therefore allows the Central-Ledger components to be isolated from the transport specific logic (and transformations if applicable) for notification callbacks. The delivery-report for each of the POST/PUT interactions provides the assurance that the notifications results are recorded by the Central-Service Notification-Evt-Handler component. This component is able to raise alerts or alternatively handle any compensating actions independantly of the FSP's transport preferences. - -#### 4.1.a. gRPC Transport example for a POST Transfer Callback Notification Messages for FSP1 to FSP2 - -NotifyCmd Command Event: -```JSON -{ - "msgId": "66a2ec9a-9d4f-4439-8d38-19c3aa21d54e", - "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", - "msgName": "NotifyCmd", - "msgType": "Command", - "msgTopic": "NotificationCommands", - "msgPartition": null, - "msgTimestamp": 1607677081837, - "aggregateName": "Notifications", - "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", - "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", - "transport": { - "type": "GRPC", - "method": "POST", - "contentType": "application/vnd.interoperability.transfers+json;version=1.0", - "recipient": { - "endpoint": "fsp2.com/transfers" - }, - "options": { - "deliveryReport": true, - "retry": { - "count": 3, - "type": "exponentialDelay", - "condition": "isNetworkOrIdempotentRequestError" - } - } - }, - "payload": { - "headers": { - "content-type": "application/vnd.interoperability.transfers+json;version=1.0", - "date": "2019-05-28T16:34:41.000Z", - "fspiop-source": "FSP1", - "fspiop-destination": "FSP2" - }, - "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-PREPARE-REQUEST" - }, - "traceInfo": { - "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", - "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", - "service": "notification-evt-handler", - "startTimestamp": 1607677081837, - "finishTimestamp": 2007677081838 - } -} -``` - -NotifyReport Domain Event: -```JSON -{ - "msgId": "0ee9331a-1a71-4efc-a22d-868fcbf59658", - "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", - "msgName": "NotifyReport", - "msgType": "Domain", - "msgTopic": "NotificationCommands", - "msgPartition": null, - "msgTimestamp": 2007677081820, - "aggregateName": "Notifications", - "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", - "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", - "report": { - "requestTimestamp": 1507677081120, - "deliveryTimestamp": 1607677081840, - "deliveryReqLatency": 100, - "retryAttempts": 0, - "response": { - "statusCode": "0", - "statusDescription": "OK", - "headers": { - "content-type": "application/vnd.interoperability.transfers+json;version=1.0", - "date": "2019-05-28T16:34:41.000Z" - }, - "body": "{}", - }, - "accepted": true - }, - "traceInfo": { - "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", - "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", - "service": "notification-Cmd-handler", - "startTimestamp": 1607677081837, - "finishTimestamp": 2007677081838 - } -} -``` - - -#### 4.1.b. HTTP Transport example for a PUT Transfer Callback Notification Messages for FSP2 to FSP1 - -NotifyCmd Command Event: -```JSON -{ - "msgId": "6db168a3-61bd-485b-9921-b7012651243e", - "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", - "msgName": "NotifyCmd", - "msgType": "Command", - "msgTopic": "NotificationCommands", - "msgPartition": null, - "msgTimestamp": 1607677081837, - "aggregateName": "Notifications", - "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", - "notifyId": "2c9f52ad-fa48-4a57-8794-b73729acf184", - "transport": { - "type": "HTTP", - "method": "PUT", - "contentType": "application/vnd.interoperability.transfers+json;version=1.0", - "recipient": { - "endpoint": "fsp2.com/transfers/{{transferId}}", - "params": { - "transferId": "861b86e6-c3da-48b3-ba17-896710287d1f" - } - }, - "options": { - "deliveryReport": true, - "retry": { - "count": 3, - "type": "exponentialDelay", - "condition": "isNetworkOrIdempotentRequestError" - } - } - }, - "payload": { - "headers": { - "content-type": "application/vnd.interoperability.transfers+json;version=1.0", - "date": "2019-05-28T16:34:41.000Z", - "fspiop-source": "FSP2", - "fspiop-destination": "FSP1" - }, - "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-FULFIL-REQUEST" - }, - "traceInfo": { - "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", - "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", - "service": "notification-evt-handler", - "startTimestamp": 1607677081837, - "finishTimestamp": 2007677081838 - } -} -``` - -NotifyReport Domain Event: -```JSON -{ - "msgId": "cfa82358-7a92-42bd-8943-f37d22784b15", - "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", - "msgName": "NotifyReport", - "msgType": "Domain", - "msgTopic": "NotificationCommands", - "msgPartition": null, - "msgTimestamp": 2007677081820, - "aggregateName": "Notifications", - "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", - "notifyId": "2c9f52ad-fa48-4a57-8794-b73729acf184", - "report": { - "requestTimestamp": 1507677081120, - "deliveryTimestamp": 1607677081840, - "deliveryReqLatency": 100, - "retryAttempts": 1, - "response": { - "statusCode": "200", - "statusDescription": "Ok", - "headers": { - "content-type": "application/vnd.interoperability.transfers+json;version=1.0", - "date": "2019-05-28T16:34:41.000Z" - }, - "body": "{}", - }, - "accepted": true - }, - "traceInfo": { - "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", - "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", - "service": "notification-Cmd-handler", - "startTimestamp": 1607677081837, - "finishTimestamp": 2007677081838 - } -} -``` \ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg index 2395693c4..01eeedc5b 100644 --- a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg @@ -1,3 +1,3 @@ -
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
FSPIOP 
Transfer API
(Prepare)
FSPIOP...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
FSPIOP
Callback
Handler
FSPIOP...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
FSPIOP
Callback
Handler
FSPIOP...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
FSPIOP
Transfer API
(Fulfil)
FSPIOP...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
FSPIOP 
Transfer API
(Prepare)
FSPIOP...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
FSPIOP
Callback
Handler
FSPIOP...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
FSPIOP
Callback
Handler
FSPIOP...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
FSPIOP
Transfer API
(Fulfil)
FSPIOP...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json index 93fcc5f57..ffae10f1f 100644 --- a/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json +++ b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json @@ -35,7 +35,8 @@ "count": 3, "type": "noDelay|exponentialDelay", "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - } + }, + "expiration": 2000 } }, "payload": { @@ -368,6 +369,16 @@ } }, "additionalProperties": false + }, + "expiration": { + "$id": "#/properties/transport/properties/options/properties/expiration", + "type": "integer", + "title": "The expiration schema", + "description": "The relative expiration value. 0 is indicates that there is no expiration.", + "default": 0, + "examples": [ + 2000 + ] } }, "additionalProperties": false diff --git a/mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json index 8ed6f6e02..dc8fa293a 100644 --- a/mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json +++ b/mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json @@ -11,7 +11,7 @@ "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", "msgName": "NotifyDelivered", "msgType": "Domain", - "msgTopic": "NotificationCommands", + "msgTopic": "NotificationEvents", "msgPartition": null, "msgTimestamp": 2007677081820, "aggregateName": "Notifications", diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml index 4150f00ad..504df8195 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.plantuml @@ -374,13 +374,13 @@ group Send notification to Participants NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration \nError code: 1001 - NOTIFY_HANDLER_CMD <-> NOTIFYDB: Query Notification Attempt by notifyId, and attemot to re-load existing state into memory if it exists \nNote: this means that we are recovering a 'Notification' event from a mid-flight 'in-progress' Cmd Handler interupption if record found! + NOTIFY_HANDLER_CMD <-> NOTIFYDB: Query Notification Attempt by aggregateId, and attemot to re-load existing state into memory if it exists \nNote: this means that we are recovering a 'Notification' event from a mid-flight 'in-progress' Cmd Handler interupption if record found! alt if transport.options.deliver-report === true and state.status is undefined from in-memory state NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification event with state.status='received' and state.retry-attempt-count = 0 end -alt If transport.type && transport.content-type match handlers configuration +alt If transport.type && transport.content-type match handlers configuration && state.status != 'success' || 'failed' || 'expired' NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message @@ -408,11 +408,22 @@ alt If transport.type && transport.content-type match handlers configuration end end + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: With transport.options.expiration Calculate isExpired + alt if transport.options.expiration > 0 && isExpired === true + break from loop + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with state.status='expired' + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop + end + end + + NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration \nError code: 1001 + alt if state.retry-count < transport.options.retry.count group Delivery Success NOTIFY_HANDLER_CMD -> PARTICIPANT: Send Notification to \nPayer DFSP to specified Endpoint \nError code: 1001 NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP Response break from loop + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with Response.info & state.status='success' NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop end else Handle Delivery Failure @@ -421,6 +432,7 @@ alt If transport.type && transport.content-type match handlers configuration end alt if Failure.type is NOT of type transport.options.retry.condition break from loop + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with Failure.reason='retry-condition not met', and state.status='failed' NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop end end @@ -430,6 +442,7 @@ alt If transport.type && transport.content-type match handlers configuration ' alt transport.options.deliver-report === true ' NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with failure reason 'max retries-attempts exceeded' ' end + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with Failure.reason='max retry attempts' & state.status='failed' NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop end end @@ -438,8 +451,8 @@ alt If transport.type && transport.content-type match handlers configuration alt transport.options.deliver-report === true NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report (NotifyReport) - - NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification statewith delivery report details and state.status='success' || 'failure' + + NOTIFY_HANDLER_CMD -> NOTIFYDB: Update Notification state with Delivery Report NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyReport event activate TOPIC_NOTIFICATIONS_EVT @@ -448,15 +461,6 @@ alt If transport.type && transport.content-type match handlers configuration deactivate TOPIC_NOTIFICATIONS_CMD deactivate NOTIFY_HANDLER_CMD - ' TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyReport event - ' deactivate TOPIC_NOTIFICATIONS_EVT - ' activate NOTIFY_HANDLER_EVT - - ' NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyReport event - ' deactivate NOTIFY_HANDLER_EVT - ' activate TOPIC_NOTIFICATIONS_EVT - ' deactivate TOPIC_NOTIFICATIONS_EVT - TOPIC_NOTIFICATIONS_EVT <- MLCALLBACKHANDLER: Consume NotifyReport event deactivate TOPIC_NOTIFICATIONS_EVT activate MLCALLBACKHANDLER @@ -471,6 +475,9 @@ alt If transport.type && transport.content-type match handlers configuration else NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification + NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event + deactivate TOPIC_NOTIFICATIONS_CMD + deactivate NOTIFY_HANDLER_CMD end end From a1b4260b3631a2a7e99605c155d18103cfc4ea5c Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 30 Mar 2021 19:35:00 +0200 Subject: [PATCH 34/39] updates to notification design v2 - included more detail on re-try logic, and recovery from failures --- mojaloop-technical-overview/notifications/README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 66aeac123..a548b61bd 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -61,7 +61,9 @@ This design proposes the seperation of the current Notification capabilities (tr | NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler as a result of the NotifyReady event. | | | NotifyReport | Domain event message to broadcast Delivery reports within the Notification Engine and Callback Handlers (for compensating actions). This event is consumed by the Notification Evt Handler and persisted for reporting and compensating purposes. | | -### 2.4. Notification Aggregate internal States +### 2.4. Notification Aggregate + +The Notification aggregate manages the Notification Entity with the following states: | State | Description | Notes | | --- | --- | --- | @@ -71,6 +73,8 @@ This design proposes the seperation of the current Notification capabilities (tr | failure | Indicates that the NotifyCmd event processing has failed, and the Notification was not delivered. | | | expired | Indicates that the NotifyCmd event processing has expired, and the Notification was not delivered. | | +The aggregate-id should be used as the Kafka message-key for NotifyCmd events. This will optmize the notification processing by ensuring that a consistent Notification Cmd Handler instance will always process that specific entity, thereby allowing us to reduce repository access by leveraging in-memory caching capabilties for queries. + ## 3. Models #### 3.2.1. Events @@ -124,7 +128,7 @@ This design proposes the seperation of the current Notification capabilities (tr } ``` -#### 3.2.1.b. Notification Ready produced by Mojaloop Adapter Callback Handler +#### 3.2.1.b. Notification Ready produced by Mojaloop Adapter Callback Handler ( TO BE UPDATED! ) ##### 3.2.1.b.i. Schemas @@ -213,7 +217,7 @@ The Notification Cmd Handler will only commit the Kafka message once a final sta The Mojaloop Adapter - FSPIOP Callback Handler (or any other Callback Handler) is able to action compensating actions by processing the NotifyReport domain event. Note that the NotifyReport will only be published by the Notification Engine if the transport.options.deliver-report field is set to true on the NotifyReady domain event. The capabilities for the rule processor must support the following operations: -- Create a new (not a duplicate) NotifiyReady request event. This can be used by any Callback Handler to execute additional retry logic that is specific to its own context (i.e. FPSIOP, ISO20022, etc), or instead soley handle retry logic by disabling retries on the Notification Engine (i.e. transport.options.retry.count=). +- Create a new (not a duplicate) NotifiyReady request event. This can be used by any Callback Handler to execute additional retry logic that is specific to its own context (i.e. FPSIOP, ISO20022, etc), or instead soley handle retry logic by disabling retries on the Notification Engine (i.e. transport.options.retry.count=0). - Notify Central-Services of the NotifyReport results. This can be used by the Central-Services to inform the Timeout handler of the expiration. From a471c4285af90134bca0456d944f892cb5a430c4 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 31 Mar 2021 11:33:21 +0200 Subject: [PATCH 35/39] updates to notification design v2 - included more detail on re-try logic, and recovery from failures --- .../notifications/README.md | 446 ++++++++++++++- ...y-Engine-Multiple-Context-Example-v2.0.svg | 3 + ...Engine-Multiple-Transport-Example-v2.0.svg | 3 + ...rch-End-to-End-with-Notify-Engine-v2.0.svg | 2 +- .../assets/schemas/eventNotifyCmd.schema.json | 22 +- .../schemas/eventNotifyReady.schema.json | 534 ++++++++++++++++++ ...ema.json => eventNotifyReport.schema.json} | 0 7 files changed, 988 insertions(+), 22 deletions(-) create mode 100644 mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Context-Example-v2.0.svg create mode 100644 mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v2.0.svg create mode 100644 mojaloop-technical-overview/notifications/assets/schemas/eventNotifyReady.schema.json rename mojaloop-technical-overview/notifications/assets/schemas/{notifyReport.schema.json => eventNotifyReport.schema.json} (100%) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index a548b61bd..3feb1c6dd 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -2,18 +2,23 @@ This document will discuss the architecture and design of Mojaloop's Notification-engine. +| Versrion | Date | Name(s) | Description | +| --- | --- | --- | --- | +| v1.0-draft.0 | 2021-02-25 | Miguel de Barros | Initial version. | +| v1.0-draft.1 | 2021-03-15 | Miguel de Barros | Incorporated comments from DA, and expanded on detailed design elements. | +| v1.0-draft.2 | 2021-03-31 | Miguel de Barros | Re-aligned to the Reference Architecture Stream - updates to diagram, seq, etc. Added new NotifyReady domain event, and added expiration capability to the Notification Engine to ensure consistency. Updated scenarios to include failures, and added additional multiple context example. | +| | | | | + + ## 1. Requirements ``` -1.1. Notification-engine must be stateless - a. Notification messages consumed by the Notification-engine contains everything needed to send notifications - -1.2. Notification messages must support +1.1. Notification messages must support a. Config included to indicate that the message must be reliably delivered b. Notification transport (i.e. HTTP, gRPC, Email, etc) c. End-point details to deliver the notification -1.3. Reliability +1.2. Reliability a. Notification-engine must support retries based on a configuration b. HTTP keep-alive must be configured for HTTP transports c. A delivery-report must be published to a kafka event topic indicating the result of the notification: @@ -21,7 +26,7 @@ This document will discuss the architecture and design of Mojaloop's Notificatio ii. meta-data: request-timestamp, delivery-timestamp, request-latency d. Delivery-reports events must be persisted into a data-store -1.4. Notification-engine must be support the following ingress: +1.3. Notification-engine must be support the following ingress: a. Consuming event messages from a Kafka topic i. Notification message JSON schema b. An API for sending notifications @@ -37,7 +42,7 @@ This design proposes the seperation of the current Notification capabilities (tr | Components | Description | APIs | Notes | | --- | --- | --- | --- | -| ML-Adapter Callback Handler | This component understands the context and semantics of the FSPIOP Specification. Consumes existing Notification (internal) events, then interprates (in context of Mojaloop use-cases) those events into an appropriate event message to some explicit receipient. Also handles feedback loop and compensating actions (defined by configurable rules) from Delivery Reports. It must also resolve any notification details required (i.e. URLs, transport type, etc) by querying the Central-Service's Admin API. | N/A | This component is part of the "ML-API-Adapter" | +| ML-Adapter Callback Handler | This component understands the context and semantics of the FSPIOP Specification. Consumes existing Notification (internal) events, then interprates (in context of Mojaloop use-cases) those events into an appropriate event message to some explicit receipient. Also handles feedback loop and compensating actions (defined by configurable rules) from Delivery Reports. It must also resolve any notification details required (i.e. URLs, transport type, etc) by querying the Central-Service's Admin API. This component is pluggable, and the design supports the possibility of several Callback Handlers existing for several specific transports or alternatively to support different context languages like ISO 20022. | N/A | This component is part of the "ML-API-Adapter" | | Notification Evt Handler | Consumes existing Notification events, then interprates (without contextual dependencies) those events into an appropriate NotifyCmd. | API operations to request notifications (async & sync) and query stored deliveryReports | This component is a "Supporting-Service" | | Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistence or caching stores. This allows for multiple pluggable Cmd Handlers to exist to handle different combinations of transports (transport.type) and content-types(transpport.contentType) as required. This component will also manage message and transport security aspects such as TLS (Transport Layer Security) and JWS Signing for HTTP transports. | API operations to send notifications synchronously | This component is a "Supporting-Service" | @@ -79,7 +84,7 @@ The aggregate-id should be used as the Kafka message-key for NotifyCmd events. T #### 3.2.1. Events -#### 3.2.1.a. Notification event produced by Central-Services (Existing) +#### 3.2.1.a. Notification - Notification event produced by Central-Services (Existing) ##### 3.2.1.a.ii. Examples ```JSON @@ -128,7 +133,7 @@ The aggregate-id should be used as the Kafka message-key for NotifyCmd events. T } ``` -#### 3.2.1.b. Notification Ready produced by Mojaloop Adapter Callback Handler ( TO BE UPDATED! ) +#### 3.2.1.b. NotifyReady - Notification Ready produced by Mojaloop Adapter Callback Handler ##### 3.2.1.b.i. Schemas @@ -137,10 +142,60 @@ The aggregate-id should be used as the Kafka message-key for NotifyCmd events. T ##### 3.2.1.b.ii. Examples ```JSON - +{ + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyReady", + "msgType": "Domain", + "msgTopic": "NotificationEvents", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "notifyType": "transferFulfiled", + "transport": { + "type": "HTTP", + "method": "GET", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + }, + "expiration": 2000 + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payeefsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} ``` -#### 3.2.1.c. Notification Command produced by Notificant Evt Handler +#### 3.2.1.c. NotifyCmd - Notification Command produced by Notificant Evt Handler ##### 3.2.1.c.i. Schemas @@ -148,9 +203,63 @@ The aggregate-id should be used as the Kafka message-key for NotifyCmd events. T ##### 3.2.1.c.ii. Examples -#### 3.2.1.d. Delivery-report Event produced by Notification Cmd Handler +```JSON +{ + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": "Command", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "notifyType": "transferFulfiled", + "transport": { + "type": "HTTP", + "method": "GET", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + }, + "expiration": 2000 + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payeefsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + +#### 3.2.1.d. NotifyReport - Delivery-report Event produced by Notification Cmd Handler ##### 3.2.1.d.i. Schemas -[NotifyReport.schema.json](assets/schemas/notifyReport.schema.json) +[eventNotifyReport.schema.json](assets/schemas/eventNotifyReport.schema.json) ##### 3.2.1.d.ii. Examples @@ -204,7 +313,7 @@ The aggregate-id should be used as the Kafka message-key for NotifyCmd events. T Notification Cmd Handler uses either a cached or persistent repository (depending on requirements) to store the Notification state. -Once the NotifyCmd is consumed by the Notification Cmd Handler, the managed state within the cached/persistent repository will ensure that the Handler will be able to recover from any mid-processing interruptions. The NotifyCmd event will then be re-loaded the state from the repository, and process the notification accordingly: +Once the NotifyCmd is consumed by the Notification Cmd Handler, the managed state within the cached/persistent repository will ensure that the Handler will be able to recover from any mid-processing interruptions. The NotifyCmd event will trigger a re-load of the Notification state from the repository, and process the notification accordingly: - The Notification will be ignored if the state.status is either `success`, `failed` or `expired`. - The NotifyCmd will be processed from its last retry-attempt if the state.status = `in-progress` @@ -212,6 +321,8 @@ Once the NotifyCmd is consumed by the Notification Cmd Handler, the managed stat The Notification Cmd Handler will only commit the Kafka message once a final state (i.e. `success`, `failed` or `expired`) has been persisted, thus ensuring the that the message will be re-processed as a result of any interupptions. +The expiration capability supported by the Notification Engine will ensure that a Notification Cmd Event will not be continously retried, and will instead end up in a final state of `expired` once the expiration lapses. + ##### 4.1.2. Compensating Actions The Mojaloop Adapter - FSPIOP Callback Handler (or any other Callback Handler) is able to action compensating actions by processing the NotifyReport domain event. Note that the NotifyReport will only be published by the Notification Engine if the transport.options.deliver-report field is set to true on the NotifyReady domain event. @@ -227,9 +338,9 @@ There are two approaches to handle unavailable/interruptions to Callback Handler - the existing Mojaloop Timeout process will manage any transfers that are not in a final commited or aborted state. This could result in a notification being delivered while in parallel the associated transfer is timed-out by the Central-Services, and thus to consistency issues. - the existing Timeout process will ignore any transfers that are queued for notification, and instead wait for a compensating action from the FSPIOP Callback Handler. This will ensure consistency and is the recommended approach. -### 4.2. Multiple Transports ( TO BE UPDATED! ) +### 4.2. Multiple Transports -![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v1.0.svg) +![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v2.0.svg) The above scenario depicts two FSPs each utilsing two different transports for FSPIOP Transfer interactions: - FSP1 (payer) is using HTTP transport @@ -259,10 +370,309 @@ Content-Type: application/json } ``` -With this design it is possible to achieve this by introducing two different ML-API-Adapters for each of the different Transports (i.e. HTTP, gRPC), and similiarly two different Notification Engines for each of these transports handling callbacks. +With this design it is possible to achieve this by introducing multiple Notification Cmd Handlers within the Notification Engine to handle different Transports (i.e. HTTP, gRPC). In addition, multiple matching ML-Adapters would need to similiar exist to support the associated inbound request. -Each of the Notification Engines will only listen to event messages that match their intended transport types, and will thus discard non-applicable ones. +Each of the Notification Cmd Handlers will only listen to event messages that match their intended transport types, and will thus discard non-applicable ones. This therefore allows the Central-Ledger components to be isolated from the transport specific logic (and transformations if applicable) for notification callbacks. The delivery-report for each of the POST/PUT interactions provides the assurance that the notifications results are recorded by the Central-Service Notification-Evt-Handler component. This component is able to raise alerts or alternatively handle any compensating actions independantly of the FSP's transport preferences. + +The transferId is mapped to the notifyId field below. This allows one to query a Notification resuls by correlating the notifyId with the transferId. + +#### 4.2.a. gRPC Transport example for a POST Transfer Callback Notification Messages for FSP1 to FSP2 + +NotifyReady Domain Event: +```JSON +{ + "msgId": "d9e5c681-8489-46ff-880f-8de822b3c521", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyReady", + "msgType": "Domain", + "msgTopic": "NotificationEvents", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "notifyType": "transferPrepared", + "transport": { + "type": "GRPC", + "method": "POST", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "fsp2.com/transfers" + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "exponentialDelay", + "condition": "isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "FSP1", + "fspiop-destination": "FSP2" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-PREPARE-REQUEST" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + +NotifyCmd Command Event: +```JSON +{ + "msgId": "66a2ec9a-9d4f-4439-8d38-19c3aa21d54e", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": "Command", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "notifyType": "transferPrepared", + "transport": { + "type": "GRPC", + "method": "POST", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "fsp2.com/transfers" + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "exponentialDelay", + "condition": "isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "FSP1", + "fspiop-destination": "FSP2" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-PREPARE-REQUEST" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + +NotifyReport Domain Event: +```JSON +{ + "msgId": "0ee9331a-1a71-4efc-a22d-868fcbf59658", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyReport", + "msgType": "Domain", + "msgTopic": "NotificationEvents", + "msgPartition": null, + "msgTimestamp": 2007677081820, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "notifyType": "transferPrepared", + "report": { + "requestTimestamp": 1507677081120, + "deliveryTimestamp": 1607677081840, + "deliveryReqLatency": 100, + "retryAttempts": 0, + "response": { + "statusCode": "0", + "statusDescription": "OK", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}", + }, + "accepted": true + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-Cmd-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + + +#### 4.2.b. HTTP Transport example for a PUT Transfer Callback Notification Messages for FSP2 to FSP1 + +NotifyReady Command Event: +```JSON +{ + "msgId": "a553f7fd-6e4e-4799-b145-c469eca2da05", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyReady", + "msgType": "Domain", + "msgTopic": "NotificationEvents", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "notifyType": "transferFulfilled", + "transport": { + "type": "HTTP", + "method": "PUT", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "fsp2.com/transfers/{{transferId}}", + "params": { + "transferId": "861b86e6-c3da-48b3-ba17-896710287d1f" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "exponentialDelay", + "condition": "isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "FSP2", + "fspiop-destination": "FSP1" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-FULFIL-REQUEST" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + +NotifyCmd Command Event: +```JSON +{ + "msgId": "6db168a3-61bd-485b-9921-b7012651243e", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyCmd", + "msgType": "Command", + "msgTopic": "NotificationCommands", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "notifyType": "transferFulfilled", + "transport": { + "type": "HTTP", + "method": "PUT", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "fsp2.com/transfers/{{transferId}}", + "params": { + "transferId": "861b86e6-c3da-48b3-ba17-896710287d1f" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "exponentialDelay", + "condition": "isNetworkOrIdempotentRequestError" + } + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "FSP2", + "fspiop-destination": "FSP1" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ENCODED-FULFIL-REQUEST" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + +NotifyReport Domain Event: +```JSON +{ + "msgId": "cfa82358-7a92-42bd-8943-f37d22784b15", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyReport", + "msgType": "Domain", + "msgTopic": "NotificationEvents", + "msgPartition": null, + "msgTimestamp": 2007677081820, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "b17b7125-a0fc-451f-98ee-7e4c870c7d13", + "notifyType": "transferFulfilled", + "report": { + "requestTimestamp": 1507677081120, + "deliveryTimestamp": 1607677081840, + "deliveryReqLatency": 100, + "retryAttempts": 1, + "response": { + "statusCode": "200", + "statusDescription": "Ok", + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z" + }, + "body": "{}", + }, + "accepted": true + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-Cmd-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } +} +``` + +### 4.3. Multiple Context Languages + +This is an example of how a synchronous ISO Payer FSP could be send a Transfer through a Mojaloop Switch. The Payee FSP in the example only supports FSPIOP for inbound requests and callbacks. + +A ML-Adapter would need to be developed to support the Inbound Synchronous ISO 20022 PAIN.013 request being received by the Payer FSP. As the Payer FSP expects a syncrhonous response, there is no need to utilise the Notification Engine for the response. The adapter instead will keep the request connection alive to the Payer FSP and correlate the fulfillment notification published by the Central-Services. The adapter will transporm the result into a PACS.008 message before responding synchronous to the Payer FSP. + +The ML-Adapter for ISO 20022 processing will however listen for NotifyReport events produced by the Notification Engine to handle any comepensating actions as a result of Transfer Prepare notification errors. + +![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Context-Example-v2.0.svg) diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Context-Example-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Context-Example-v2.0.svg new file mode 100644 index 000000000..980167dab --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Context-Example-v2.0.svg @@ -0,0 +1,3 @@ + + +
Notification
Engine
Notification...
ML-Adapter (FSPIOP)
ML-Adapter (FSPIOP)
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter (ISO 20022)
ML-Adapter (ISO 20022)
ISO Sync 
Inbound API
ISO Sync...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(ISO Payer)
FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
2.7
ISO
pacs.008
2.7...
FSPIOP
Callback
Handler
FSPIOP...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
1.7 Prepare Notify /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 
Publish
Delivery Report
1.7.2...
1.6.3 /1.7.3
Record Notify 
Success / Failure
1.6.3 /1.7.3...
1.6.5 / 2.6.5
Publish
Notify
Command
1.6.5 / 2.6.5...
Admin API
Admin API
FSPIOP
Callback
Handler
FSPIOP...
2.6.1
Process Fulfil 
Notification
2.6.1...
FSPIOP
Transfer API
(Fulfil)
FSPIOP...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Notifications
Store
Notification...
Notification Evt
Handler
Notification E...
2.6.2
Waiting
synchronously Fulfilment
2.6.2...
1.0
ISO
pain.013
1.0...
Sync
Request / Response
Sync...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v2.0.svg new file mode 100644 index 000000000..47f0cdd6e --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v2.0.svg @@ -0,0 +1,3 @@ + + +
Notification
Engine
Notification...
ML-Adapter (gRPC)
ML-Adapter (gRPC)
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter (HTTP)
ML-Adapter (HTTP)
FSPIOP 
Transfer API
(Prepare)
FSPIOP...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
FSPIOP
Callback
Handler
FSPIOP...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK)
2.2 OK)
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK
1.7.1 OK
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(gRPC)
Notification Cmd H...
Notifications
Store
Notification...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5
Publish
Notify
Command
1.6.5 / 2.6.5...
Admin API
Admin API
FSPIOP
Callback
Handler
FSPIOP...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
FSPIOP
Transfer API
(Fulfil)
FSPIOP...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notifications
Commands
Notificati...
Notification Evt
Handler
Notification E...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg index 01eeedc5b..6fb0b46d5 100644 --- a/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg +++ b/mojaloop-technical-overview/notifications/assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-v2.0.svg @@ -1,3 +1,3 @@ -
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
FSPIOP 
Transfer API
(Prepare)
FSPIOP...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
FSPIOP
Callback
Handler
FSPIOP...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notification Evt
Handler
Notification E...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5 Publish Notify
Command
1.6.5 / 2.6.5 Publish Notify...
Admin API
Admin API
FSPIOP
Callback
Handler
FSPIOP...
2.6.1
Process Prepare
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
FSPIOP
Transfer API
(Fulfil)
FSPIOP...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Notification
Engine
Notification...
ML-Adapter
ML-Adapter
1.5 Increment Position (fsp1)
1.5 Increment Position (fsp1)
1.4 Increment
Position (fsp1)

1.4 Increment...
PrepareHandler
PrepareHandler
PositionHandler
PositionHandler
Fulfil
Sucess
Fulfil...
2.4 Fulfil
Success
2.4 Fulfil...
<alt> 2.4 
Fulfil Reject

<alt> 2.4...
Fulfil
Reject
Fulfil...
<alt> 2.5 Decrement
Position (fsp1)

<alt> 2.5 Decrement...
<alt>1.6 Reject Notification
(Not enough position)

<alt>1.6...
Central - Services
Central - Services
3.0 Reject
3.0 Reject
2.6 Fulfil Notification /
 <alt> 2.6 Reject Notification (Fulfil) /
3.2 Reject Notification (Timeout)

2.6 Fulfil Notification /...
1.0 Transfer 
Request

1.0 Transfer...
3.1 Decrement
Position (fsp1)

3.1 Decrement...
1.6 Prepare Notification
1.6 Prepare Notification
ML-Adapter
ML-Adapter
FSPIOP 
Transfer API
(Prepare)
FSPIOP...
fsp prepare
fsp prep...
1.3 Prepare Consume
1.3 Prepare Consume
notifications
(internal)
notificati...
FSP1
(Payer)

FSP1...
FSP2
(Payee)
FSP2...
1.1
Prepare Request
1.1...
1.2 Accepted
(202)
1.2 Accepted...
FSPIOP
Callback
Handler
FSPIOP...
2.0 Fulfil 
Success / 
Reject

2...
fulfils
fulfils
FulfilHandler
FulfilHandler
Success/
Reject
Success/...
2.5 Decrement
Position (fsp2)

2.5 Decrement...
2.1 Fulfil 
Success / Reject

2.1 Fulfil...
2.2 OK
(200)
2.2 OK...
2.3 Fulfil
Success /
Reject
Consume
2.3 Fulfil...
2.7.1 OK (200)
2.7.1 OK (200)
1.7.1 OK (200)
1.7.1 OK (200)
Transfer Timeout
Handler
Transfer Timeout...
<alt> 1.4 Prepare Failure
<alt> 1.4 Prepare Failure
<alt> 2.4 Fulfil Failure
<alt>...
2.7 Fulfil Notify Callback /
<alt> 2.7 Reject Response (Fulfil reject) /
3.1, 3.3 Reject Response (Timeout) /
<alt> 1.7 Reject Response (Not enough position)
<alt> 1.5 Prepare Failure 

2.7 Fulfil Notify Callback /...
1.7 Prepare Notify /
2.8 Commit Notify (if transfer reserved) /
<alt> 2.7 Reject Response (Fulfil reject)
3.3 Reject Response (Timeout)
<alt> 2.5 Fulfil Failure

1.7 Prepare Notify /...
position
position
Notification Cmd Handler
(HTTP)
Notification Cmd H...
Notifications
Commands
Notificati...
Notification
Events
Notificati...
1.7.2 / 2.7.2
Publish
Delivery Report
1.7.2 / 2.7.2...
1.6.3 / 2.6.3 Req Notify
1.7.3 /  / 2.7.3 Record Notify 
Success / Failure
1.6.3 / 2.6.3 Req Notify...
2.6.4 Retrieve
Endpoints
2.6.4 Retrieve...
1.6.5 / 2.6.5
Publish
Notify
Command
1.6.5 / 2.6.5...
Admin API
Admin API
FSPIOP
Callback
Handler
FSPIOP...
2.6.1
Process Fulfil 
Notification
2.6.1...
2.6.3
Request 
Notification
2.6.3...
FSPIOP
Transfer API
(Fulfil)
FSPIOP...
1.6.2
Request 
Notification
1.6.2...
1.6.1
Process Prepare
Notification
1.6.1...
1.6.4 Retrieve
Endpoints
1.6.4 Retrieve...
Handle Compensating Actions
Handle Compensat...
Handle Compensating Actions
Handle Compensat...
Notifications
Store
Notification...
Notification Evt
Handler
Notification E...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json index ffae10f1f..b5c3014cf 100644 --- a/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json +++ b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyCmd.schema.json @@ -17,6 +17,7 @@ "aggregateName": "Notifications", "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "notifyType": "transferFulfiled", "transport": { "type": "HTTP", "method": "GET", @@ -43,7 +44,7 @@ "headers": { "content-type": "application/vnd.interoperability.transfers+json;version=1.0", "date": "2019-05-28T16:34:41.000Z", - "fspiop-source": "payerfsp", + "fspiop-source": "payeefsp", "fspiop-destination": "payerfsp" }, "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" @@ -97,9 +98,11 @@ "type": "string", "title": "The msgName schema", "description": "Name of the message.", - "default": "", + "default": "NotifyCmd", "examples": [ - "NotifyCmd" + "NotifyCmd", + "NotifyReady", + "NotifyReport" ] }, "msgType": { @@ -173,6 +176,19 @@ "3920382d-f78c-4023-adf9-0d7a4a2a3a2f" ] }, + "notifyType": { + "$id": "#/properties/notifyType", + "type": "string", + "title": "The notifyType schema", + "description": "Name of process/event that triggered this this Notification", + "default": "", + "examples": [ + "transferPrepared", + "transferFulfiled", + "transferAborted", + "transferTimedout" + ] + }, "transport": { "$id": "#/properties/transport", "type": "object", diff --git a/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyReady.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyReady.schema.json new file mode 100644 index 000000000..85d4e44ef --- /dev/null +++ b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyReady.schema.json @@ -0,0 +1,534 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "http://mojaloop.io/events/notifications/NotifyReady", + "type": "object", + "title": "NotifyReady", + "description": "Notification Ready event produced by a Callback Handler", + "default": {}, + "examples": [ + { + "msgId": "18efb9ea-d29a-42b9-9b30-59e1e7cfe216", + "msgKey": "861b86e6-c3da-48b3-ba17-896710287d1f", + "msgName": "NotifyReady", + "msgType": "Domain", + "msgTopic": "NotificationEvents", + "msgPartition": null, + "msgTimestamp": 1607677081837, + "aggregateName": "Notifications", + "aggregateId": "861b86e6-c3da-48b3-ba17-896710287d1f", + "notifyId": "3920382d-f78c-4023-adf9-0d7a4a2a3a2f", + "notifyType": "transferFulfiled", + "transport": { + "type": "HTTP", + "method": "GET", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + }, + "expiration": 2000 + } + }, + "payload": { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payeefsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + }, + "traceInfo": { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } + } + ], + "required": [ + "msgId", + "msgKey", + "msgName", + "msgType", + "msgTopic", + "msgTimestamp", + "aggregateName", + "aggregateId", + "notifyId", + "transport", + "payload", + "traceInfo" + ], + "properties": { + "msgId": { + "$id": "#/properties/msgId", + "type": "string", + "title": "The msgId schema", + "description": "Unique identifier for this message. Generated by the NotificationEvtHandler.", + "default": "", + "examples": [ + "18efb9ea-d29a-42b9-9b30-59e1e7cfe216" + ] + }, + "msgKey": { + "$id": "#/properties/msgKey", + "type": "string", + "title": "The msgKey schema", + "description": "Mapped from the aggregateId, used by Kafka for Key-partitioning.", + "default": "", + "examples": [ + "861b86e6-c3da-48b3-ba17-896710287d1f" + ] + }, + "msgName": { + "$id": "#/properties/msgName", + "type": "string", + "title": "The msgName schema", + "description": "Name of the message.", + "default": "NotifyReady", + "examples": [ + "NotifyCmd", + "NotifyReady", + "NotifyReport" + ] + }, + "msgType": { + "$id": "#/properties/msgType", + "type": "string", + "title": "The msgType schema", + "description": "Type of message.", + "default": "", + "examples": [ + "Command", + "Domain" + ] + }, + "msgTopic": { + "$id": "#/properties/msgTopic", + "type": "string", + "title": "The msgTopic schema", + "description": "Topic that the message will be published & consumed from.", + "default": "", + "examples": [ + "NotificationCommands" + ] + }, + "msgPartition": { + "$id": "#/properties/msgPartition", + "type": "null", + "title": "The msgPartition schema", + "description": "Optional Kafka partition used for publishing the message to the msgTopic.", + "default": null, + "examples": [ + null + ] + }, + "msgTimestamp": { + "$id": "#/properties/msgTimestamp", + "type": "integer", + "title": "The msgTimestamp schema", + "description": "Epoch/Unix timestamp of message creation.", + "default": 0, + "examples": [ + 1607677081837 + ] + }, + "aggregateName": { + "$id": "#/properties/aggregateName", + "type": "string", + "title": "The aggregateName schema", + "description": "Aggregate name", + "default": "", + "examples": [ + "Notifications" + ] + }, + "aggregateId": { + "$id": "#/properties/aggregateId", + "type": "string", + "title": "The aggregateId schema", + "description": "Aggregate identifier", + "default": "", + "examples": [ + "861b86e6-c3da-48b3-ba17-896710287d1f" + ] + }, + "notifyId": { + "$id": "#/properties/notifyId", + "type": "string", + "title": "The notifyId schema", + "description": "Correlation identifier for the event that triggerd this Notification", + "default": "", + "examples": [ + "3920382d-f78c-4023-adf9-0d7a4a2a3a2f" + ] + }, + "notifyType": { + "$id": "#/properties/notifyType", + "type": "string", + "title": "The notifyType schema", + "description": "Name of process/event that triggered this this Notification", + "default": "", + "examples": [ + "transferPrepared", + "transferFulfiled", + "transferAborted", + "transferTimedout" + ] + }, + "transport": { + "$id": "#/properties/transport", + "type": "object", + "title": "The transport schema", + "description": "Transport specifics for the Notification", + "default": {}, + "examples": [ + { + "type": "HTTP", + "method": "GET", + "contentType": "application/vnd.interoperability.transfers+json;version=1.0", + "recipient": { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + }, + "options": { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + } + ], + "required": [ + "type", + "method", + "contentType", + "recipient" + ], + "properties": { + "type": { + "$id": "#/properties/transport/properties/type", + "type": "string", + "title": "The type schema", + "description": "The transport type.", + "default": "", + "examples": [ + "HTTP" + ] + }, + "method": { + "$id": "#/properties/transport/properties/method", + "type": "string", + "title": "The method schema", + "description": "The method associated to the transport.", + "default": "", + "examples": [ + "GET" + ] + }, + "contentType": { + "$id": "#/properties/transport/properties/contentType", + "type": "string", + "title": "The contentType schema", + "description": "The Content Type used to determine the API language and version.", + "default": "", + "examples": [ + "application/vnd.interoperability.transfers+json;version=1.0" + ] + }, + "recipient": { + "$id": "#/properties/transport/properties/recipient", + "type": "object", + "title": "The recipient schema", + "description": "The Recipient information for the Notification.", + "default": {}, + "examples": [ + { + "endpoint": "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}", + "params": { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + } + ], + "required": [ + "endpoint" + ], + "properties": { + "endpoint": { + "$id": "#/properties/transport/properties/recipient/properties/endpoint", + "type": "string", + "title": "The endpoint schema", + "description": "The transport specific endpoint for the Notification delivery.", + "default": "", + "examples": [ + "http://fsp.com/parties/{{partyIdType}}/{{partyId}}}?key={{value}}" + ] + }, + "params": { + "$id": "#/properties/transport/properties/recipient/properties/params", + "type": "object", + "title": "The params schema", + "description": "Optional params that can be used by the Notification Command Handler for routing/processing, or alternatively used to render the endpoint if it is represented as a template.", + "default": {}, + "examples": [ + { + "partyIdType": "MSISDN", + "partyId": "12345", + "value": "ABCD" + } + ], + "required": [], + "additionalProperties": {"type": "string"} + } + }, + "additionalProperties": true + }, + "options": { + "$id": "#/properties/transport/properties/options", + "type": "object", + "title": "The options schema", + "description": "The Notification options.", + "default": {}, + "examples": [ + { + "deliveryReport": true, + "retry": { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + } + ], + "required": [ + "deliveryReport" + ], + "properties": { + "deliveryReport": { + "$id": "#/properties/transport/properties/options/properties/deliveryReport", + "type": "boolean", + "title": "The deliveryReport schema", + "description": "Indicates if a delivery report is required.", + "default": false, + "examples": [ + true + ] + }, + "retry": { + "$id": "#/properties/transport/properties/options/properties/retry", + "type": "object", + "title": "The retry schema", + "description": "Retry options.", + "default": {}, + "examples": [ + { + "count": 3, + "type": "noDelay|exponentialDelay", + "condition": "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + } + ], + "required": [ + "count", + "type", + "condition" + ], + "properties": { + "count": { + "$id": "#/properties/transport/properties/options/properties/retry/properties/count", + "type": "integer", + "title": "The count schema", + "description": "The number of retry attempts.", + "default": 3, + "examples": [ + 3 + ] + }, + "type": { + "$id": "#/properties/transport/properties/options/properties/retry/properties/type", + "type": "string", + "title": "The type schema", + "description": "The type of retry policy. Ref: https://developers.google.com/analytics/devguides/reporting/core/v3/errors#backoff", + "default": "exponentialDelay", + "examples": [ + "noDelay|exponentialDelay" + ] + }, + "condition": { + "$id": "#/properties/transport/properties/options/properties/retry/properties/condition", + "type": "string", + "title": "The condition schema", + "description": "The condition for retries. By default retries will occur on a network error or a 5xx error on an idempotent request (GET, HEAD, OPTIONS, PUT or DELETE)", + "default": "isNetworkOrIdempotentRequestError", + "examples": [ + "isNetworkError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" + ] + } + }, + "additionalProperties": false + }, + "expiration": { + "$id": "#/properties/transport/properties/options/properties/expiration", + "type": "integer", + "title": "The expiration schema", + "description": "The relative expiration value. 0 is indicates that there is no expiration.", + "default": 0, + "examples": [ + 2000 + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "payload": { + "$id": "#/properties/payload", + "type": "object", + "title": "The payload schema", + "description": "The payload of the notification which includes a Header (if applicable) and Body.", + "default": {}, + "examples": [ + { + "headers": { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payerfsp", + "fspiop-destination": "payerfsp" + }, + "body": "data:application/vnd.interoperability.transfers+json;version=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + } + ], + "required": [ + "body" + ], + "properties": { + "headers": { + "$id": "#/properties/payload/properties/headers", + "type": "object", + "title": "The headers schema", + "description": "An explanation about the purpose of this instance.", + "default": {}, + "examples": [ + { + "content-type": "application/vnd.interoperability.transfers+json;version=1.0", + "date": "2019-05-28T16:34:41.000Z", + "fspiop-source": "payerfsp", + "fspiop-destination": "payerfsp" + } + ], + "required": [], + "additionalProperties": {"type": "string"} + }, + "body": { + "$id": "#/properties/payload/properties/body", + "type": "string", + "title": "The body schema", + "description": "An explanation about the purpose of this instance.", + "default": "", + "examples": [ + "data:application/vnd.interoperability.transfers+json;v1ersion=1.0;base64,ewogICJmdWxmaWxtZW50IjogIlVObEo5OGhaVFlfZHN3MGNBcXc0aV9VTjN2NHV0dDdDWkZCNHlmTGJWRkEiLAogICJjb21wbGV0ZWRUaW1lc3RhbXAiOiAiMjAxOS0wNS0yOVQyMzoxODozMi44NTZaIiwKICAidHJhbnNmZXJTdGF0ZSI6ICJDT01NSVRURUQiCn0" + ] + } + }, + "additionalProperties": false + }, + "traceInfo": { + "$id": "#/properties/traceInfo", + "type": "object", + "title": "The traceInfo schema", + "description": "Distributed tracing metadata for the event.", + "default": {}, + "examples": [ + { + "traceParent": "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21", + "traceState": "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==", + "service": "notification-evt-handler", + "startTimestamp": 1607677081837, + "finishTimestamp": 2007677081838 + } + ], + "required": [ + "traceParent", + "traceState", + "service", + "startTimestamp", + "finishTimestamp" + ], + "properties": { + "traceParent": { + "$id": "#/properties/traceInfo/properties/traceParent", + "type": "string", + "title": "The traceParent schema", + "description": "Identifier for the incoming request in a tracing system. Ref: https://w3c.github.io/trace-context/#traceparent-header", + "default": "", + "examples": [ + "00-8e540e87060d56a2d2e0be5d732791e7-d96a5971b7c5cac6-21" + ] + }, + "traceState": { + "$id": "#/properties/traceInfo/properties/traceState", + "type": "string", + "title": "The traceState schema", + "description": "Provides additional vendor-specific trace identification information across different distributed tracing systems and is a companion header for the traceparent field. Ref: https://w3c.github.io/trace-context/#tracestate-header", + "default": "", + "examples": [ + "acmevendor=eyJzcGFuSWQiOiJkOTZhNTk3MWI3YzVjYWM2IiwidGltZUFwaVByZXBhcmUiOiIxNjA3Njc3MDgxNzAwIiwidGltZUFwaUZ1bGZpbCI6IjE2MDc2NzcwODE4MTkifQ==" + ] + }, + "service": { + "$id": "#/properties/traceInfo/properties/service", + "type": "string", + "title": "The service schema", + "description": "The service name of the event producer.", + "default": "", + "examples": [ + "notification-evt-handler" + ] + }, + "startTimestamp": { + "$id": "#/properties/traceInfo/properties/startTimestamp", + "type": "integer", + "title": "The startTimestamp schema", + "description": "Epoch/Unix timestamp of the trace-span's start.", + "default": 0, + "examples": [ + 1607677081837 + ] + }, + "finishTimestamp": { + "$id": "#/properties/traceInfo/properties/finishTimestamp", + "type": "integer", + "title": "The finishTimestamp schema", + "description": "Epoch/Unix timestamp of the trace-span's end.", + "default": 0, + "examples": [ + 2007677081838 + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json b/mojaloop-technical-overview/notifications/assets/schemas/eventNotifyReport.schema.json similarity index 100% rename from mojaloop-technical-overview/notifications/assets/schemas/notifyReport.schema.json rename to mojaloop-technical-overview/notifications/assets/schemas/eventNotifyReport.schema.json From 40daafa21089dcb27eb181a7fb3d295284855371 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 31 Mar 2021 11:36:10 +0200 Subject: [PATCH 36/39] updates to notification design v2 - included more detail on re-try logic, and recovery from failures --- mojaloop-technical-overview/notifications/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 3feb1c6dd..935da0d2c 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -523,7 +523,7 @@ NotifyReport Domain Event: #### 4.2.b. HTTP Transport example for a PUT Transfer Callback Notification Messages for FSP2 to FSP1 -NotifyReady Command Event: +NotifyReady Domain Event: ```JSON { "msgId": "a553f7fd-6e4e-4799-b145-c469eca2da05", From 60d1a19963f72ae54ac01f7e7b2214a48f1c82dd Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 31 Mar 2021 11:39:40 +0200 Subject: [PATCH 37/39] updates to notification design v2 - included more detail on re-try logic, and recovery from failures --- mojaloop-technical-overview/notifications/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 935da0d2c..9a4d93b44 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -2,7 +2,7 @@ This document will discuss the architecture and design of Mojaloop's Notification-engine. -| Versrion | Date | Name(s) | Description | +| Version | Date | Name(s) | Description | | --- | --- | --- | --- | | v1.0-draft.0 | 2021-02-25 | Miguel de Barros | Initial version. | | v1.0-draft.1 | 2021-03-15 | Miguel de Barros | Incorporated comments from DA, and expanded on detailed design elements. | From af3a6f6cb970e28ee4b021d464942bd2f6032147 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Wed, 31 Mar 2021 12:11:05 +0200 Subject: [PATCH 38/39] spelling fixes --- .../notifications/README.md | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mojaloop-technical-overview/notifications/README.md b/mojaloop-technical-overview/notifications/README.md index 9a4d93b44..15c3aa934 100644 --- a/mojaloop-technical-overview/notifications/README.md +++ b/mojaloop-technical-overview/notifications/README.md @@ -38,13 +38,13 @@ This document will discuss the architecture and design of Mojaloop's Notificatio ### 2.1 Overview -This design proposes the seperation of the current Notification capabilities (transport vs mojaloop-contextual processing) into the following components: +This design proposes the separation of the current Notification capabilities (transport vs mojaloop-contextual processing) into the following components: | Components | Description | APIs | Notes | | --- | --- | --- | --- | -| ML-Adapter Callback Handler | This component understands the context and semantics of the FSPIOP Specification. Consumes existing Notification (internal) events, then interprates (in context of Mojaloop use-cases) those events into an appropriate event message to some explicit receipient. Also handles feedback loop and compensating actions (defined by configurable rules) from Delivery Reports. It must also resolve any notification details required (i.e. URLs, transport type, etc) by querying the Central-Service's Admin API. This component is pluggable, and the design supports the possibility of several Callback Handlers existing for several specific transports or alternatively to support different context languages like ISO 20022. | N/A | This component is part of the "ML-API-Adapter" | -| Notification Evt Handler | Consumes existing Notification events, then interprates (without contextual dependencies) those events into an appropriate NotifyCmd. | API operations to request notifications (async & sync) and query stored deliveryReports | This component is a "Supporting-Service" | -| Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistence or caching stores. This allows for multiple pluggable Cmd Handlers to exist to handle different combinations of transports (transport.type) and content-types(transpport.contentType) as required. This component will also manage message and transport security aspects such as TLS (Transport Layer Security) and JWS Signing for HTTP transports. | API operations to send notifications synchronously | This component is a "Supporting-Service" | +| ML-Adapter Callback Handler | This component understands the context and semantics of the FSPIOP Specification. Consumes existing Notification (internal) events, then interprets (in context of Mojaloop use-cases) those events into an appropriate event message to some explicit recipient. Also handles feedback loop and compensating actions (defined by configurable rules) from Delivery Reports. It must also resolve any notification details required (i.e. URLs, transport type, etc) by querying the Central-Service's Admin API. This component is pluggable, and the design supports the possibility of several Callback Handlers existing for several specific transports or alternatively to support different context languages like ISO 20022. | N/A | This component is part of the "ML-API-Adapter" | +| Notification Evt Handler | Consumes existing Notification events, then interprets (without contextual dependencies) those events into an appropriate NotifyCmd. | API operations to request notifications (async & sync) and query stored deliveryReports | This component is a "Supporting-Service" | +| Notification Cmd Handler | This is responsible for the "notification-engine" capabilities. This will consume and process Notification Command message produced by the NotificationEvt Handler. This component is stateless, and has no dependency on any persistence or caching stores. This allows for multiple pluggable Cmd Handlers to exist to handle different combinations of transports (transport.type) and content-types(transport.contentType) as required. This component will also manage message and transport security aspects such as TLS (Transport Layer Security) and JWS Signing for HTTP transports. | API operations to send notifications synchronously | This component is a "Supporting-Service" | ... @@ -61,8 +61,8 @@ This design proposes the seperation of the current Notification capabilities (tr | Event | Description | Notes | | --- | --- | --- | -| Notification | Internal existing notification event currently produced by Central-Service components which is the result of some internal process (e.g. Transfer Prepared, Transfer Fulfiled, etc) | | -| NotifyReady | Domain Event produced by context aware Callback Handler. This message is generic and not contextual. It containts everything that is needed for the notification to be processed by the Notification Engine, which includes the transport specific information required for delivery, and reliability configuration (i.e. delivery report enabled, retry attempts, etc). | | +| Notification | Internal existing notification event currently produced by Central-Service components which is the result of some internal process (e.g. Transfer Prepared, Transfer Fulfilled, etc) | | +| NotifyReady | Domain Event produced by context aware Callback Handler. This message is generic and not contextual. It contains everything that is needed for the notification to be processed by the Notification Engine, which includes the transport specific information required for delivery, and reliability configuration (i.e. delivery report enabled, retry attempts, etc). | | | NotifyCmd | Notification Command message produced by the Notification Evt Handler, which is consumed and processed by the Notification Cmd Handler as a result of the NotifyReady event. | | | NotifyReport | Domain event message to broadcast Delivery reports within the Notification Engine and Callback Handlers (for compensating actions). This event is consumed by the Notification Evt Handler and persisted for reporting and compensating purposes. | | @@ -72,13 +72,13 @@ The Notification aggregate manages the Notification Entity with the following st | State | Description | Notes | | --- | --- | --- | -| received | Indicates that the NotifyCmd event has been receivd by the Notification Cmd Handler. | | +| received | Indicates that the NotifyCmd event has been received by the Notification Cmd Handler. | | | in-progress | Indicates that the NotifyCmd event is being processed. | | | success | Indicates that the NotifyCmd event processing has completed successfully, and the Notification was delivered. | | | failure | Indicates that the NotifyCmd event processing has failed, and the Notification was not delivered. | | | expired | Indicates that the NotifyCmd event processing has expired, and the Notification was not delivered. | | -The aggregate-id should be used as the Kafka message-key for NotifyCmd events. This will optmize the notification processing by ensuring that a consistent Notification Cmd Handler instance will always process that specific entity, thereby allowing us to reduce repository access by leveraging in-memory caching capabilties for queries. +The aggregate-id should be used as the Kafka message-key for NotifyCmd events. This will optimize the notification processing by ensuring that a consistent Notification Cmd Handler instance will always process that specific entity, thereby allowing us to reduce repository access by leveraging in-memory caching capabilities for queries. ## 3. Models @@ -195,7 +195,7 @@ The aggregate-id should be used as the Kafka message-key for NotifyCmd events. T } ``` -#### 3.2.1.c. NotifyCmd - Notification Command produced by Notificant Evt Handler +#### 3.2.1.c. NotifyCmd - Notification Command produced by Notification Evt Handler ##### 3.2.1.c.i. Schemas @@ -317,32 +317,32 @@ Once the NotifyCmd is consumed by the Notification Cmd Handler, the managed stat - The Notification will be ignored if the state.status is either `success`, `failed` or `expired`. - The NotifyCmd will be processed from its last retry-attempt if the state.status = `in-progress` -- The NotifyCmd will be processed normally if state.status = `received` as no retry-atempts have been observed +- The NotifyCmd will be processed normally if state.status = `received` as no retry-attempts have been observed -The Notification Cmd Handler will only commit the Kafka message once a final state (i.e. `success`, `failed` or `expired`) has been persisted, thus ensuring the that the message will be re-processed as a result of any interupptions. +The Notification Cmd Handler will only commit the Kafka message once a final state (i.e. `success`, `failed` or `expired`) has been persisted, thus ensuring the that the message will be re-processed as a result of any interruptions. -The expiration capability supported by the Notification Engine will ensure that a Notification Cmd Event will not be continously retried, and will instead end up in a final state of `expired` once the expiration lapses. +The expiration capability supported by the Notification Engine will ensure that a Notification Cmd Event will not be continuously retried, and will instead end up in a final state of `expired` once the expiration lapses. ##### 4.1.2. Compensating Actions The Mojaloop Adapter - FSPIOP Callback Handler (or any other Callback Handler) is able to action compensating actions by processing the NotifyReport domain event. Note that the NotifyReport will only be published by the Notification Engine if the transport.options.deliver-report field is set to true on the NotifyReady domain event. The capabilities for the rule processor must support the following operations: -- Create a new (not a duplicate) NotifiyReady request event. This can be used by any Callback Handler to execute additional retry logic that is specific to its own context (i.e. FPSIOP, ISO20022, etc), or instead soley handle retry logic by disabling retries on the Notification Engine (i.e. transport.options.retry.count=0). +- Create a new (not a duplicate) NotifyReady request event. This can be used by any Callback Handler to execute additional retry logic that is specific to its own context (i.e. FSPIOP, ISO20022, etc), or instead solely handle retry logic by disabling retries on the Notification Engine (i.e. transport.options.retry.count=0). - Notify Central-Services of the NotifyReport results. This can be used by the Central-Services to inform the Timeout handler of the expiration. ##### 4.1.2. Callback Handlers There are two approaches to handle unavailable/interruptions to Callback Handler processing: -- the existing Mojaloop Timeout process will manage any transfers that are not in a final commited or aborted state. This could result in a notification being delivered while in parallel the associated transfer is timed-out by the Central-Services, and thus to consistency issues. +- the existing Mojaloop Timeout process will manage any transfers that are not in a final committed or aborted state. This could result in a notification being delivered while in parallel the associated transfer is timed-out by the Central-Services, and thus to consistency issues. - the existing Timeout process will ignore any transfers that are queued for notification, and instead wait for a compensating action from the FSPIOP Callback Handler. This will ensure consistency and is the recommended approach. ### 4.2. Multiple Transports ![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Transport-Example-v2.0.svg) -The above scenario depicts two FSPs each utilsing two different transports for FSPIOP Transfer interactions: +The above scenario depicts two FSPs each utilizing two different transports for FSPIOP Transfer interactions: - FSP1 (payer) is using HTTP transport - FSP2 (payee) is using gRCP transport @@ -370,15 +370,15 @@ Content-Type: application/json } ``` -With this design it is possible to achieve this by introducing multiple Notification Cmd Handlers within the Notification Engine to handle different Transports (i.e. HTTP, gRPC). In addition, multiple matching ML-Adapters would need to similiar exist to support the associated inbound request. +With this design it is possible to achieve this by introducing multiple Notification Cmd Handlers within the Notification Engine to handle different Transports (i.e. HTTP, gRPC). In addition, multiple matching ML-Adapters would need to similar exist to support the associated inbound request. Each of the Notification Cmd Handlers will only listen to event messages that match their intended transport types, and will thus discard non-applicable ones. This therefore allows the Central-Ledger components to be isolated from the transport specific logic (and transformations if applicable) for notification callbacks. -The delivery-report for each of the POST/PUT interactions provides the assurance that the notifications results are recorded by the Central-Service Notification-Evt-Handler component. This component is able to raise alerts or alternatively handle any compensating actions independantly of the FSP's transport preferences. +The delivery-report for each of the POST/PUT interactions provides the assurance that the notifications results are recorded by the Central-Service Notification-Evt-Handler component. This component is able to raise alerts or alternatively handle any compensating actions independently of the FSP's transport preferences. -The transferId is mapped to the notifyId field below. This allows one to query a Notification resuls by correlating the notifyId with the transferId. +The transferId is mapped to the notifyId field below. This allows one to query a Notification results by correlating the notifyId with the transferId. #### 4.2.a. gRPC Transport example for a POST Transfer Callback Notification Messages for FSP1 to FSP2 @@ -669,10 +669,10 @@ NotifyReport Domain Event: ### 4.3. Multiple Context Languages -This is an example of how a synchronous ISO Payer FSP could be send a Transfer through a Mojaloop Switch. The Payee FSP in the example only supports FSPIOP for inbound requests and callbacks. +This is an example of how a synchronous ISO Payer FSP could send a Transfer through a Mojaloop Switch. The Payee FSP in the example only supports FSPIOP for inbound requests and callbacks. -A ML-Adapter would need to be developed to support the Inbound Synchronous ISO 20022 PAIN.013 request being received by the Payer FSP. As the Payer FSP expects a syncrhonous response, there is no need to utilise the Notification Engine for the response. The adapter instead will keep the request connection alive to the Payer FSP and correlate the fulfillment notification published by the Central-Services. The adapter will transporm the result into a PACS.008 message before responding synchronous to the Payer FSP. +A ML-Adapter would need to be developed to support the Inbound Synchronous ISO 20022 PAIN.013 request being sent by the Payer FSP. As the Payer FSP expects a synchronous response, there is no need to utilise the Notification Engine for the response. The adapter instead will keep the request connection alive to the Payer FSP and correlate the fulfillment notification published by the Central-Services. The adapter will transform the result into a PACS.008 message before responding synchronous to the Payer FSP. -The ML-Adapter for ISO 20022 processing will however listen for NotifyReport events produced by the Notification Engine to handle any comepensating actions as a result of Transfer Prepare notification errors. +The ML-Adapter for ISO 20022 processing will however listen for NotifyReport events produced by the Notification Engine to handle any compensating actions as a result of Transfer Prepare notification errors. ![example](assets/diagrams/Transfers-Arch-End-to-End-with-Notify-Engine-Multiple-Context-Example-v2.0.svg) From 42e2c80d79c1f306a1ffb328c4128cb447a19cb2 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Thu, 1 Apr 2021 12:34:15 +0200 Subject: [PATCH 39/39] Updated mojaloop-simulator to fix subid issue - https://github.com/mojaloop/project/issues/2103 --- .../assets/sequence/seq-notify-v2-1.0.0.svg | 2 +- .../sequence/seq-notify-v2-2.0.0.plantuml | 229 -------- .../assets/sequence/seq-notify-v2-2.0.0.svg | 511 ------------------ 3 files changed, 1 insertion(+), 741 deletions(-) delete mode 100644 mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml delete mode 100644 mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg index 176a5d732..701bb96bf 100644 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg +++ b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-1.0.0.svg @@ -969,7 +969,7 @@ 33 - Query Notification Attempt by notifyId, and attemot to re-load existing state into memory if it exists + Query Notification Attempt by notifyId, and attempt to re-load existing state into memory if it exists Note: this means that we are recovering a 'Notification' event from a mid-flight 'in-progress' Cmd Handler interupption if record found! diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml deleted file mode 100644 index e3931a8a9..000000000 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.plantuml +++ /dev/null @@ -1,229 +0,0 @@ - -/'***** - License - -------------- - Copyright © 2017 Bill & Melinda Gates Foundation - The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - Contributors - -------------- - This is the official list of the Mojaloop project contributors for this file. - Names of the original copyright holders (individuals or organizations) - should be listed with a '*' in the first column. People who have - contributed from an organization can be listed under the organization - that actually holds the copyright for their contributions (see the - Gates Foundation organization for an example). Those individuals should have - their names indented and be marked with a '-'. Email address can be added - optionally within square brackets . - * Gates Foundation - - Name Surname - - * Georgi Georgiev - * Miguel de Barros - * Shashikant Hirugade - * Valentin Genev - -------------- - ******'/ - -@startuml -' declate title -title 2.0.0. Send Notification to Participant (Payer/Payee) v2.0 - Error Scenario: Notification Cmd Handler Failure mid-processing retries - -autonumber - -' Actor Keys: -' actor - Payer DFSP, Payee DFSP -' boundary - APIs/Interfaces, etc -' collections - Kafka Topics -' control - Kafka Consumers -' entity - Database Access Objects -' database - Database Persistance Store - -' declare actors -' actor "Payer DFSP\nParticipant" as PAYER_DFSP -actor "Participant" as PARTICIPANT -control "Notification Event Handler" as NOTIFY_HANDLER_EVT -control "Notification Cmd Handler" as NOTIFY_HANDLER_CMD -boundary "Central Service API" as CSAPI -control "FSPIOP Callback Handler" as MLCALLBACKHANDLER -collections "notifications\n(Internal)\nTopic" as TOPIC_NOTIFICATIONS -collections "notificationsCommand\n(Cmd Event)\nTopic" as TOPIC_NOTIFICATIONS_CMD -collections "notificationsEvent\n(Domain Event)\nTopic" as TOPIC_NOTIFICATIONS_EVT -' entity "Participant DAO" as PARTICIPANT_DAO -' entity "Notifications DAO" as NOTIFICATIONS_DAO -database "Notify Persistent Store" as NOTIFYDB - -' box "Financial Service Provider (Payer)" #lightGray -' participant PAYER_DFSP -' end box - -' box "ML API Adapter Service" #LightBlue -' participant NOTIFY_HANDLER -' end box - -box "Central Service" #LightYellow - participant TOPIC_NOTIFICATIONS - - participant CSAPI - ' participant NOTIFICATIONS_DAO - participant TOPIC_NOTIFICATIONS_EVT - ' participant PARTICIPANT_DAO - ' participant DB -end box - -box "Mojaloop Adapter" #LightCyan - participant MLCALLBACKHANDLER - ' participant TOPIC_NOTIFICATIONS - - ' participant CSAPI - ' participant NOTIFICATIONS_DAO - ' participant DB - ' participant TOPIC_NOTIFICATIONS_EVT - ' participant PARTICIPANT_DAO - ' participant DB -end box - -box "Notification Engine" #LightBlue - participant TOPIC_NOTIFICATIONS_EVT - participant NOTIFY_HANDLER_EVT - participant TOPIC_NOTIFICATIONS_CMD - participant NOTIFYDB - participant NOTIFY_HANDLER_CMD - ' participant TOPIC_NOTIFICATIONS_EVT -end box - -box "Financial Service Provider (Participant)" #lightGray - participant PARTICIPANT -end box - -' start flow -group Send notification to Participants - ' note left of NOTIFY_HANDLER_EVT #yellow - ' Message: - ' { - ' payload: { - ' endpoint: { - ' type: , - ' value: - ' } - ' } - ' } - ' end note - - TOPIC_NOTIFICATIONS <- MLCALLBACKHANDLER: Consume Notification event - activate MLCALLBACKHANDLER - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS - - - - ' put logic here to route command-type based on incoming events - group Routing logic - note right of MLCALLBACKHANDLER #lightGray - ref: 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - end note - MLCALLBACKHANDLER <-> MLCALLBACKHANDLER: Handle Routing logic - MLCALLBACKHANDLER -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyReady Event Message\n - end - - ' TODO1 - TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyReady Event - activate NOTIFY_HANDLER_EVT - activate TOPIC_NOTIFICATIONS_EVT - deactivate TOPIC_NOTIFICATIONS_EVT - - NOTIFY_HANDLER_EVT -> NOTIFY_HANDLER_EVT: Construct NotifyCmd Command Message with notficiation-payload & transport-data - group For-each NotifyCmd Command Messages - NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_CMD: Publish NotifyCmd Command Message - activate TOPIC_NOTIFICATIONS_CMD - end - - - NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit Notification event - activate TOPIC_NOTIFICATIONS_EVT - deactivate TOPIC_NOTIFICATIONS_EVT - deactivate NOTIFY_HANDLER_EVT - - - TOPIC_NOTIFICATIONS_CMD <- NOTIFY_HANDLER_CMD: Consume NotifyCmd Command Message - activate NOTIFY_HANDLER_CMD - deactivate TOPIC_NOTIFICATIONS_CMD - - alt transport.options.deliver-report === true - NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification event - end - - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Validate transport.type && transport.content-type match handlers configuration - -alt If transport.type && transport.content-type match handlers configuration - - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Construct Transport Message - - ' retry logic goes here - group Retry Transport Mechanism based on transport options - note right of NOTIFY_HANDLER_CMD #yellow - "transport": { - "options": { - "deliveryReport": true, - "retry": { - "count": 3, - "type": "noDelay|exponentialDelay", - "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - } - } - } - end note - - loop retry-count=0; retry-count++; retry-count < transport.options.retry.count - NOTIFY_HANDLER_CMD -> NOTIFYDB: Record Notification Attempt - alt if retry-count < transport.options.retry.count - group Delivery Success - NOTIFY_HANDLER_CMD -> PARTICIPANT: Notification to \nPayer DFSP to specified Endpoint - PUT \nError code: 1001 - NOTIFY_HANDLER_CMD <-- PARTICIPANT: HTTP Response - break from loop - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop - end - else Delivery Failure - alt transport.options.deliver-report === true - NOTIFY_HANDLER_CMD -> NOTIFYDB: Record failure attempt - end - end - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Inc retry attempt count - else - break from loop - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: break from loop - end - end - end - end - - alt transport.options.deliver-report === true - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Prepare Delivery Report - - NOTIFY_HANDLER_CMD -> NOTIFYDB: Record NotifyReport results - - NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_EVT: Publish NotifyReport event - activate TOPIC_NOTIFICATIONS_EVT - - TOPIC_NOTIFICATIONS_EVT <- NOTIFY_HANDLER_EVT: Consume NotifyReport event - deactivate TOPIC_NOTIFICATIONS_EVT - activate NOTIFY_HANDLER_EVT - - NOTIFY_HANDLER_EVT -> TOPIC_NOTIFICATIONS_EVT: Commit NotifyReport event - deactivate NOTIFY_HANDLER_EVT - activate TOPIC_NOTIFICATIONS_EVT - deactivate TOPIC_NOTIFICATIONS_EVT - end - -else - NOTIFY_HANDLER_CMD -> NOTIFY_HANDLER_CMD: Ignore Notification -end - - NOTIFY_HANDLER_CMD -> TOPIC_NOTIFICATIONS_CMD: Commit NotifyCmd event - activate TOPIC_NOTIFICATIONS_CMD - deactivate TOPIC_NOTIFICATIONS_CMD - deactivate NOTIFY_HANDLER_CMD - -end -@enduml diff --git a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg b/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg deleted file mode 100644 index 8f5ec1785..000000000 --- a/mojaloop-technical-overview/notifications/assets/sequence/seq-notify-v2-2.0.0.svg +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - - - - - - 2.0.0. Send Notification to Participant (Payer/Payee) v2.0 - Error Scenario: Notification Cmd Handler Failure mid-processing retries - - - - Central Service - - - - Mojaloop Adapter - - - - Notification Engine - - - - Financial Service Provider (Participant) - - - - - - - - - - - - - - - - - - - notifications - - - (Internal) - - - Topic - - - - - notifications - - - (Internal) - - - Topic - - - Central Service API - - - - - Central Service API - - - - - FSPIOP Callback Handler - - - - - FSPIOP Callback Handler - - - - - - - notificationsEvent - - - (Domain Event) - - - Topic - - - - - notificationsEvent - - - (Domain Event) - - - Topic - - - Notification Event Handler - - - - - Notification Event Handler - - - - - - - notificationsCommand - - - (Cmd Event) - - - Topic - - - - - notificationsCommand - - - (Cmd Event) - - - Topic - - - Notify Persistent Store - - - - - Notify Persistent Store - - - - - Notification Cmd Handler - - - - - Notification Cmd Handler - - - - - Participant - - - - - Participant - - - - - - - - Send notification to Participants - - - - - 1 - - - Consume Notification event - - - - - Routing logic - - - - - ref: 1.0.0. Send Notification to Participant (Payer/Payee) (single message) v2.0 - - - - - 2 - - - Handle Routing logic - - - - - 3 - - - Publish NotifyReady Event Message - - - - - 4 - - - Consume NotifyReady Event - - - - - 5 - - - Construct NotifyCmd Command Message with notficiation-payload & transport-data - - - - - For-each NotifyCmd Command Messages - - - - - 6 - - - Publish NotifyCmd Command Message - - - - - 7 - - - Commit Notification event - - - - - 8 - - - Consume NotifyCmd Command Message - - - - - alt - - - [transport.options.deliver-report === true] - - - - - 9 - - - Record Notification event - - - - - 10 - - - Validate transport.type && transport.content-type match handlers configuration - - - - - alt - - - [If transport.type && transport.content-type match handlers configuration] - - - - - 11 - - - Construct Transport Message - - - - - Retry Transport Mechanism based on transport options - - - - - "transport": { - - - "options": { - - - "deliveryReport": true, - - - "retry": { - - - "count": 3, - - - "type": "noDelay|exponentialDelay", - - - "condition": "isNetworkError|isSafeRequestError|isIdempotentRequestError|isNetworkOrIdempotentRequestError" - - - } - - - } - - - } - - - - - loop - - - [retry-count=0; retry-count++; retry-count < transport.options.retry.count] - - - - - 12 - - - Record Notification Attempt - - - - - alt - - - [if retry-count < transport.options.retry.count] - - - - - Delivery Success - - - - - 13 - - - Notification to - - - Payer DFSP to specified Endpoint - PUT - - - Error code: - - - 1001 - - - - - 14 - - - HTTP Response - - - - - break - - - [from loop] - - - - - 15 - - - break from loop - - - - [Delivery Failure] - - - - - alt - - - [transport.options.deliver-report === true] - - - - - 16 - - - Record failure attempt - - - - - 17 - - - Inc retry attempt count - - - - - - break - - - [from loop] - - - - - 18 - - - break from loop - - - - - alt - - - [transport.options.deliver-report === true] - - - - - 19 - - - Prepare Delivery Report - - - - - 20 - - - Record NotifyReport results - - - - - 21 - - - Publish NotifyReport event - - - - - 22 - - - Consume NotifyReport event - - - - - 23 - - - Commit NotifyReport event - - - - - - 24 - - - Ignore Notification - - - - - 25 - - - Commit NotifyCmd event - -