diff --git a/.env b/.env new file mode 100644 index 000000000..f289c298e --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +TZ=America/Toronto +SERVER_HOST=localhost diff --git a/.github/workflows/release-bot.yml b/.github/workflows/release-bot.yml new file mode 100644 index 000000000..bc0b705ac --- /dev/null +++ b/.github/workflows/release-bot.yml @@ -0,0 +1,68 @@ +name: Create Release checklist +on: + pull_request: + branches: + - "master" + +jobs: + release-checklist: + runs-on: ubuntu-20.04 + steps: + - name: Checkout repo + uses: actions/checkout@v3 + - name: Create output folder + run: mkdir -p ${{ github.workspace }}/checklist_items + - name: Write checklist items to files + id: merge_commits + run: | + git fetch origin master + git fetch origin ${GITHUB_HEAD_REF} + MERGE_COMMITS=$(git --no-pager log origin/${GITHUB_HEAD_REF} ^origin/master --oneline --merges --grep "Merge pull request" --pretty=format:"%h") + + for COMMIT in $MERGE_COMMITS; do + # Merge commit title + checkitem_title=$(git --no-pager show $COMMIT --pretty=format:"%s" | head -n 1 | sed 's/Merge\ pull\ request\ //' | sed 's/from.*\///') + # Commits inside this pull request + details=$(git --no-pager log $COMMIT^1..$COMMIT^2 --oneline | sed 's/[a-f0-9]*\ /- /') + + content="- [ ] ${checkitem_title} +
details + + \`\`\` + ${details} + \`\`\` +
+ " + echo "$content" > checklist_items/$COMMIT.log + done + + - name: Collect checklist items + run: | + msg=$(awk 'FNR==1 && NR!=1 {print "---"}{print}' checklist_items/*.log) + echo "$msg" >> aggregated.log + sha="*SHA: ${{ github.event.pull_request.head.sha }}*" + sed -i "1i\\ + $sha + " aggregated.log + + - name: Update Pull Request + uses: actions/github-script@v5 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + + fs.readFile('aggregated.log', 'utf8', (err, data) => { + if (err) { + console.error(err); + } else { + const output = data; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: output + }) + } + }); \ No newline at end of file diff --git a/Makefile b/Makefile index 762f4c633..7bc57d14e 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ REPLACE := perl -i -pe RODAN_PATH := ./rodan-main/code/rodan JOBS_PATH := $(RODAN_PATH)/jobs -PROD_TAG := v2.0.15 +PROD_TAG := v3.0.0 DOCKER_TAG := nightly @@ -53,14 +53,6 @@ test_prod: pull_prod # different tag. docker compose -f test-prod-compose.yml up -build_arm: - @docker build -f ./nginx/Dockerfile.arm --no-cache --tag nginx-local --build-arg VERSION=${DOCKER_TAG} nginx - -run_arm: - # Run build_arm first if you don't have the NGINX container. - # Launch ARM instance - @DOCKER_TAG=$(DOCKER_TAG) docker compose -f arm-compose.yml up - run_client: # Run Rodan-Client for dev (needs local dev up and running) @docker run -p 8080:9002 -v `pwd`/rodan-client/code:/code ddmal/rodan-client:nightly bash @@ -84,7 +76,6 @@ copy_docker_tag: @docker image tag $(docker images ddmal/rodan-gpu-celery:nightly -q) ddmal/rodan-gpu-celery:$(tag) pull_prod: - docker pull ddmal/hpc-rabbitmq:$(PROD_TAG) docker pull ddmal/iipsrv:nightly docker pull ddmal/nginx:$(PROD_TAG) docker pull ddmal/postgres-plpython:$(PROD_TAG) @@ -180,7 +171,6 @@ scale: @docker service scale rodan_redis=$(num) # @docker service scale rodan_postgres=$(num) @docker service scale rodan_rabbitmq=$(num) - @docker service scale rodan_hpc-rabbitmq=$(num) health: @docker inspect --format "{{json .State.Health }}" $(log) | jq @@ -230,7 +220,7 @@ push: pull: @echo "[-] Pulling docker images from Docker Hub..." - @docker compose pull + @DOCKER_TAG=$(DOCKER_TAG) docker compose pull @echo "[+] Done." $(JOBS_PATH)/neon_wrapper/Neon/package.json: diff --git a/arm-compose.yml b/arm-compose.yml deleted file mode 100644 index 0df99b78d..000000000 --- a/arm-compose.yml +++ /dev/null @@ -1,117 +0,0 @@ -version: "3.4" -services: - nginx: - image: "nginx-local:latest" - command: /run/start - depends_on: - - rodan-main - ports: - - "80:80" - - "443:443" - - "9002:9002" - volumes: - - "resources:/rodan/data" - - rodan-main: - image: "ddmal/rodan-main:${DOCKER_TAG}" - healthcheck: - test: ["CMD-SHELL", "/usr/bin/curl -H 'User-Agent: docker-healthcheck' http://localhost:8000/api/?format=json || exit 1"] - interval: "10s" - timeout: "5s" - retries: 2 - start_period: "2m" - command: bash -c "tail -f /dev/null" - environment: - CELERY_JOB_QUEUE: None - depends_on: - - postgres - - rabbitmq - - redis - env_file: - - ./scripts/local.env - volumes: - - "resources:/rodan/data" - - "./rodan-main/code:/code/Rodan" - - - iipsrv: - image: "ddmal/iipsrv:nightly" - volumes: - - "resources:/rodan/data" - - - celery: - image: "ddmal/rodan-main:${DOCKER_TAG}" - command: bash -c "tail -f /dev/null" - environment: - CELERY_JOB_QUEUE: celery - healthcheck: - test: ["CMD", "celery", "inspect", "ping", "-A", "rodan", "--workdir", "/code/Rodan", "-d", "celery@celery"] - interval: "30s" - timeout: "3s" - start_period: "1m" - retries: 3 - depends_on: - - postgres - - rodan-main - - rabbitmq - - redis - env_file: - - ./scripts/local.env - volumes: - - "resources:/rodan/data" - - "./rodan-main/code:/code/Rodan" - - py3-celery: - image: "ddmal/rodan-python3-celery:${DOCKER_TAG}" - command: bash -c "tail -f /dev/null" - environment: - CELERY_JOB_QUEUE: Python3 - depends_on: - - postgres - - rodan-main - - rabbitmq - - redis - - celery - env_file: - - ./scripts/local.env - - ./hpc-rabbitmq/scripts/local.env - volumes: - - "resources:/rodan/data" - - "./rodan-main/code:/code/Rodan" - - - redis: - image: "redis:alpine" - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 5 - depends_on: - - postgres - - postgres: - image: "ddmal/postgres-plpython:${DOCKER_TAG}" - healthcheck: - test: ["CMD-SHELL", "pg_isready", "-U", "postgres"] - interval: 10s - timeout: 5s - retries: 5 - env_file: - - ./scripts/local.env - - rabbitmq: - image: "rabbitmq:alpine" - healthcheck: - test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] - interval: "30s" - timeout: "3s" - retries: 3 - depends_on: - - redis - env_file: - - ./scripts/local.env - -volumes: - resources: diff --git a/build.yml b/build.yml index 74af9d177..223208a41 100644 --- a/build.yml +++ b/build.yml @@ -49,8 +49,8 @@ services: dockerfile: Dockerfile image: "ddmal/rodan-client:nightly" - hpc-rabbitmq: + iipsrv: build: - context: ./hpc-rabbitmq + context: ./iipsrv dockerfile: Dockerfile - image: "ddmal/hpc-rabbitmq:nightly" + image: "ddmal/iipsrv:nightly" diff --git a/docker-compose.yml b/docker-compose.yml index 1490986db..343879a76 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,9 @@ services: - rabbitmq - redis - rodan-main + environment: + TZ: America/Toronto + SERVER_HOST: localhost ports: - "80:80" - "443:443" @@ -19,13 +22,19 @@ services: rodan-main: image: "ddmal/rodan-main:${DOCKER_TAG}" healthcheck: - test: ["CMD-SHELL", "/usr/bin/curl -H 'User-Agent: docker-healthcheck' http://localhost:8000/api/?format=json || exit 1"] + test: + [ + "CMD-SHELL", + "/usr/bin/curl -H 'User-Agent: docker-healthcheck' http://localhost:8000/api/?format=json || exit 1" + ] interval: "10s" timeout: "5s" retries: 2 start_period: "2m" command: bash -c "tail -f /dev/null" environment: + TZ: America/Toronto + SERVER_HOST: localhost CELERY_JOB_QUEUE: None depends_on: - postgres @@ -38,8 +47,14 @@ services: - "resources:/rodan/data" - "./rodan-main/code:/code/Rodan" + rodan-client: + image: "ddmal/rodan-client:${DOCKER_TAG}" + volumes: + - "./rodan-client/code:/code" + - "./rodan-client/config/configuration.json:/client/configuration.json" + iipsrv: - image: "ddmal/iipsrv:nightly" + image: "ddmal/iipsrv:${DOCKER_TAG}" volumes: - "resources:/rodan/data" @@ -47,9 +62,23 @@ services: image: "ddmal/rodan-main:${DOCKER_TAG}" command: bash -c "tail -f /dev/null" environment: + TZ: America/Toronto + SERVER_HOST: localhost CELERY_JOB_QUEUE: celery healthcheck: - test: ["CMD", "celery", "inspect", "ping", "-A", "rodan", "--workdir", "/code/Rodan", "-d", "celery@celery"] + test: + [ + "CMD", + "celery", + "inspect", + "ping", + "-A", + "rodan", + "--workdir", + "/code/Rodan", + "-d", + "celery@celery" + ] interval: "30s" timeout: "3s" start_period: "1m" @@ -69,6 +98,8 @@ services: image: "ddmal/rodan-python3-celery:${DOCKER_TAG}" command: bash -c "tail -f /dev/null" environment: + TZ: America/Toronto + SERVER_HOST: localhost CELERY_JOB_QUEUE: Python3 depends_on: - postgres @@ -78,7 +109,6 @@ services: - celery env_file: - ./scripts/local.env - - ./hpc-rabbitmq/scripts/local.env volumes: - "resources:/rodan/data" - "./rodan-main/code:/code/Rodan" @@ -87,6 +117,8 @@ services: image: "ddmal/rodan-gpu-celery:${DOCKER_TAG}" command: bash -c "tail -f /dev/null" environment: + TZ: America/Toronto + SERVER_HOST: localhost CELERY_JOB_QUEUE: GPU depends_on: - postgres @@ -103,7 +135,7 @@ services: redis: image: "redis:alpine" healthcheck: - test: ["CMD", "redis-cli", "ping"] + test: [ "CMD", "redis-cli", "ping" ] interval: 10s timeout: 5s retries: 5 @@ -113,7 +145,7 @@ services: postgres: image: "ddmal/postgres-plpython:${DOCKER_TAG}" healthcheck: - test: ["CMD-SHELL", "pg_isready", "-U", "postgres"] + test: [ "CMD-SHELL", "pg_isready", "-U", "postgres" ] interval: 10s timeout: 5s retries: 5 @@ -123,7 +155,7 @@ services: rabbitmq: image: "rabbitmq:alpine" healthcheck: - test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] + test: [ "CMD", "rabbitmq-diagnostics", "-q", "ping" ] interval: "30s" timeout: "3s" retries: 3 @@ -132,17 +164,5 @@ services: env_file: - ./scripts/local.env - hpc-rabbitmq: - image: "ddmal/hpc-rabbitmq:${DOCKER_TAG}" - healthcheck: - test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] - interval: "30s" - timeout: "3s" - retries: 3 - env_file: - - ./hpc-rabbitmq/scripts/local.env - ports: - - "5672:5672" - volumes: resources: diff --git a/hooks/build b/hooks/build index 2f6d04bc0..7a1193a9e 100644 --- a/hooks/build +++ b/hooks/build @@ -2,13 +2,6 @@ # hooks/build # https://docs.docker.com/docker-cloud/builds/advanced/ -# This "useless" image is build to prevent dockerhub from overwriting -# the nightly image with it's obligatory minimum of a build rule. If we want a build -# trigger with a HTTPS POST request, we must have at least 1 build rule. -docker build \ - --tag ddmal/rodan:placeholder \ - . - # RODAN_TAG=`cd rodan-main/code && git describe --tags --always` # RODAN_CLIENT_TAG=`cd rodan-client/code && git describe --tags --always` # RODAN_DOCKER_TAG=`git describe --tags --always` @@ -29,6 +22,26 @@ echo "[+] Building images with tag: $DOCKER_TAG" set -o errexit +# Fail building images +# Push to trigger webhook and send a message to slack +trap 'cleanup $?' EXIT +cleanup() { + if [ "$1" != "0" ]; then + echo "An error occurs when building images." + echo "Push to another repo to trigger webhook on failure with tag syntax: {repo name}-{build status}-{source branch}-{docker tag}" + + docker tag ddmal/docker-webhook:placeholder ddmal/docker-webhook:rodan-fail-${SOURCE_BRANCH}-${DOCKER_TAG} + docker push ddmal/docker-webhook:rodan-fail-${SOURCE_BRANCH}-${DOCKER_TAG} + fi +} + +# This "useless" image is build to prevent dockerhub from overwriting +# the nightly image with it's obligatory minimum of a build rule. If we want a build +# trigger with a HTTPS POST request, we must have at least 1 build rule. +docker build \ + --tag ddmal/docker-webhook:placeholder \ + . + ############################################################################### # Stage 1 # Build and push Python3-Celery image @@ -110,12 +123,12 @@ docker build \ --tag ddmal/nginx:${DOCKER_TAG} \ ./nginx -echo "[+] Building HPC-RabbitMQ" +echo "[+] Building iipsrv" docker build \ --no-cache \ --build-arg VERSION=${DOCKER_TAG} \ - --tag ddmal/hpc-rabbitmq:${DOCKER_TAG} \ - ./hpc-rabbitmq + --tag ddmal/iipsrv:${DOCKER_TAG} \ + ./iipsrv echo "[+] Finished" diff --git a/hooks/post_build b/hooks/post_build new file mode 100644 index 000000000..182d6d6fc --- /dev/null +++ b/hooks/post_build @@ -0,0 +1,20 @@ +#!/bin/bash +# hooks/post_build + +source ./hooks/helper.sh +if [[ ret_code -eq 1 ]]; then + echo "[-] no branch detected, fallback to use docker tag=$DOCKER_TAG" + echo "[-] Stop building due to wrong tag: $DOCKER_TAG" + exit 1 +elif [[ ret_code -eq 2 ]]; then + echo "[-] no tag on release branch, fallback to use docker tag=$DOCKER_TAG" + echo "[-] Stop building due to wrong tag: $DOCKER_TAG" + exit 1 +fi + +# Pass testing a pull request +# Push to trigger webhook and send a message to slack +if [[ "$DOCKER_TAG" == "this" ]]; then + docker tag ddmal/docker-webhook:placeholder ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG} + docker push ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG} +fi diff --git a/hooks/push b/hooks/push index a3263dba2..f80eb8b34 100644 --- a/hooks/push +++ b/hooks/push @@ -21,9 +21,6 @@ echo "Docker tag: $DOCKER_TAG" # RODAN_CLIENT_TAG=`cd rodan-client/code && git describe --tags --always` # RODAN_DOCKER_TAG=`git describe --tags --always` -echo "[+] Pushing ddmal/rodan-python3-celery:${DOCKER_TAG}" -docker push ddmal/rodan-python3-celery:${DOCKER_TAG} - echo "[+] Pushing ddmal/rodan-gpu-celery:${DOCKER_TAG}" docker push ddmal/rodan-gpu-celery:${DOCKER_TAG} @@ -33,5 +30,10 @@ docker push ddmal/postgres-plpython:${DOCKER_TAG} echo "[+] Pushing ddmal/nginx:${DOCKER_TAG}" docker push ddmal/nginx:${DOCKER_TAG} -echo "[+] Pushing ddmal/hpc-rabbitmq:${DOCKER_TAG}" -docker push ddmal/hpc-rabbitmq:${DOCKER_TAG} +echo "[+] Pushing ddmal/iipsrv:${DOCKER_TAG}" +docker push ddmal/iipsrv:${DOCKER_TAG} + +# Pass building images +# Push to trigger webhook and send a message to slack +docker tag ddmal/docker-webhook:placeholder ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG} +docker push ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG} diff --git a/hpc-rabbitmq/Dockerfile b/hpc-rabbitmq/Dockerfile deleted file mode 100644 index 63cc90827..000000000 --- a/hpc-rabbitmq/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM rabbitmq:alpine -ARG VERSION - -COPY ./config/rabbitmq.conf /etc/rabbitmq/ -COPY ./scripts/setup.sh /run/setup.sh -RUN chmod +x /run/setup.sh - -CMD ["/run/setup.sh"] diff --git a/hpc-rabbitmq/config/rabbitmq.conf b/hpc-rabbitmq/config/rabbitmq.conf deleted file mode 100644 index 99c8dc6fe..000000000 --- a/hpc-rabbitmq/config/rabbitmq.conf +++ /dev/null @@ -1,971 +0,0 @@ -# ====================================== -# RabbitMQ broker section -# ====================================== - -## Related doc guide: https://rabbitmq.com/configure.html. See -## https://rabbitmq.com/documentation.html for documentation ToC. - -## Networking -## ==================== -## -## Related doc guide: https://rabbitmq.com/networking.html. -## -## By default, RabbitMQ will listen on all interfaces, using -## the standard (reserved) AMQP 0-9-1 and 1.0 port. -## -# listeners.tcp.default = 5672 - - -## To listen on a specific interface, provide an IP address with port. -## For example, to listen only on localhost for both IPv4 and IPv6: -## -# IPv4 -# listeners.tcp.local = 127.0.0.1:5672 -# IPv6 -# listeners.tcp.local_v6 = ::1:5672 - -## You can define multiple listeners using listener names -# listeners.tcp.other_port = 5673 -# listeners.tcp.other_ip = 10.10.10.10:5672 - - -## TLS listeners are configured in the same fashion as TCP listeners, -## including the option to control the choice of interface. -## -# listeners.ssl.default = 5671 - -## Number of Erlang processes that will accept connections for the TCP -## and TLS listeners. -## -# num_acceptors.tcp = 10 -# num_acceptors.ssl = 10 - - -## Maximum amount of time allowed for the AMQP 0-9-1 and AMQP 1.0 handshake -## (performed after socket connection and TLS handshake) to complete, in milliseconds. -## -# handshake_timeout = 10000 - -## Set to 'true' to perform reverse DNS lookups when accepting a -## connection. rabbitmqctl and management UI will then display hostnames -## instead of IP addresses. Default value is `false`. -## -# reverse_dns_lookups = false - -## -## Security, Access Control -## ============== -## - -## Related doc guide: https://rabbitmq.com/access-control.html. - -## The default "guest" user is only permitted to access the server -## via a loopback interface (e.g. localhost). -## {loopback_users, [<<"guest">>]}, -## -# loopback_users.guest = true - -## Uncomment the following line if you want to allow access to the -## guest user from anywhere on the network. -# loopback_users.guest = false - -## TLS configuration. -## -## Related doc guide: https://rabbitmq.com/ssl.html. -## -# ssl_options.verify = verify_peer -# ssl_options.fail_if_no_peer_cert = false -# ssl_options.cacertfile = /path/to/cacert.pem -# ssl_options.certfile = /path/to/cert.pem -# ssl_options.keyfile = /path/to/key.pem -# -# ssl_options.honor_cipher_order = true -# ssl_options.honor_ecc_order = true - -# ssl_options.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384 -# ssl_options.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384 -# ssl_options.ciphers.3 = ECDHE-ECDSA-AES256-SHA384 -# ssl_options.ciphers.4 = ECDHE-RSA-AES256-SHA384 -# ssl_options.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384 -# ssl_options.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384 -# ssl_options.ciphers.7 = ECDH-ECDSA-AES256-SHA384 -# ssl_options.ciphers.8 = ECDH-RSA-AES256-SHA384 -# ssl_options.ciphers.9 = DHE-RSA-AES256-GCM-SHA384 -# ssl_options.ciphers.10 = DHE-DSS-AES256-GCM-SHA384 -# ssl_options.ciphers.11 = DHE-RSA-AES256-SHA256 -# ssl_options.ciphers.12 = DHE-DSS-AES256-SHA256 -# ssl_options.ciphers.13 = ECDHE-ECDSA-AES128-GCM-SHA256 -# ssl_options.ciphers.14 = ECDHE-RSA-AES128-GCM-SHA256 -# ssl_options.ciphers.15 = ECDHE-ECDSA-AES128-SHA256 -# ssl_options.ciphers.16 = ECDHE-RSA-AES128-SHA256 -# ssl_options.ciphers.17 = ECDH-ECDSA-AES128-GCM-SHA256 -# ssl_options.ciphers.18 = ECDH-RSA-AES128-GCM-SHA256 -# ssl_options.ciphers.19 = ECDH-ECDSA-AES128-SHA256 -# ssl_options.ciphers.20 = ECDH-RSA-AES128-SHA256 -# ssl_options.ciphers.21 = DHE-RSA-AES128-GCM-SHA256 -# ssl_options.ciphers.22 = DHE-DSS-AES128-GCM-SHA256 -# ssl_options.ciphers.23 = DHE-RSA-AES128-SHA256 -# ssl_options.ciphers.24 = DHE-DSS-AES128-SHA256 -# ssl_options.ciphers.25 = ECDHE-ECDSA-AES256-SHA -# ssl_options.ciphers.26 = ECDHE-RSA-AES256-SHA -# ssl_options.ciphers.27 = DHE-RSA-AES256-SHA -# ssl_options.ciphers.28 = DHE-DSS-AES256-SHA -# ssl_options.ciphers.29 = ECDH-ECDSA-AES256-SHA -# ssl_options.ciphers.30 = ECDH-RSA-AES256-SHA -# ssl_options.ciphers.31 = ECDHE-ECDSA-AES128-SHA -# ssl_options.ciphers.32 = ECDHE-RSA-AES128-SHA -# ssl_options.ciphers.33 = DHE-RSA-AES128-SHA -# ssl_options.ciphers.34 = DHE-DSS-AES128-SHA -# ssl_options.ciphers.35 = ECDH-ECDSA-AES128-SHA -# ssl_options.ciphers.36 = ECDH-RSA-AES128-SHA - -## Select an authentication/authorisation backend to use. -## -## Alternative backends are provided by plugins, such as rabbitmq-auth-backend-ldap. -## -## NB: These settings require certain plugins to be enabled. -## -## Related doc guides: -## -## * https://rabbitmq.com/plugins.html -## * https://rabbitmq.com/access-control.html -## - -# auth_backends.1 = rabbit_auth_backend_internal - -## uses separate backends for authentication and authorisation, -## see below. -# auth_backends.1.authn = rabbit_auth_backend_ldap -# auth_backends.1.authz = rabbit_auth_backend_internal - -## The rabbitmq_auth_backend_ldap plugin allows the broker to -## perform authentication and authorisation by deferring to an -## external LDAP server. -## -## Relevant doc guides: -## -## * https://rabbitmq.com/ldap.html -## * https://rabbitmq.com/access-control.html -## -## uses LDAP for both authentication and authorisation -# auth_backends.1 = rabbit_auth_backend_ldap - -## uses HTTP service for both authentication and -## authorisation -# auth_backends.1 = rabbit_auth_backend_http - -## uses two backends in a chain: HTTP first, then internal -# auth_backends.1 = rabbit_auth_backend_http -# auth_backends.2 = rabbit_auth_backend_internal - -## Authentication -## The built-in mechanisms are 'PLAIN', -## 'AMQPLAIN', and 'EXTERNAL' Additional mechanisms can be added via -## plugins. -## -## Related doc guide: https://rabbitmq.com/authentication.html. -## -# auth_mechanisms.1 = PLAIN -# auth_mechanisms.2 = AMQPLAIN - -## The rabbitmq-auth-mechanism-ssl plugin makes it possible to -## authenticate a user based on the client's x509 (TLS) certificate. -## Related doc guide: https://rabbitmq.com/authentication.html. -## -## To use auth-mechanism-ssl, the EXTERNAL mechanism should -## be enabled: -## -# auth_mechanisms.1 = PLAIN -# auth_mechanisms.2 = AMQPLAIN -# auth_mechanisms.3 = EXTERNAL - -## To force x509 certificate-based authentication on all clients, -## exclude all other mechanisms (note: this will disable password-based -## authentication even for the management UI!): -## -# auth_mechanisms.1 = EXTERNAL - -## This pertains to both the rabbitmq-auth-mechanism-ssl plugin and -## STOMP ssl_cert_login configurations. See the RabbitMQ STOMP plugin -## configuration section later in this file and the README in -## https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl for further -## details. -## -## To use the TLS cert's CN instead of its DN as the username -## -# ssl_cert_login_from = common_name - -## TLS handshake timeout, in milliseconds. -## -# ssl_handshake_timeout = 5000 - - -## Password hashing implementation. Will only affect newly -## created users. To recalculate hash for an existing user -## it's necessary to update her password. -## -## To use SHA-512, set to rabbit_password_hashing_sha512. -## -# password_hashing_module = rabbit_password_hashing_sha256 - -## When importing definitions exported from versions earlier -## than 3.6.0, it is possible to go back to MD5 (only do this -## as a temporary measure!) by setting this to rabbit_password_hashing_md5. -## -# password_hashing_module = rabbit_password_hashing_md5 - -## -## Default User / VHost -## ==================== -## - -## On first start RabbitMQ will create a vhost and a user. These -## config items control what gets created. -## Relevant doc guide: https://rabbitmq.com/access-control.html -## -# default_vhost = / -# default_user = guest -# default_pass = guest - -# default_permissions.configure = .* -# default_permissions.read = .* -# default_permissions.write = .* - -## Tags for default user -## -## For more details about tags, see the documentation for the -## Management Plugin at https://rabbitmq.com/management.html. -## -# default_user_tags.administrator = true - -## Define other tags like this: -# default_user_tags.management = true -# default_user_tags.custom_tag = true - -## -## Additional network and protocol related configuration -## ===================================================== -## - -## Set the default AMQP 0-9-1 heartbeat interval (in seconds). -## Related doc guides: -## -## * https://rabbitmq.com/heartbeats.html -## * https://rabbitmq.com/networking.html -## -# heartbeat = 60 - -## Set the max permissible size of an AMQP frame (in bytes). -## -# frame_max = 131072 - -## Set the max frame size the server will accept before connection -## tuning occurs -## -# initial_frame_max = 4096 - -## Set the max permissible number of channels per connection. -## 0 means "no limit". -## -# channel_max = 128 - -## Customising TCP Listener (Socket) Configuration. -## -## Related doc guides: -## -## * https://rabbitmq.com/networking.html -## * https://www.erlang.org/doc/man/inet.html#setopts-2 -## - -# tcp_listen_options.backlog = 128 -# tcp_listen_options.nodelay = true -# tcp_listen_options.exit_on_close = false -# -# tcp_listen_options.keepalive = true -# tcp_listen_options.send_timeout = 15000 -# -# tcp_listen_options.buffer = 196608 -# tcp_listen_options.sndbuf = 196608 -# tcp_listen_options.recbuf = 196608 - -## -## Resource Limits & Flow Control -## ============================== -## -## Related doc guide: https://rabbitmq.com/memory.html. - -## Memory-based Flow Control threshold. -## -# vm_memory_high_watermark.relative = 0.4 - -## Alternatively, we can set a limit (in bytes) of RAM used by the node. -## -# vm_memory_high_watermark.absolute = 1073741824 - -## Or you can set absolute value using memory units (with RabbitMQ 3.6.0+). -## Absolute watermark will be ignored if relative is defined! -## -# vm_memory_high_watermark.absolute = 2GB -## -## Supported unit symbols: -## -## k, kiB: kibibytes (2^10 - 1,024 bytes) -## M, MiB: mebibytes (2^20 - 1,048,576 bytes) -## G, GiB: gibibytes (2^30 - 1,073,741,824 bytes) -## kB: kilobytes (10^3 - 1,000 bytes) -## MB: megabytes (10^6 - 1,000,000 bytes) -## GB: gigabytes (10^9 - 1,000,000,000 bytes) - - - -## Fraction of the high watermark limit at which queues start to -## page message out to disc in order to free up memory. -## For example, when vm_memory_high_watermark is set to 0.4 and this value is set to 0.5, -## paging can begin as early as when 20% of total available RAM is used by the node. -## -## Values greater than 1.0 can be dangerous and should be used carefully. -## -## One alternative to this is to use durable queues and publish messages -## as persistent (delivery mode = 2). With this combination queues will -## move messages to disk much more rapidly. -## -## Another alternative is to configure queues to page all messages (both -## persistent and transient) to disk as quickly -## as possible, see https://rabbitmq.com/lazy-queues.html. -## -# vm_memory_high_watermark_paging_ratio = 0.5 - -## Selects Erlang VM memory consumption calculation strategy. Can be `allocated`, `rss` or `legacy` (aliased as `erlang`), -## Introduced in 3.6.11. `rss` is the default as of 3.6.12. -## See https://github.com/rabbitmq/rabbitmq-server/issues/1223 and rabbitmq/rabbitmq-common#224 for background. -# vm_memory_calculation_strategy = rss - -## Interval (in milliseconds) at which we perform the check of the memory -## levels against the watermarks. -## -# memory_monitor_interval = 2500 - -## The total memory available can be calculated from the OS resources -## - default option - or provided as a configuration parameter. -# total_memory_available_override_value = 2GB - -## Set disk free limit (in bytes). Once free disk space reaches this -## lower bound, a disk alarm will be set - see the documentation -## listed above for more details. -## -## Absolute watermark will be ignored if relative is defined! -# disk_free_limit.absolute = 50000 - -## Or you can set it using memory units (same as in vm_memory_high_watermark) -## with RabbitMQ 3.6.0+. -# disk_free_limit.absolute = 500KB -# disk_free_limit.absolute = 50mb -# disk_free_limit.absolute = 5GB - -## Alternatively, we can set a limit relative to total available RAM. -## -## Values lower than 1.0 can be dangerous and should be used carefully. -# disk_free_limit.relative = 2.0 - -## -## Clustering -## ===================== -## -# cluster_partition_handling = ignore - -## pause_if_all_down strategy require additional configuration -# cluster_partition_handling = pause_if_all_down - -## Recover strategy. Can be either 'autoheal' or 'ignore' -# cluster_partition_handling.pause_if_all_down.recover = ignore - -## Node names to check -# cluster_partition_handling.pause_if_all_down.nodes.1 = rabbit@localhost -# cluster_partition_handling.pause_if_all_down.nodes.2 = hare@localhost - -## Mirror sync batch size, in messages. Increasing this will speed -## up syncing but total batch size in bytes must not exceed 2 GiB. -## Available in RabbitMQ 3.6.0 or later. -## -# mirroring_sync_batch_size = 4096 - -## Make clustering happen *automatically* at startup. Only applied -## to nodes that have just been reset or started for the first time. -## -## Relevant doc guide: https://rabbitmq.com//cluster-formation.html -## - -# cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config -# -# cluster_formation.classic_config.nodes.1 = rabbit1@hostname -# cluster_formation.classic_config.nodes.2 = rabbit2@hostname -# cluster_formation.classic_config.nodes.3 = rabbit3@hostname -# cluster_formation.classic_config.nodes.4 = rabbit4@hostname - -## DNS-based peer discovery. This backend will list A records -## of the configured hostname and perform reverse lookups for -## the addresses returned. - -# cluster_formation.peer_discovery_backend = rabbit_peer_discovery_dns -# cluster_formation.dns.hostname = discovery.eng.example.local - -## This node's type can be configured. If you are not sure -## what node type to use, always use 'disc'. -# cluster_formation.node_type = disc - -## Interval (in milliseconds) at which we send keepalive messages -## to other cluster members. Note that this is not the same thing -## as net_ticktime; missed keepalive messages will not cause nodes -## to be considered down. -## -# cluster_keepalive_interval = 10000 - -## -## Statistics Collection -## ===================== -## - -## Set (internal) statistics collection granularity. -## -## Can be none, coarse or fine -# collect_statistics = none - -# collect_statistics = coarse - -## Statistics collection interval (in milliseconds). Increasing -## this will reduce the load on management database. -## -# collect_statistics_interval = 5000 - -## -## Misc/Advanced Options -## ===================== -## -## NB: Change these only if you understand what you are doing! -## - -## Explicitly enable/disable hipe compilation. -## -# hipe_compile = false - -## Timeout used when waiting for Mnesia tables in a cluster to -## become available. -## -# mnesia_table_loading_retry_timeout = 30000 - -## Retries when waiting for Mnesia tables in the cluster startup. Note that -## this setting is not applied to Mnesia upgrades or node deletions. -## -# mnesia_table_loading_retry_limit = 10 - -## Size in bytes below which to embed messages in the queue index. -## Related doc guide: https://rabbitmq.com/persistence-conf.html -## -# queue_index_embed_msgs_below = 4096 - -## You can also set this size in memory units -## -# queue_index_embed_msgs_below = 4kb - -## Whether or not to enable background periodic forced GC runs for all -## Erlang processes on the node in "waiting" state. -## -## Disabling background GC may reduce latency for client operations, -## keeping it enabled may reduce median RAM usage by the binary heap -## (see https://www.erlang-solutions.com/blog/erlang-garbage-collector.html). -## -## Before trying this option, please take a look at the memory -## breakdown (https://www.rabbitmq.com/memory-use.html). -## -# background_gc_enabled = false - -## Target (desired) interval (in milliseconds) at which we run background GC. -## The actual interval will vary depending on how long it takes to execute -## the operation (can be higher than this interval). Values less than -## 30000 milliseconds are not recommended. -## -# background_gc_target_interval = 60000 - -## Whether or not to enable proxy protocol support. -## Once enabled, clients cannot directly connect to the broker -## anymore. They must connect through a load balancer that sends the -## proxy protocol header to the broker at connection time. -## This setting applies only to AMQP clients, other protocols -## like MQTT or STOMP have their own setting to enable proxy protocol. -## See the plugins documentation for more information. -## -# proxy_protocol = false - -## ---------------------------------------------------------------------------- -## Advanced Erlang Networking/Clustering Options. -## -## Related doc guide: https://rabbitmq.com/clustering.html -## ---------------------------------------------------------------------------- - -# ====================================== -# Kernel section -# ====================================== - -## Timeout used to detect peer unavailability, including CLI tools. -## Related doc guide: https://www.rabbitmq.com/nettick.html. -## -# net_ticktime = 60 - -## Inter-node communication port range. -## The parameters inet_dist_listen_min and inet_dist_listen_max -## can be configured in the classic config format only. -## Related doc guide: https://www.rabbitmq.com/networking.html#epmd-inet-dist-port-range. - - -## ---------------------------------------------------------------------------- -## RabbitMQ Management Plugin -## -## Related doc guide: https://rabbitmq.com/management.html. -## ---------------------------------------------------------------------------- - -# ======================================= -# Management section -# ======================================= - -## Preload schema definitions from the following JSON file. -## Related doc guide: https://rabbitmq.com/management.html#load-definitions. -## -# management.load_definitions = /path/to/exported/definitions.json - -## Log all requests to the management HTTP API to a file. -## -# management.http_log_dir = /path/to/access.log - -## HTTP listener and embedded Web server settings. -# ## See https://rabbitmq.com/management.html for details. -# -# management.tcp.port = 15672 -# management.tcp.ip = 0.0.0.0 -# -# management.tcp.shutdown_timeout = 7000 -# management.tcp.max_keepalive = 120 -# management.tcp.idle_timeout = 120 -# management.tcp.inactivity_timeout = 120 -# management.tcp.request_timeout = 120 -# management.tcp.compress = true - -## HTTPS listener settings. -## See https://rabbitmq.com/management.html and https://rabbitmq.com/ssl.html for details. -## -# management.ssl.port = 15671 -# management.ssl.cacertfile = /path/to/ca_certificate.pem -# management.ssl.certfile = /path/to/server_certificate.pem -# management.ssl.keyfile = /path/to/server_key.pem - -## More TLS options -# management.ssl.honor_cipher_order = true -# management.ssl.honor_ecc_order = true -# management.ssl.client_renegotiation = false -# management.ssl.secure_renegotiate = true - -## Supported TLS versions -# management.ssl.versions.1 = tlsv1.2 -# management.ssl.versions.2 = tlsv1.1 - -## Cipher suites the server is allowed to use -# management.ssl.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384 -# management.ssl.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384 -# management.ssl.ciphers.3 = ECDHE-ECDSA-AES256-SHA384 -# management.ssl.ciphers.4 = ECDHE-RSA-AES256-SHA384 -# management.ssl.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384 -# management.ssl.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384 -# management.ssl.ciphers.7 = ECDH-ECDSA-AES256-SHA384 -# management.ssl.ciphers.8 = ECDH-RSA-AES256-SHA384 -# management.ssl.ciphers.9 = DHE-RSA-AES256-GCM-SHA384 - - - -## One of 'basic', 'detailed' or 'none'. See -## https://rabbitmq.com/management.html#fine-stats for more details. -# management.rates_mode = basic - -## Configure how long aggregated data (such as message rates and queue -## lengths) is retained. Please read the plugin's documentation in -## https://rabbitmq.com/management.html#configuration for more -## details. -## Your can use 'minute', 'hour' and 'day' keys or integer key (in seconds) -# management.sample_retention_policies.global.minute = 5 -# management.sample_retention_policies.global.hour = 60 -# management.sample_retention_policies.global.day = 1200 - -# management.sample_retention_policies.basic.minute = 5 -# management.sample_retention_policies.basic.hour = 60 - -# management.sample_retention_policies.detailed.10 = 5 - -## ---------------------------------------------------------------------------- -## RabbitMQ Shovel Plugin -## -## Related doc guide: https://rabbitmq.com/shovel.html -## ---------------------------------------------------------------------------- - -## Shovel plugin config example is defined in additional.config file - - -## ---------------------------------------------------------------------------- -## RabbitMQ STOMP Plugin -## -## Related doc guide: https://rabbitmq.com/stomp.html -## ---------------------------------------------------------------------------- - -# ======================================= -# STOMP section -# ======================================= - -## See https://rabbitmq.com/stomp.html for details. - -## TCP listeners. -## -# stomp.listeners.tcp.1 = 127.0.0.1:61613 -# stomp.listeners.tcp.2 = ::1:61613 - -## TCP listener settings -## -# stomp.tcp_listen_options.backlog = 2048 -# stomp.tcp_listen_options.recbuf = 131072 -# stomp.tcp_listen_options.sndbuf = 131072 -# -# stomp.tcp_listen_options.keepalive = true -# stomp.tcp_listen_options.nodelay = true -# -# stomp.tcp_listen_options.exit_on_close = true -# stomp.tcp_listen_options.send_timeout = 120 - -## Proxy protocol support -## -# stomp.proxy_protocol = false - -## TLS listeners -## See https://rabbitmq.com/stomp.html and https://rabbitmq.com/ssl.html for details. -# stomp.listeners.ssl.default = 61614 -# -# ssl_options.cacertfile = path/to/cacert.pem -# ssl_options.certfile = path/to/cert.pem -# ssl_options.keyfile = path/to/key.pem -# ssl_options.verify = verify_peer -# ssl_options.fail_if_no_peer_cert = true - - -## Number of Erlang processes that will accept connections for the TCP -## and TLS listeners. -## -# stomp.num_acceptors.tcp = 10 -# stomp.num_acceptors.ssl = 1 - -## Additional TLS options - -## Extract a name from the client's certificate when using TLS. -## -# stomp.ssl_cert_login = true - -## Set a default user name and password. This is used as the default login -## whenever a CONNECT frame omits the login and passcode headers. -## -## Please note that setting this will allow clients to connect without -## authenticating! -## -# stomp.default_user = guest -# stomp.default_pass = guest - -## If a default user is configured, or you have configured use TLS client -## certificate based authentication, you can choose to allow clients to -## omit the CONNECT frame entirely. If set to true, the client is -## automatically connected as the default user or user supplied in the -## TLS certificate whenever the first frame sent on a session is not a -## CONNECT frame. -## -# stomp.implicit_connect = true - -## Whether or not to enable proxy protocol support. -## Once enabled, clients cannot directly connect to the broker -## anymore. They must connect through a load balancer that sends the -## proxy protocol header to the broker at connection time. -## This setting applies only to STOMP clients, other protocols -## like MQTT or AMQP have their own setting to enable proxy protocol. -## See the plugins or broker documentation for more information. -## -# stomp.proxy_protocol = false - -## ---------------------------------------------------------------------------- -## RabbitMQ MQTT Adapter -## -## See https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md -## for details -## ---------------------------------------------------------------------------- - -# ======================================= -# MQTT section -# ======================================= - -## TCP listener settings. -## -# mqtt.listeners.tcp.1 = 127.0.0.1:61613 -# mqtt.listeners.tcp.2 = ::1:61613 - -## TCP listener options (as per the broker configuration). -## -# mqtt.tcp_listen_options.backlog = 4096 -# mqtt.tcp_listen_options.recbuf = 131072 -# mqtt.tcp_listen_options.sndbuf = 131072 -# -# mqtt.tcp_listen_options.keepalive = true -# mqtt.tcp_listen_options.nodelay = true -# -# mqtt.tcp_listen_options.exit_on_close = true -# mqtt.tcp_listen_options.send_timeout = 120 - -## TLS listener settings -## ## See https://rabbitmq.com/mqtt.html and https://rabbitmq.com/ssl.html for details. -# -# mqtt.listeners.ssl.default = 8883 -# -# ssl_options.cacertfile = /path/to/tls/ca_certificate_bundle.pem -# ssl_options.certfile = /path/to/tls/server_certificate.pem -# ssl_options.keyfile = /path/to/tls/server_key.pem -# ssl_options.verify = verify_peer -# ssl_options.fail_if_no_peer_cert = true -# - - -## Number of Erlang processes that will accept connections for the TCP -## and TLS listeners. -## -# mqtt.num_acceptors.tcp = 10 -# mqtt.num_acceptors.ssl = 10 - -## Whether or not to enable proxy protocol support. -## Once enabled, clients cannot directly connect to the broker -## anymore. They must connect through a load balancer that sends the -## proxy protocol header to the broker at connection time. -## This setting applies only to STOMP clients, other protocols -## like STOMP or AMQP have their own setting to enable proxy protocol. -## See the plugins or broker documentation for more information. -## -# mqtt.proxy_protocol = false - -## Set the default user name and password used for anonymous connections (when client -## provides no credentials). Anonymous connections are highly discouraged! -## -# mqtt.default_user = guest -# mqtt.default_pass = guest - -## Enable anonymous connections. If this is set to false, clients MUST provide -## credentials in order to connect. See also the mqtt.default_user/mqtt.default_pass -## keys. Anonymous connections are highly discouraged! -## -# mqtt.allow_anonymous = true - -## If you have multiple vhosts, specify the one to which the -## adapter connects. -## -# mqtt.vhost = / - -## Specify the exchange to which messages from MQTT clients are published. -## -# mqtt.exchange = amq.topic - -## Specify TTL (time to live) to control the lifetime of non-clean sessions. -## -# mqtt.subscription_ttl = 1800000 - -## Set the prefetch count (governing the maximum number of unacknowledged -## messages that will be delivered). -## -# mqtt.prefetch = 10 - - -## ---------------------------------------------------------------------------- -## RabbitMQ AMQP 1.0 Support -## -## See https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md. -## ---------------------------------------------------------------------------- - -# ======================================= -# AMQP 1.0 section -# ======================================= - - -## Connections that are not authenticated with SASL will connect as this -## account. See the README for more information. -## -## Please note that setting this will allow clients to connect without -## authenticating! -## -# amqp1_0.default_user = guest - -## Enable protocol strict mode. See the README for more information. -## -# amqp1_0.protocol_strict_mode = false - -## Logging settings. -## -## See https://rabbitmq.com/logging.html and https://github.com/erlang-lager/lager for details. -## - -## Log directory, taken from the RABBITMQ_LOG_BASE env variable by default. -## -# log.dir = /var/log/rabbitmq - -## Logging to file. Can be false or a filename. -## Default: -# log.file = rabbit.log - -## To disable logging to a file -# log.file = false - -## Log level for file logging -## -# log.file.level = info - -## File rotation config. No rotation by default. -## DO NOT SET rotation date to ''. Leave the value unset if "" is the desired value -# log.file.rotation.date = $D0 -# log.file.rotation.size = 0 - -## Logging to console (can be true or false) -## -# log.console = false - -## Log level for console logging -## -# log.console.level = info - -## Logging to the amq.rabbitmq.log exchange (can be true or false) -## -# log.exchange = false - -## Log level to use when logging to the amq.rabbitmq.log exchange -## -# log.exchange.level = info - - - -## ---------------------------------------------------------------------------- -## RabbitMQ LDAP Plugin -## -## Related doc guide: https://rabbitmq.com/ldap.html. -## -## ---------------------------------------------------------------------------- - -# ======================================= -# LDAP section -# ======================================= - -## -## Connecting to the LDAP server(s) -## ================================ -## - -## Specify servers to bind to. You *must* set this in order for the plugin -## to work properly. -## -# auth_ldap.servers.1 = your-server-name-goes-here - -## You can define multiple servers -# auth_ldap.servers.2 = your-other-server - -## Connect to the LDAP server using TLS -## -# auth_ldap.use_ssl = false - -## Specify the LDAP port to connect to -## -# auth_ldap.port = 389 - -## LDAP connection timeout, in milliseconds or 'infinity' -## -# auth_ldap.timeout = infinity - -## Or number -# auth_ldap.timeout = 500 - -## Enable logging of LDAP queries. -## One of -## - false (no logging is performed) -## - true (verbose logging of the logic used by the plugin) -## - network (as true, but additionally logs LDAP network traffic) -## -## Defaults to false. -## -# auth_ldap.log = false - -## Also can be true or network -# auth_ldap.log = true -# auth_ldap.log = network - -## -## Authentication -## ============== -## - -## Pattern to convert the username given through AMQP to a DN before -## binding -## -# auth_ldap.user_dn_pattern = cn=${username},ou=People,dc=example,dc=com - -## Alternatively, you can convert a username to a Distinguished -## Name via an LDAP lookup after binding. See the documentation for -## full details. - -## When converting a username to a dn via a lookup, set these to -## the name of the attribute that represents the user name, and the -## base DN for the lookup query. -## -# auth_ldap.dn_lookup_attribute = userPrincipalName -# auth_ldap.dn_lookup_base = DC=gopivotal,DC=com - -## Controls how to bind for authorisation queries and also to -## retrieve the details of users logging in without presenting a -## password (e.g., SASL EXTERNAL). -## One of -## - as_user (to bind as the authenticated user - requires a password) -## - anon (to bind anonymously) -## - {UserDN, Password} (to bind with a specified user name and password) -## -## Defaults to 'as_user'. -## -# auth_ldap.other_bind = as_user - -## Or can be more complex: -# auth_ldap.other_bind.user_dn = User -# auth_ldap.other_bind.password = Password - -## If user_dn and password defined - other options is ignored. - -# ----------------------------- -# Too complex section of LDAP -# ----------------------------- - -## -## Authorisation -## ============= -## - -## The LDAP plugin can perform a variety of queries against your -## LDAP server to determine questions of authorisation. -## -## Related doc guide: https://rabbitmq.com/ldap.html#authorisation. - -## Following configuration should be defined in advanced.config file -## DO NOT UNCOMMENT THESE LINES! - -## Set the query to use when determining vhost access -## -## {vhost_access_query, {in_group, -## "ou=${vhost}-users,ou=vhosts,dc=example,dc=com"}}, - -## Set the query to use when determining resource (e.g., queue) access -## -## {resource_access_query, {constant, true}}, - -## Set queries to determine which tags a user has -## -## {tag_queries, []} -# ]}, -# ----------------------------- - diff --git a/hpc-rabbitmq/scripts/local.env b/hpc-rabbitmq/scripts/local.env deleted file mode 100644 index fd1dd3a8d..000000000 --- a/hpc-rabbitmq/scripts/local.env +++ /dev/null @@ -1,5 +0,0 @@ -## HCP RabbitMQ Conf -HPC_RABBITMQ_USER=user -HPC_RABBITMQ_PASSWORD=user -HPC_RABBITMQ_HOST=hpc-rabbitmq -RABBITMQ_PID_FILE=/var/lib/rabbitmq/mnesia/rabbitmq diff --git a/hpc-rabbitmq/scripts/production.env b/hpc-rabbitmq/scripts/production.env deleted file mode 100644 index d2a457b76..000000000 --- a/hpc-rabbitmq/scripts/production.env +++ /dev/null @@ -1,5 +0,0 @@ -## HPC RabbitMQ Config (Staging) -HPC_RABBITMQ_USER=hpc_user -HPC_RABBITMQ_PASSWORD=HH7YdkZXdcoNobm9 -HPC_RABBITMQ_HOST=hpc-rabbitmq -RABBITMQ_PID_FILE=/var/lib/rabbitmq/mnesia/rabbitmq diff --git a/hpc-rabbitmq/scripts/setup.sh b/hpc-rabbitmq/scripts/setup.sh deleted file mode 100644 index 5a7dbd930..000000000 --- a/hpc-rabbitmq/scripts/setup.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -( rabbitmqctl wait $RABBITMQ_PID_FILE && \ - rabbitmqctl add_user $HPC_RABBITMQ_USER $HPC_RABBITMQ_PASSWORD && \ - rabbitmqctl set_permissions $HPC_RABBITMQ_USER ".*" ".*" ".*" ) & -rabbitmq-server $@ diff --git a/hpc-rabbitmq/scripts/staging.env b/hpc-rabbitmq/scripts/staging.env deleted file mode 100644 index d2a457b76..000000000 --- a/hpc-rabbitmq/scripts/staging.env +++ /dev/null @@ -1,5 +0,0 @@ -## HPC RabbitMQ Config (Staging) -HPC_RABBITMQ_USER=hpc_user -HPC_RABBITMQ_PASSWORD=HH7YdkZXdcoNobm9 -HPC_RABBITMQ_HOST=hpc-rabbitmq -RABBITMQ_PID_FILE=/var/lib/rabbitmq/mnesia/rabbitmq diff --git a/iipsrv/Dockerfile b/iipsrv/Dockerfile index c277c0fc4..4c6b41bbf 100644 --- a/iipsrv/Dockerfile +++ b/iipsrv/Dockerfile @@ -1,26 +1,32 @@ -FROM alpine:3 +FROM alpine AS builder -RUN apk update -RUN apk upgrade RUN apk add --no-cache \ autoconf \ automake \ build-base \ libtool \ libpng-dev \ - m4 \ - make \ openjpeg-dev \ - pkgconfig \ tiff-dev -RUN wget https://github.com/ruven/iipsrv/archive/refs/heads/master.zip -RUN unzip master.zip -WORKDIR iipsrv-master +RUN wget https://github.com/ruven/iipsrv/archive/refs/heads/master.zip && unzip master.zip +WORKDIR /iipsrv-master RUN ./autogen.sh RUN ./configure --enable-openjpeg RUN make +FROM alpine + +RUN apk add --no-cache \ + libgcc \ + libstdc++ \ + libgomp \ + libpng \ + openjpeg \ + tiff + +COPY --from=builder /iipsrv-master/src/iipsrv.fcgi /fcgi-bin/iipsrv.fcgi + ENV JPEG_QUALITY 90 ENV FILESYSTEM_PREFIX /rodan/data/ ENV VERBOSITY 2 @@ -28,5 +34,4 @@ ENV PORT 9003 EXPOSE ${PORT} - -ENTRYPOINT ./src/iipsrv.fcgi --bind 0.0.0.0:${PORT} +ENTRYPOINT /fcgi-bin/iipsrv.fcgi --bind 0.0.0.0:${PORT} diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 0a6123dab..678290475 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,13 +1,4 @@ ARG VERSION -FROM ddmal/rodan-client:${VERSION} as webapp - -# Add local configuration and build. -RUN rm -rf /code/configuration.json -COPY ./config/configuration.json /code/ -RUN /code/node_modules/.bin/gulp dist - - -########################################################### FROM ddmal/rodan-main:${VERSION} as rodan-static RUN touch /code/Rodan/database.log /code/Rodan/rodan.log @@ -35,10 +26,8 @@ RUN apt-get -qq update \ # Add configuration files. COPY ./config/nginx.conf /etc/nginx/nginx.conf COPY ./config/ssl.conf /etc/nginx/conf.d/ssl.conf -COPY ./config/ssl-http.conf /etc/nginx/conf.d/ssl-http.conf COPY ./config/error.conf /etc/nginx/conf.d/error.conf COPY ./config/rodan.conf /etc/nginx/sites-available/rodan.conf -COPY ./config/rodan.stream /etc/nginx/sites-available/rodan.stream RUN mkdir -p /rodan/data RUN chown -R www-data /rodan @@ -47,32 +36,15 @@ RUN chown -R www-data /rodan RUN rm /usr/share/nginx/html/* COPY ./html/ /var/www/default/ -# Add Rodan Client -COPY --from=webapp /code/dist/* /var/www/default/dist/ -RUN set -e \ - && mkdir /var/www/default/dist/resources \ - && mv /var/www/default/dist/favicon.ico /var/www/default/dist/resources/ \ - && mv /var/www/default/dist/grids-responsive-min.css /var/www/default/dist/resources/ # Add Rodan Static files COPY --from=rodan-static /code/Rodan/staticfiles /rodan/static -# Create and add SSL certificates. -#RUN mkdir /etc/nginx/keys -#COPY ./certs/local_cert.pem /etc/nginx/keys/cert.pem -#COPY ./certs/local_key.pem /etc/nginx/keys/key.pem -#COPY ./certs/local_dhparam.pem /etc/nginx/keys/dhparam.pem - -RUN mkdir -p /etc/letsencrypt -RUN mkdir -p /var/www/letsencrypt/.well-known/acme-challenge - -# This script corrects permissions in the file system COPY ./scripts/setup /run/ RUN chmod +x /run/setup -# This script starts nginx for development +COPY ../scripts/wait-for-app /run/ +RUN chmod +x /run/wait-for-app + +# This script starts nginx COPY ./scripts/start /run/ RUN chmod +x /run/start - -# This script starts nginx for production -COPY ./scripts/start-production /run/ -RUN chmod +x /run/start-production diff --git a/nginx/Dockerfile.arm b/nginx/Dockerfile.arm deleted file mode 100644 index 962ea88e3..000000000 --- a/nginx/Dockerfile.arm +++ /dev/null @@ -1,78 +0,0 @@ -ARG VERSION -FROM ddmal/rodan-client:${VERSION} as webapp - -# Add local configuration and build. -RUN rm -rf /code/configuration.json -COPY ./config/configuration.json /code/ -RUN /code/node_modules/.bin/gulp dist - - -########################################################### -FROM ddmal/rodan-main:${VERSION} as rodan-static - -RUN touch /code/Rodan/database.log /code/Rodan/rodan.log - -RUN export DJANGO_SECRET_KEY=localdev \ - && export DJANGO_ACCESS_LOG=None \ - && export DJANGO_DEBUG_LOG=None \ - && export DJANGO_ALLOWED_HOSTS=* \ - && export CELERY_JOB_QUEUE=None \ - # Check to see if the static folder exists - && mkdir /code/Rodan/rodan/static \ - # If it does, erase everything. - || rm -rf /code/Rodan/rodan/static/* \ - && python3 /code/Rodan/manage.py collectstatic --noinput - - -########################################################### -FROM nginx:1.19 - -# Install OS dependencies -RUN apt-get -qq update \ - && apt-get -qq install openssl certbot unzip -y \ - && rm -rf /var/lib/apt/lists/* - -# Add configuration files. -COPY ./config/nginx.conf /etc/nginx/nginx.conf -COPY ./config/ssl.conf /etc/nginx/conf.d/ssl.conf -COPY ./config/ssl-http.conf /etc/nginx/conf.d/ssl-http.conf -COPY ./config/error.conf /etc/nginx/conf.d/error.conf -COPY ./config/rodan.conf /etc/nginx/sites-available/rodan.conf -COPY ./config/rodan_m1.stream /etc/nginx/sites-available/rodan.stream - -RUN mkdir -p /rodan/data -RUN chown -R www-data /rodan - -# Add 40x and 50x pages. -RUN rm /usr/share/nginx/html/* -COPY ./html/ /var/www/default/ - -# Add Rodan Client -COPY --from=webapp /code/dist/* /var/www/default/dist/ -RUN set -e \ - && mkdir /var/www/default/dist/resources \ - && mv /var/www/default/dist/favicon.ico /var/www/default/dist/resources/ \ - && mv /var/www/default/dist/grids-responsive-min.css /var/www/default/dist/resources/ -# Add Rodan Static files -COPY --from=rodan-static /code/Rodan/staticfiles /rodan/static - -# Create and add SSL certificates. -#RUN mkdir /etc/nginx/keys -#COPY ./certs/local_cert.pem /etc/nginx/keys/cert.pem -#COPY ./certs/local_key.pem /etc/nginx/keys/key.pem -#COPY ./certs/local_dhparam.pem /etc/nginx/keys/dhparam.pem - -RUN mkdir -p /etc/letsencrypt -RUN mkdir -p /var/www/letsencrypt/.well-known/acme-challenge - -# This script corrects permissions in the file system -COPY ./scripts/setup /run/ -RUN chmod +x /run/setup - -# This script starts nginx for development -COPY ./scripts/start /run/ -RUN chmod +x /run/start - -# This script starts nginx for production -COPY ./scripts/start-production /run/ -RUN chmod +x /run/start-production diff --git a/nginx/Dockerfile.production b/nginx/Dockerfile.production deleted file mode 100644 index 75edf5fde..000000000 --- a/nginx/Dockerfile.production +++ /dev/null @@ -1,7 +0,0 @@ -FROM ddmal/nginx:nightly -ARG SERVER_HOST - -# [TODO] Run basic config test. It will check to make sure hosts upstream are online. -# But health checks will reboot the current instance, and not others. Do not only rely on this. -# HEALTHCHECK --interval=5m --timeout=3s \ -# CMD service nginx configtest || exit 1 diff --git a/nginx/certs/local_cert.pem b/nginx/certs/local_cert.pem deleted file mode 100644 index 3101b9005..000000000 --- a/nginx/certs/local_cert.pem +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFtjCCA56gAwIBAgIJANcherjxf2hXMA0GCSqGSIb3DQEBCwUAMHAxCzAJBgNV -BAYTAkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRkwFwYD -VQQKDBBNY0dpbGxVbml2ZXJzaXR5MQ4wDAYDVQQLDAVERE1BTDESMBAGA1UEAwwJ -bG9jYWxob3N0MB4XDTE4MDgyNzE2MDA1N1oXDTI4MDgyNDE2MDA1N1owcDELMAkG -A1UEBhMCQ0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxGTAX -BgNVBAoMEE1jR2lsbFVuaXZlcnNpdHkxDjAMBgNVBAsMBURETUFMMRIwEAYDVQQD -DAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO2rtS -DQBMp6ay/1xcKOl7mj5MvdYkxOI0FJSBoqk+8KMUF7f9+eXTMeDMRpA6VCluj2SW -5271rk35m7CIAMa3KdZ+7K4VLVSL8IfP0787ti1Npdg2OxHTMQwlqiXi6qCEEhYz -OxYgVpyobVnVsenHut1ijN1ZFs4yXWCuX+s23Ku08Gnh+iYU6zBVWg+F60SP21Iw -oBsNn1HpJGoI5GLwb1ptxVhykudA/G8Zj5/LlEGlZDeMQlwuroBHzQkDap35FYNz -Koje57SOJxxbP4jwWFvVyNPhiBww9rDmSMreXiCtGjS43Gd3x5Tvvuk5HKThPSlv -ikWHWfcGkzUDTpOsxjNAKzYDOsUJHCvbMtkQpub7LXD8jGSIKUta2oVcc1UaWzPd -SiPw0+GNe6+6sdCeiMgOxbNZxwISjTFrVzXjKhyOwaq19beV9toVxavcgzWwAr+m -guOzikPEzaPKdtbyXFvEo1ucO6eKF/Nx7/Xgr59TM5Ygqw+UGuaMwseCcvS2Fgxs -HGNGlXfk/+atmEd03+f+RDlccVs5gmHD7LT5WM0p/eyHqqIkW45HDYQCttzH5Nqz -Q/aMOCPC4+03+8TvFKjOrFGZwiRIevN3c8njP3gNLqxY3t0Uk0kearTzaLAwdgOn -cZf++ZufVtqgQdnS2939Ln6jAJd26nnyHbAqkQIDAQABo1MwUTAdBgNVHQ4EFgQU -dRW0ichLzNOLAWfRMzwpvrGWziUwHwYDVR0jBBgwFoAUdRW0ichLzNOLAWfRMzwp -vrGWziUwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAb3m+PKK5 -wq1aisyAQP/rc667j8qZOcrqb6KBxsNEBwPucOet+bW1UFW7wvJYzIcY9Yr4Mz0o -uj+llg3XjTA75hxTIkc/Ajua7jnYbTV3IHDAKdbjkPYPaQpjlM21ElwUN0dcj6z7 -ykcnZZ2n2tckS50j3wVTiEEm8JSDTYgxdbVQn//kaK4LiTpy2bvoa+y6QvcQebfP -avEMIkW8aosPeH1N9CgckJ9e5RW8FO6kc+Av47ZGW4Ph+vlna/eJo04rcc142sOx -UujJ4eiGlfb0plGzmmb7XTEtodmFjGh0GeNg7Q0aluirFoTDUJCat+ctIufvUPgm -7jbSclq0IqfAHp5up11tOWpaqDUdrM9fQRjomHLpZUCWjcrwvh2eI6PdKIDrfGwg -kvmJk/59Yy7ckyy/12/cKaPJty9W7ZIFsPizYzmQ/XrwEfmNWPjYUTjhjq24va+A -0bHvHtfJv79KzaS6xzUeegogfh5JI5cQT359Uagd9NGoKezYrDA00YsddEWD1hNF -erN+t8zlk3EfpH2ExgB7ZfTWp/E8X5HiiLpEs9/+pF18bM4YtmRe23RuUmrUKgoe -YCnnHaP6fwws5Wn9gBCsVaUOh8u4vjz/O/51LIqIeFvXk7z5i5QpQIBdJpkXw6sB -hLq5J39nu77U8OOOW/91+Xi9ipm2qS98giY= ------END CERTIFICATE----- diff --git a/nginx/certs/local_dhparam.pem b/nginx/certs/local_dhparam.pem deleted file mode 100644 index 213f62939..000000000 --- a/nginx/certs/local_dhparam.pem +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN DH PARAMETERS----- -MIIBCAKCAQEA8k4EAa+Ly8/NLclE9EzhUC/yy+wvJlt15p88K7IDrFM1nuOMCzDo -ugCBAL0MczxOIXyDij3XdO9CCFpYDkwp5KvAaiFGQ9aOgAHVuVizWKQYZitBWDJj -PdW98Ze5Ax4CyzaW4t+A5d3uZ2WeJyyEUDd73Lmy248ftFEsXGqrRVrXgFQbXZu9 -HGFCgoizP9wPaANXBZX1ScNrvjEAApaW9hvRV8iqxJrkiejW/+DB83CavkOL1Lt8 -wxN5wU5MZy9YPr64eltYwjjmwkTYBx1RGlW17gLwmIFZXp7GQV/hGDvgaiD5Hzxz -s6Avj2rNMLV+vmGUUTnKd71FgnyZwJBdawIBAg== ------END DH PARAMETERS----- diff --git a/nginx/certs/local_key.pem b/nginx/certs/local_key.pem deleted file mode 100644 index e61a0acc0..000000000 --- a/nginx/certs/local_key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDO2rtSDQBMp6ay -/1xcKOl7mj5MvdYkxOI0FJSBoqk+8KMUF7f9+eXTMeDMRpA6VCluj2SW5271rk35 -m7CIAMa3KdZ+7K4VLVSL8IfP0787ti1Npdg2OxHTMQwlqiXi6qCEEhYzOxYgVpyo -bVnVsenHut1ijN1ZFs4yXWCuX+s23Ku08Gnh+iYU6zBVWg+F60SP21IwoBsNn1Hp -JGoI5GLwb1ptxVhykudA/G8Zj5/LlEGlZDeMQlwuroBHzQkDap35FYNzKoje57SO -JxxbP4jwWFvVyNPhiBww9rDmSMreXiCtGjS43Gd3x5Tvvuk5HKThPSlvikWHWfcG -kzUDTpOsxjNAKzYDOsUJHCvbMtkQpub7LXD8jGSIKUta2oVcc1UaWzPdSiPw0+GN -e6+6sdCeiMgOxbNZxwISjTFrVzXjKhyOwaq19beV9toVxavcgzWwAr+mguOzikPE -zaPKdtbyXFvEo1ucO6eKF/Nx7/Xgr59TM5Ygqw+UGuaMwseCcvS2FgxsHGNGlXfk -/+atmEd03+f+RDlccVs5gmHD7LT5WM0p/eyHqqIkW45HDYQCttzH5NqzQ/aMOCPC -4+03+8TvFKjOrFGZwiRIevN3c8njP3gNLqxY3t0Uk0kearTzaLAwdgOncZf++Zuf -VtqgQdnS2939Ln6jAJd26nnyHbAqkQIDAQABAoICAQCk8FKHNWi0tsW8WtQphFHQ -RghBJun2/aqk/nf/+lTbpANVBSin8jhos4/dMrLUX8F9sAb0MOwQKIFyc8tKVtwc -ttaa9FxG9JNC1nNkqyIEGdp73K7PZ0BqVuSpr8dv7cg6JzXeedHFzWoy/qawN6IC -qaTXbR0eaYnXLQ/nWwJyB3k+2KiFEPKGoZYzqJFSJmvQDYC21yNbNFua/Hc0Se/+ -abwAZWiGS07sSZzJE/XF3ZyOpZ+JTmy0qF4PYpU6TSxTrezXyuXCX51f8B2zQLEP -fFUV3YHdhqt7+2jI5ugkcYe6n3fEo7I5F0JR/Ld427c5BozgrK+OIpVPf9e4oFIs -9R9/0zGJ4j/96S3M48lzbyf3452B2+N1hQONmyDuADFuv6VlTOS7MRQxTKVD8O0R -V++rBDfEuYubJ3aMX2RpruI4H+Fob4Y+bNTdxE9SQrMWFTxAK3LTsKryu6ZPutFY -v+2vrfzBfH+mIld33RaH6Qoo1zEXQIMXQxS/RjtAuQqvlyt0Q1PDcUCiroeQ0n/z -xK1ZqxrTzGxpi0ZPOdWhu1/C/yTqoYTZY+8cQh6XAGiLuF43obKt4J57GVtR5cvf -LFdkHKth+/i4AM4AVr3xWkjz9kvBSCs5tsrR2mfme2YBEil2LJJUJoDgGxRg/Jz5 -I7uKjGStQ4Qu7KH+xxIA8QKCAQEA9xhNbeSgGAujcknLaTqS+bU+a14wAkCoTPQD -r9vzAmBoh9YJSdrm2+ld/sAbsxb2fmMWqeeHJN8QfuEM3bNUAOHrqHrZC844gNrL -Pk23YvSgGmGvtFIFP+UeM+mrip1LcMGTv1KcxJoHZ/GILJQU2Fyk4+v92MuBxkwi -HXNNpiAtorcidRCdB6KOkwmzcXObvoEK1czdQRs8FukSM6oP2lixJlGsFx0jWn9x -cd/H7dzuhqK8dFYlY8aOIfXQKG5AXYhX66SKo2VZfrP/xFYlElr/8eILIEvBuSYh -AIEJwNwDY/j5VnhrzrjMKI+WoOblaOlBkN93aH+onoSm/+DxDQKCAQEA1k8rnKkJ -kNnvQdeldvG2NhxWwEYLLzIv21ssW2XgIBzWEmyLacg/UrbT8Fc5a8dgdph4nv5m -Ibnf/SZXrOFrpJA4YYpkdfO9umiQl2vAU6vCr2+KCzUNagwtKhxvK6F+0l769fP7 -/tL8TUmY49hI/Ue8s8w4W9RKV+AmcuW98UGUIpC6eb0j6bTPOHz7b1Jxfe0rFwuU -AeaYeG3/X8Bvz58xd1j4FeQEklJQuaIUFEhRP6PkGQjXuPGBg47HfXFqbdPFGZLD -fpz5h7BvRTbFaSXHwDBiJ0iIL5rE1jWS8HY/cL50/qxUlxoSQ4R8fM9pdxtdK7oY -nC0sK29cgI/WlQKCAQAlqWGb3137bEK0V8UWO+RNBTAHY2rD3SEJ4aNyOX8XnKQy -GBCAXkoTuMUn4BYYvOZDK004Bl8V4p38CMdSP1QNcmHd4yOT5hG8qhySWXwbLBf/ -DWafgGTmcUCiPvpzfTgTbp3bancUjDmWwTy1NrjapXxIdR7S3WnhVJdaj8mFCaCL -DYjF+QtGL6O1i6P7JdjWN4r0PW53zvPgthOdJk2WRTBzG720JC/QSl57MdWiTqtY -gBNjVAIM7CWbzYC1uOA8oVxtQT4UW41Bf6P7Q/oQiyg5sO9rM8DKPKKJFiHrcF1f -7oHqiR49evM7N2+JBMhwriTdNQJZPiPwTV264Ik9AoIBAQDI/YdRbddi2oHhpnWw -kBDrvrg9q3Nh2Be6ClAXh/wjIehDbzlxBDUfRgiPJ77aripyD51QwBbZGpJPwV4I -7YEe3YODN1/wn6AY62hwGsZNspDsKBe3WxIxmyngjLpWmSdv9VQ4x5JW81lcwuF5 -Dqelo1n+5lEVDoyKzdZBe+YgFfjwUfwRoKnFzaVqvQyy4wc9quj2vA0bm0Dz8XXI -P5qdhhfGbtJ89VS0Ri8fajqaqxhIL1UFhZ2L/jQRRh8iLvQ5/Jql2Vcvr9j2wSoa -J7wNWTl1rergHM5clzJ0E9qzWrM08eqXztemvvTSDbcS9xNaeXdwQyBBmLwMIG0I -xd3hAoIBAGwm037UTBHY98G5XyLAcMh4UHRAzTC9u4mShnK2CZDQj0u1OMIx6u6C -VijQImAxqRealRCoY7M7VoKtwb4EPQgBq/WzqAzMILqgpFN/a6I6UxW47XLLU7bl -9TIDRftPTcZw8keecdVaHGP/ct6FATh+4cLCqBYXen7KSwprjvbE9RJRXi+ZOUnz -VAXqREQOGgy0iBWp4FeHY7M8RGPL3rrp5sgLCX5FFAgMVauS4oWnlYMuSvkOuk9W -eYSPm6qoP77Km48KgG8y64pEmB/mOQZw7JgB2vwbruK43KR11oxiFKwmUEaJPRrG -TXmq4KesHBzKPnL6PBiA+VaMFkjFWL0= ------END PRIVATE KEY----- diff --git a/nginx/config/configuration.json b/nginx/config/configuration.json deleted file mode 100644 index 5d3e68e7a..000000000 --- a/nginx/config/configuration.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "SERVER_HOST": "localhost", - "SERVER_PORT": "80/api", - "SERVER_HTTPS": false, - "SERVER_SOCKET_AVAILABLE": false, - "SERVER_AUTHENTICATION_TYPE": "token", - "ADMIN_CLIENT": - { - "NAME": "", - "EMAIL": "" - }, - "DEBUG": false, - "WORKFLOWBUILDERGUI": - { - "USER_AGENT": "rodan-standard", - "GRID": - { - "DIMENSION": 20, - "LINE_COLOR": "#606060", - "LINE_WIDTH": 0.5 - }, - "ZOOM_MAX": 3.0, - "ZOOM_MIN": 1.0, - "ZOOM_RATE": 0.05, - "ZOOM_INITIAL": 1.7, - "WORKFLOWJOB_WIDTH": 20, - "WORKFLOWJOB_HEIGHT": 22, - "PORT_WIDTH": 8, - "PORT_HEIGHT": 8, - "OUTPUTPORT_COLOR": "#00ff00", - "INPUTPORT_COLOR_SATISFIED": "#00ff00", - "INPUTPORT_COLOR_UNSATISFIED": "#ff0000", - "INPUTPORT_COLOR_CANDIDATE": "#00ff00", - "STROKE_COLOR": "#000000", - "FILL_COLOR": "#ccccff", - "WORKFLOWJOBGROUP_FILL_COLOR": "#8888ff", - "STROKE_WIDTH": 1, - "FONT_SIZE": 10, - "STROKE_COLOR_SELECTED": "#0000ff", - "STROKE_WIDTH_SELECTED": 2, - "CONNECTION_CIRCLE_RADIUS": 4, - "HOVER_TIME": 1000 - } -} diff --git a/nginx/config/nginx.conf b/nginx/config/nginx.conf index 44c57d182..870049230 100644 --- a/nginx/config/nginx.conf +++ b/nginx/config/nginx.conf @@ -1,4 +1,5 @@ # Run as a unique, less privileged user for security reasons. +# Is this still necessary with docker? user www-data www-data; # Sets the worker threads to the number of CPU cores available in the system for best performance. @@ -12,25 +13,15 @@ events { worker_connections 1024; } +# Run nginx undaemonized. +daemon off; + # Log errors and warnings to this file -#no_tls error_log /var/log/nginx/error.log warn; -#tls error_log /dev/stderr warn; +error_log /var/log/nginx/error.log warn; # The file storing the process ID of the nginx process pid /var/run/nginx.pid; - - -stream { - log_format basic '$proxy_protocol_addr [$time_local] ' - '$protocol ($status) $bytes_sent $bytes_received ' - '$ssl_preread_server_name $upstream_addr' - '$session_time'; - #tls include /etc/nginx/conf.d/ssl.conf; - #tls ssl_session_cache shared:SSLSTREAM:10m; - include /etc/nginx/sites-available/rodan.stream; -} - http { # Hide nginx version information. # [TODO] Build nginx from source. This will let us do two things: @@ -100,9 +91,5 @@ http { # Sites and configurations. include /etc/nginx/mime.types; - # TLS is not needed when it is behind another NGINX router that automatically uses TLS for visitors. - #tls include /etc/nginx/conf.d/ssl.conf; - #tls ssl_session_cache shared:SSL:10m; - #tls include /etc/nginx/conf.d/ssl-http.conf; include /etc/nginx/sites-available/rodan.conf; } diff --git a/nginx/config/rodan.conf b/nginx/config/rodan.conf index de38e4707..5e48eef6f 100644 --- a/nginx/config/rodan.conf +++ b/nginx/config/rodan.conf @@ -1,26 +1,7 @@ -upstream iip { - server iipsrv:9003; -} - -#tls server { # Redirect all http to SSL -#tls listen 80; -#tls listen [::]:80; # IPv6 -#tls include /etc/nginx/conf.d/error.conf; -#tls location /.well-known/acme-challenge { -#tls root /var/www/letsencrypt; -#tls } -#tls location / { -#tls return 301 https://$host$request_uri; -#tls } -#tls } - server { # Rodan API - #tls listen 443 ssl proxy_protocol; - #tls listen [::]:443 ssl; # IPv6 - #no_tls listen 80; - #no_tls listen [::]:80; # IPv6 - #tls access_log /dev/stdout main; - #no_tls access_log /var/log/nginx/rodan.access.log main; + listen 80; + listen [::]:80; # IPv6 + access_log /var/log/nginx/rodan.log main; include /etc/nginx/conf.d/error.conf; location /static/ { # Static files for API @@ -31,7 +12,7 @@ server { # Rodan API } location /fcgi-bin/iipsrv.fcgi { # iipsrv - fastcgi_pass iip; + fastcgi_pass iipsrv:9003; limit_except GET { deny all; } @@ -74,30 +55,16 @@ server { # Rodan API deny all; } proxy_set_header Host $http_host; - proxy_set_header X-Scheme $scheme; + proxy_set_header X-Scheme https; proxy_set_header 'Access-Control-Allow-Origin' '*'; proxy_set_header 'Access-Control-Allow-Headers' 'Content-Type'; proxy_pass_request_headers on; proxy_pass http://rodan-main:8000; } - #no_tls location /flower { - #no_tls rewrite ^/flower/(.*)$ /$1 break; - #no_tls proxy_pass http://rodan-main:5555; - #no_tls proxy_set_header Host $host; - #no_tls proxy_redirect off; - #no_tls proxy_http_version 1.1; - #no_tls proxy_set_header Upgrade $http_upgrade; - #no_tls proxy_set_header Connection "upgrade"; - #no_tls } - location / { proxy_pass_request_headers on; include /etc/nginx/conf.d/error.conf; - root /var/www/default/dist; - } - - location /.well-known/acme-challenge { - root /var/www/letsencrypt; + proxy_pass http://rodan-client; } } diff --git a/nginx/config/rodan.stream b/nginx/config/rodan.stream deleted file mode 100644 index 177e26189..000000000 --- a/nginx/config/rodan.stream +++ /dev/null @@ -1,8 +0,0 @@ -server { - #tls listen 5671 ssl; - #tls listen [::]:5671 ssl; - #no_tls listen 5671; - #no_tls listen [::]:5671; - - proxy_pass hpc-rabbitmq:5672; -} diff --git a/nginx/config/rodan_m1.stream b/nginx/config/rodan_m1.stream deleted file mode 100644 index 7a34083df..000000000 --- a/nginx/config/rodan_m1.stream +++ /dev/null @@ -1,8 +0,0 @@ -server { - #tls listen 5671 ssl; - #tls listen [::]:5671 ssl; - #no_tls listen 5671; - #no_tls listen [::]:5671; - - proxy_pass rabbitmq:5672; -} diff --git a/nginx/config/ssl-http.conf b/nginx/config/ssl-http.conf deleted file mode 100644 index c1ed5d324..000000000 --- a/nginx/config/ssl-http.conf +++ /dev/null @@ -1,10 +0,0 @@ -# Additional ssl configuration for http/s -ssl_stapling on; -ssl_stapling_verify on; -resolver 1.1.1.1 8.8.8.8 valid=300s; -resolver_timeout 5s; - -add_header Strict-Transport-Security "max-age=63072000; includeSubDomains;"; -add_header X-Frame-Options DENY; -add_header X-Content-Type-Options nosniff; -add_header X-XSS-Protection "1; mode=block"; diff --git a/nginx/config/ssl.conf b/nginx/config/ssl.conf index e38186543..c1ed5d324 100644 --- a/nginx/config/ssl.conf +++ b/nginx/config/ssl.conf @@ -1,10 +1,10 @@ -# SSL Configuration (2019-07) -ssl_prefer_server_ciphers on; -ssl_protocols TLSv1.2 TLSv1.3; -ssl_certificate /etc/letsencrypt/live/SERVER_HOST/fullchain.pem; -ssl_certificate_key /etc/letsencrypt/live/SERVER_HOST/privkey.pem; -ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; -ssl_ciphers EECDH+AESGCM:EDH+AESGCM; -ssl_ecdh_curve secp384r1; -ssl_session_timeout 10m; -ssl_session_tickets off; +# Additional ssl configuration for http/s +ssl_stapling on; +ssl_stapling_verify on; +resolver 1.1.1.1 8.8.8.8 valid=300s; +resolver_timeout 5s; + +add_header Strict-Transport-Security "max-age=63072000; includeSubDomains;"; +add_header X-Frame-Options DENY; +add_header X-Content-Type-Options nosniff; +add_header X-XSS-Protection "1; mode=block"; diff --git a/nginx/scripts/setup b/nginx/scripts/setup index 3f41a7753..6713d140d 100644 --- a/nginx/scripts/setup +++ b/nginx/scripts/setup @@ -3,10 +3,6 @@ set -o errexit # Exit immediately if a command exits with a non-zero status. set -o nounset # Treat unset variables as an error when substituting. set -o xtrace # Print commands and their arguments as they are executed. -#chmod 700 /etc/nginx/keys -#chmod -R 600 /etc/nginx/keys/* -#chown -R root /etc/nginx/keys - chown -R www-data:www-data /var/www/default find /var/www/default -type d | xargs chmod 755 find /var/www/default -type f | xargs chmod 644 diff --git a/nginx/scripts/ssl b/nginx/scripts/ssl deleted file mode 100644 index d3662cf5a..000000000 --- a/nginx/scripts/ssl +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -set -o errexit # Exit immediately if a command exits with a non-zero status. -set -o nounset # Treat unset variables as an error when substituting. -set -o xtrace # Print commands and their arguments as they are executed. - -echo "Creating local ssl certificates." - -# 2048 is ok for Local. Production should be 4096 -openssl dhparam -out ./nginx/certs/dhparam.pem 2048 - -openssl req -x509 \ - -newkey rsa:4096 \ - -out ./nginx/certs/cert.pem \ - -keyout ./nginx/certs/key.pem \ - -days 3650 \ - -nodes \ - -subj '/C=CA/ST=Quebec/L=Montreal/O=McGillUniversity/OU=DDMAL/CN=localhost' - -echo "Done." diff --git a/nginx/scripts/start b/nginx/scripts/start index 66119c95c..f5d637239 100644 --- a/nginx/scripts/start +++ b/nginx/scripts/start @@ -4,9 +4,13 @@ set -o nounset # Treat unset variables as an error when substituting. set -o xtrace # Print commands and their arguments as they are executed. /run/setup -sed -i "s/#no_tls //g" /etc/nginx/nginx.conf \ - /etc/nginx/sites-available/rodan.conf \ - /etc/nginx/sites-available/rodan.stream +#sed -i "s/SERVER_HOST/${SERVER_HOST}/g" /etc/nginx/conf.d/ssl.conf + +# Wait for everything to be up. +/run/wait-for-app iipsrv:9003 +/run/wait-for-app redis:6379 +/run/wait-for-app rodan-main:8000 --timeout=900 +/run/wait-for-app rodan-client:80 nginx -tail -f /var/log/nginx/access.log & tail -f /var/log/nginx/error.log +#tail -f /var/log/nginx/access.log & tail -f /var/log/nginx/error.log diff --git a/nginx/scripts/start-production b/nginx/scripts/start-production deleted file mode 100644 index a9552b3d0..000000000 --- a/nginx/scripts/start-production +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -set -o errexit # Exit immediately if a command exits with a non-zero status. -set -o nounset # Treat unset variables as an error when substituting. -set -o xtrace # Print commands and their arguments as they are executed. - -/run/setup -sed -i "s/localhost/${SERVER_HOST}/g" /var/www/default/dist/configuration.json -sed -i "s/SERVER_HOST/${SERVER_HOST}/g" /etc/nginx/conf.d/ssl.conf - -if [ $TLS -eq 1 ]; then - if [ ! -f /etc/letsencrypt/ssl-dhparams.pem ]; then - openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 4096 - fi - sed -i "s/#tls //g" /etc/nginx/nginx.conf \ - /etc/nginx/sites-available/rodan.conf \ - /etc/nginx/sites-available/rodan.stream - sed -i 's/"SERVER_PORT": "80/"SERVER_PORT": "443/g' /var/www/default/dist/configuration.json - sed -i 's/"SERVER_HTTPS": false,/"SERVER_HTTPS": true,/g' /var/www/default/dist/configuration.json - nginx -fi - -tail -f /dev/null \ No newline at end of file diff --git a/nginx/scripts/wait-for-app b/nginx/scripts/wait-for-app new file mode 100644 index 000000000..bbe404324 --- /dev/null +++ b/nginx/scripts/wait-for-app @@ -0,0 +1,177 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +cmdname=$(basename $0) + +echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $TIMEOUT -gt 0 ]]; then + echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" + else + echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" + fi + start_ts=$(date +%s) + while : + do + if [[ $ISBUSY -eq 1 ]]; then + nc -z $HOST $PORT + result=$? + else + (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 + result=$? + fi + if [[ $result -eq 0 ]]; then + end_ts=$(date +%s) + echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" + break + fi + sleep 1 + done + return $result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $QUIET -eq 1 ]]; then + timeout $BUSYTIMEFLAG $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + else + timeout $BUSYTIMEFLAG $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + fi + PID=$! + trap "kill -INT -$PID" INT + wait $PID + RESULT=$? + if [[ $RESULT -ne 0 ]]; then + echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" + fi + return $RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + hostport=(${1//:/ }) + HOST=${hostport[0]} + PORT=${hostport[1]} + shift 1 + ;; + --child) + CHILD=1 + shift 1 + ;; + -q | --quiet) + QUIET=1 + shift 1 + ;; + -s | --strict) + STRICT=1 + shift 1 + ;; + -h) + HOST="$2" + if [[ $HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + HOST="${1#*=}" + shift 1 + ;; + -p) + PORT="$2" + if [[ $PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + PORT="${1#*=}" + shift 1 + ;; + -t) + TIMEOUT="$2" + if [[ $TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$HOST" == "" || "$PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +TIMEOUT=${TIMEOUT:-15} +STRICT=${STRICT:-0} +CHILD=${CHILD:-0} +QUIET=${QUIET:-0} + +# check to see if timeout is from busybox? +# check to see if timeout is from busybox? +TIMEOUT_PATH=$(realpath $(which timeout)) +if [[ $TIMEOUT_PATH =~ "busybox" ]]; then + ISBUSY=1 + BUSYTIMEFLAG="-t" +else + ISBUSY=0 + BUSYTIMEFLAG="" +fi + +if [[ $CHILD -gt 0 ]]; then + wait_for + RESULT=$? + exit $RESULT +else + if [[ $TIMEOUT -gt 0 ]]; then + wait_for_wrapper + RESULT=$? + else + wait_for + RESULT=$? + fi +fi + +if [[ $CLI != "" ]]; then + if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then + echoerr "$cmdname: strict mode, refusing to execute subprocess" + exit $RESULT + fi + exec "${CLI[@]}" +else + exit $RESULT +fi diff --git a/production.yml b/production.yml index cd4bdb35a..1adc3a54f 100644 --- a/production.yml +++ b/production.yml @@ -3,7 +3,7 @@ version: "3.4" services: nginx: - image: "ddmal/nginx:v2.0.15" + image: "ddmal/nginx:v3.0.0" deploy: replicas: 1 resources: @@ -23,7 +23,7 @@ services: timeout: "10s" retries: 10 start_period: "5m" - command: /run/start-production + command: /run/start environment: TZ: America/Toronto SERVER_HOST: rodan2.simssa.ca @@ -35,10 +35,9 @@ services: - "9002:9002" volumes: - "resources:/rodan/data" - - "certbot:/etc/letsencrypt" rodan-main: - image: "ddmal/rodan-main:v2.0.15" + image: "ddmal/rodan-main:v3.0.0" deploy: replicas: 1 resources: @@ -68,13 +67,18 @@ services: volumes: - "resources:/rodan/data" + rodan-client: + image: "ddmal/rodan-client:nightly" + volumes: + - "./rodan-client/config/configuration.json:/client/configuration.json" + iipsrv: image: "ddmal/iipsrv:nightly" volumes: - "resources:/rodan/data" celery: - image: "ddmal/rodan-main:v2.0.15" + image: "ddmal/rodan-main:v3.0.0" deploy: replicas: 1 resources: @@ -105,7 +109,7 @@ services: - "resources:/rodan/data" py3-celery: - image: "ddmal/rodan-python3-celery:v2.0.15" + image: "ddmal/rodan-python3-celery:v3.0.0" deploy: replicas: 1 resources: @@ -131,12 +135,11 @@ services: CELERY_JOB_QUEUE: Python3 env_file: - ./scripts/production.env - - ./hpc-rabbitmq/scripts/production.env volumes: - "resources:/rodan/data" gpu-celery: - image: "ddmal/rodan-gpu-celery:v2.0.15" + image: "ddmal/rodan-gpu-celery:v3.0.0" deploy: replicas: 1 resources: @@ -192,7 +195,7 @@ services: TZ: America/Toronto postgres: - image: "ddmal/postgres-plpython:v2.0.15" + image: "ddmal/postgres-plpython:v3.0.0" deploy: replicas: 1 endpoint_mode: dnsrr @@ -245,33 +248,7 @@ services: env_file: - ./scripts/production.env - hpc-rabbitmq: - image: "ddmal/hpc-rabbitmq:v2.0.15" - deploy: - replicas: 1 - resources: - reservations: - cpus: "1" - memory: 2G - limits: - cpus: "1" - memory: 2G - restart_policy: - condition: any - delay: 5s - window: 30s - healthcheck: - test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] - interval: "30s" - timeout: "3s" - retries: 3 - environment: - TZ: America/Toronto - env_file: - - ./hpc-rabbitmq/scripts/production.env - volumes: resources: pg_backup: pg_data: - certbot: diff --git a/python3-celery/Dockerfile b/python3-celery/Dockerfile index 3c156e7cb..cb5ae9f6a 100644 --- a/python3-celery/Dockerfile +++ b/python3-celery/Dockerfile @@ -26,7 +26,7 @@ RUN yarn install RUN yarn build # Make Gamera files accessible to the main container. -FROM ddmal/gamera4:fix_IC AS gamera +FROM ddmal/gamera4:2.0.0 AS gamera # This release is based on Debian 11 "Bullseye" FROM python:3.7-slim diff --git a/readme.md b/readme.md index 4280a419c..ea2e27b88 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ - Master Branch ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/ddmal/rodan/master) - Develop Branch ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/ddmal/rodan/develop) -This repository contains Docker images that can be used to set up [Rodan](https://github.com/DDMAL/rodan) locally for development. These images can also be used in the future with slight modifications for deployment to a swarm production environment. Please see the wiki for more information about deploying Rodan. [Rodan-Docker Wiki](https://github.com/DDMAL/rodan-docker/wiki) +This repository contains Docker images that can be used to set up [Rodan](https://github.com/DDMAL/rodan) locally for development. These images can also be used in the future with slight modifications for deployment to a swarm production environment. Please see the wiki for more information about deploying Rodan. [Rodan Wiki](https://github.com/DDMAL/Rodan/wiki) #### Objectives @@ -16,13 +16,13 @@ This repository contains Docker images that can be used to set up [Rodan](https: If you are working on **Rodan** or **Rodan Jobs** - Make sure you have Rodan submodule cloned in `${repository_root}/rodan/code` and **it is up to date** with the branch you wish to work with. The branches should be either `develop`, or the **name of the feature** you would like to include into develop. The `master` branch is only for version releases and is supposed to be a guaranteed working version. -- Follow the instructions here: https://github.com/DDMAL/rodan-docker/wiki/Working-on-Rodan +- Follow the instructions here: https://github.com/DDMAL/Rodan/wiki/Working-on-Rodan - Note the `BRANCHES` environment variable in the installation scripts, you can set the environment variable locally by running the following command: `export BRANCHES="develop"`. If you are working on **Rodan-Client** - Make sure you have Rodan-Client cloned in `${repository_root}/rodan-client/code` and it is up to date with the branch you wish to work with. -- Follow the instructions here: https://github.com/DDMAL/rodan-docker/wiki/Working-on-Rodan-Client +- Follow the instructions here: https://github.com/DDMAL/Rodan/wiki/Working-on-Rodan-Client ## Tips for Interacting with Running Containers diff --git a/rodan-client/Dockerfile b/rodan-client/Dockerfile index 26e3d13c5..9941a729c 100644 --- a/rodan-client/Dockerfile +++ b/rodan-client/Dockerfile @@ -1,42 +1,43 @@ -FROM debian -EXPOSE 9002 +# Alpine 3.15 is the last version to support Python 2. +FROM node:12.22.6-alpine as builder # Install OS packages. -RUN apt-get -qq update \ - && apt-get -qq install -y \ - git \ - gnupg2 \ - libgif-dev \ - curl \ - build-essential -# Add node -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \ - && apt-get install -yq \ - nodejs=12.22.* -# Add yarn -RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ - && apt -qq update \ - && apt -qq install -y \ - yarn - -RUN rm -rf /var/lib/apt/lists/* +RUN apk add --no-cache \ + giflib-dev + +RUN apk add bash + +WORKDIR code + +# Install Yarn packages. +COPY code/package.json code/yarn.lock ./ +RUN yarn install --inline-builds && yarn cache clean # Install node project. -COPY code/ /code/ -RUN set -x \ - && cd /code \ - # && npm install - && yarn install +COPY code/ . # On some machines, the webpack dev server on the container won't accept connections from the host on localhost. # Make the development server listen on 0.0.0.0 instead to accept connections from all addresses. ENV RODAN_CLIENT_DEVELOP_HOST 0.0.0.0 -WORKDIR /code/node_modules/.bin -COPY ./config/configuration.json /code/configuration.json +# Build the project. +COPY ./config/configuration.json configuration.json +RUN yarn run dist + +# Host the project. +FROM nginx:alpine +EXPOSE 80 + +# Copy nginx conf. +COPY scripts/nginx.conf /etc/nginx/nginx.conf + +WORKDIR /client + +# Copy project from builder. +COPY --from=builder /code/dist/ . +#RUN mkdir resources \ +# && mv favicon.iso resources \ +# && mv grids-responsive-min.css resources -# Template start script, in case the startup gets longer. -COPY ./scripts/start /run/ -RUN sed -i 's/\r//' /run/start -RUN chmod +x /run/start +# Host server. +CMD nginx diff --git a/rodan-client/Dockerfile.old b/rodan-client/Dockerfile.old new file mode 100644 index 000000000..d5a42d369 --- /dev/null +++ b/rodan-client/Dockerfile.old @@ -0,0 +1,42 @@ +FROM debian +EXPOSE 9002 + +# Install OS packages. +RUN apt-get -qq update \ + && apt-get -qq install -y \ + git \ + gnupg2 \ + libgif-dev \ + curl \ + build-essential \ + # Add npm + # && curl -sL https://deb.nodesource.com/setup_12.x | bash - \ + # && apt-get install -yq \ + # nodejs + # Add yarn + && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ + && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ + && apt -qq update \ + && apt -qq install -y \ + yarn + +RUN rm -rf /var/lib/apt/lists/* + +# Install node project. +COPY code/ /code/ +RUN set -x \ + && cd /code \ + # && npm install + && yarn install + +# On some machines, the webpack dev server on the container won't accept connections from the host on localhost. +# Make the development server listen on 0.0.0.0 instead to accept connections from all addresses. +ENV RODAN_CLIENT_DEVELOP_HOST 0.0.0.0 +WORKDIR /code/node_modules/.bin + +COPY ./config/configuration.json /code/configuration.json + +# Template start script, in case the startup gets longer. +COPY ./scripts/start /run/ +RUN sed -i 's/\r//' /run/start +RUN chmod +x /run/start diff --git a/rodan-client/code/gulpfile.js b/rodan-client/code/gulpfile.js index e83be388d..546f6afbf 100644 --- a/rodan-client/code/gulpfile.js +++ b/rodan-client/code/gulpfile.js @@ -18,7 +18,7 @@ const WebpackDevServer = require("webpack-dev-server"); //////////////////////////////////////////////////////////////////////////////// // CONFIGURATION - Develop //////////////////////////////////////////////////////////////////////////////// -const DEVELOP_HOST = process.env.RODAN_CLIENT_DEVELOP_HOST || "localhost"; +const DEVELOP_HOST = process.env.SERVER_HOST; const DEVELOP_PORT = 9002; const DEVELOP_SOURCEMAP = 'eval-source-map'; const DEVELOP_WEBROOT = '__develop__'; diff --git a/rodan-client/code/package-lock.json b/rodan-client/code/package-lock.json new file mode 100644 index 000000000..3e5780626 --- /dev/null +++ b/rodan-client/code/package-lock.json @@ -0,0 +1,11360 @@ +{ + "name": "rodan-client", + "version": "0.20.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rodan-client", + "version": "0.20.0", + "license": "ISC", + "dependencies": { + "babel-preset-env": "^1.7.0", + "backbone": "^1.4.0", + "backbone.marionette": "^4.1.2", + "backbone.radio": "^2.0.0", + "bootstrap": "^4.4.1", + "eonasdan-bootstrap-datetimepicker": "4.17.47", + "file-saver": "^2.0.2", + "jquery": "^3.5.0", + "jqueryui": "^1.11.1", + "json-editor": "0.7.28", + "marionette.approuter": "^1.0.2", + "moment": "^2.25.3", + "moment-timezone": "^0.5.28", + "popper.js": "^1.16.1", + "underscore": "^1.10.2" + }, + "devDependencies": { + "@babel/core": "^7.9.6", + "@babel/preset-env": "^7.9.6", + "async": "^3.2.0", + "babel-loader": "^8.1.0", + "core-js": "^3.6.5", + "del": "^5.1.0", + "gulp": "^4.0.2", + "ip": "^1.1.4", + "paper": "^0.12.4", + "prompt-sync": "^4.2.0", + "recursive-readdir": "^2.2.2", + "regenerator-runtime": "^0.13.5", + "simple-git": "^1.132.0", + "tags-input": "^1.1.1", + "vinyl-fs": "^3.0.3", + "webpack": "^4.43.0", + "webpack-dev-server": "^3.11.0" + }, + "engines": { + "node": "12.22.x" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "node_modules/@babel/core": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.6", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator/node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.5", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/traverse/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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "14.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.2.tgz", + "integrity": "sha512-IzMhbDYCpv26pC2wboJ4MMOa9GKtjplXfcAqrMeNJpUUwpM/2ATt2w1JPUXwS6spu856TvKZL2AOmeU2rAxskw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "license": "ISC" + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true, + "license": "MIT" + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "license": "MIT", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "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": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT" + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "license": "MIT", + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true, + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.1" + } + }, + "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=", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "license": "MIT", + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "license": "MIT", + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "license": "MIT", + "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/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "license": "MIT" + }, + "node_modules/babel-code-frame/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=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "license": "MIT", + "dependencies": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "license": "MIT", + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "license": "MIT", + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "license": "MIT", + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "license": "MIT", + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "license": "MIT", + "dependencies": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 6.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "license": "MIT" + }, + "node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "license": "MIT" + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "license": "MIT" + }, + "node_modules/babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "license": "MIT", + "dependencies": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "license": "MIT", + "dependencies": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "license": "MIT", + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "license": "MIT", + "dependencies": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "license": "MIT", + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "license": "MIT", + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "license": "MIT", + "dependencies": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "license": "MIT", + "dependencies": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "license": "MIT", + "dependencies": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "license": "MIT", + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "license": "MIT", + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "license": "MIT", + "dependencies": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "license": "MIT", + "dependencies": { + "regenerator-transform": "^0.10.0" + } + }, + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "license": "MIT", + "dependencies": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "node_modules/babel-preset-env/node_modules/browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "license": "MIT" + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "license": "MIT", + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "license": "MIT", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/backbone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz", + "integrity": "sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==", + "license": "MIT", + "dependencies": { + "underscore": ">=1.8.3" + } + }, + "node_modules/backbone.marionette": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/backbone.marionette/-/backbone.marionette-4.1.2.tgz", + "integrity": "sha512-T8wWxZZnuYjylONTnWZsGsgXtdx2ZrE38pZWJI9LmPqzYK5j0T8uduapFO7OEpsW5rtdbBgwof30xhzAkbb5eQ==", + "license": "MIT", + "dependencies": { + "backbone.radio": "^2.0.0" + }, + "peerDependencies": { + "backbone": "^1.3.3", + "underscore": "^1.8.3" + } + }, + "node_modules/backbone.radio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/backbone.radio/-/backbone.radio-2.0.0.tgz", + "integrity": "sha1-u+hnKzc+MT+Z820vvPWD/nfQT0I=", + "peerDependencies": { + "backbone": "^1.3.3", + "underscore": "^1.8.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "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/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bootstrap": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz", + "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "license": "MIT", + "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/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "license": "MIT", + "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/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001131", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz", + "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==", + "license": "CC-BY-4.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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/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, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "license": "MIT", + "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/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "license": "MIT", + "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/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true, + "license": "MIT" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "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=", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "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=", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "ISC", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "node_modules/core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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=", + "dev": true, + "license": "MIT" + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true, + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "license": "MIT" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.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, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/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=", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/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=", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "license": "MIT", + "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/define-property/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/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, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true, + "license": "ISC" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.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=", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.568", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.568.tgz", + "integrity": "sha512-j9MlEwgTHVW/lq93Hw8yhzA886oLjDm3Hz7eDkWP2v4fzLVuqOWhpNluziSnmR/tBqgoYldagbLknrdg+B7Tlw==", + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/eonasdan-bootstrap-datetimepicker": { + "version": "4.17.47", + "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz", + "integrity": "sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU=", + "license": "MIT", + "dependencies": { + "bootstrap": "^3.3", + "jquery": "^1.8.3 || ^2.0 || ^3.0", + "moment": "^2.10", + "moment-timezone": "^0.4.0" + }, + "peerDependencies": { + "bootstrap": "^3.3", + "jquery": "^1.8.3 || ^2.0 || ^3.0", + "moment": "^2.10", + "moment-timezone": "^0.4.0" + } + }, + "node_modules/eonasdan-bootstrap-datetimepicker/node_modules/bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eonasdan-bootstrap-datetimepicker/node_modules/moment-timezone": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", + "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=", + "license": "MIT", + "dependencies": { + "moment": ">= 2.6.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "license": "MIT", + "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.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true, + "license": "MIT" + }, + "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=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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=", + "dev": true, + "license": "MIT", + "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/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "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==", + "dev": true, + "license": "MIT", + "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/express/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true, + "license": "ISC" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "license": "MIT", + "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/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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.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, + "license": "ISC" + }, + "node_modules/file-saver": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", + "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "license": "MIT", + "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/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "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-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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=", + "dev": true, + "license": "ISC", + "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=", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.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, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "license": "ISC", + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/gulp-cli/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp-cli/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp-cli/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp-cli/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp-cli/node_modules/yargs": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "node_modules/gulp-cli/node_modules/yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "license": "MIT", + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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=", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "license": "MIT", + "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-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "license": "ISC" + }, + "node_modules/http-parser-js": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true, + "license": "MIT" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT" + }, + "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=", + "dev": true, + "license": "MIT", + "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": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/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==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "license": "MIT", + "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/is-descriptor/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==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true, + "license": "MIT" + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", + "license": "MIT" + }, + "node_modules/jqueryui": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/jqueryui/-/jqueryui-1.11.1.tgz", + "integrity": "sha1-hxhVBwX1Vo0RmRlhaQlNtzsikbw=", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/json-editor": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/json-editor/-/json-editor-0.7.28.tgz", + "integrity": "sha1-KqWwmQorUHZ4kVjn3YotIQjOnMU=", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true, + "license": "MIT" + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true, + "license": "MIT" + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true, + "license": "ISC" + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "license": "MIT", + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "license": "MIT", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "license": "MIT", + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "leven": "^3.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-loglevel?utm_medium=referral&utm_source=npm_fund" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-iterator/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/marionette.approuter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/marionette.approuter/-/marionette.approuter-1.0.2.tgz", + "integrity": "sha512-XjcKb1Y6KROCmdZxO/rtOdRhd3Hfrs+7zWjtfiuCFS3VZa2IQjNgKUuIGmaKDZte2AmKRRMaPvXMh22nKYFh8A==", + "peerDependencies": { + "backbone": "^1.3.3", + "backbone.marionette": "^4.0.0", + "underscore": "^1.8.3" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "license": "MIT", + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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=", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "license": "MIT", + "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/micromatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "MIT" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "license": "BSD-2-Clause", + "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": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "license": "MIT", + "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": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz", + "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "license": "MIT", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "license": "ISC", + "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/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, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "license": "MIT", + "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/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "BSD-2-Clause", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.assign/node_modules/es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "dev": true, + "license": "MIT", + "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.0", + "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.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "license": "MIT", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "license": "MIT", + "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": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true, + "license": "MIT" + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "license": "MIT", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/paper": { + "version": "0.12.11", + "resolved": "https://registry.npmjs.org/paper/-/paper-0.12.11.tgz", + "integrity": "sha512-m6TKiyUr1A8zz6qdyBdYkb63OSRcNODlWZDxjEXFHtRjSlmMckFeSDdnuLYXsgwzcv3s36LgtrPk88y+gmA5JA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "ISC" + }, + "node_modules/prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^5.0.0" + } + }, + "node_modules/prompt-sync/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompt-sync/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "license": "BSD", + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "license": "MIT", + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "license": "BSD", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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=", + "dev": true, + "license": "ISC" + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "MIT", + "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, + "license": "ISC" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "license": "MIT", + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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=", + "dev": true, + "license": "MIT" + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "license": "MIT", + "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": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "license": "MIT", + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "license": "MIT", + "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/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "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/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "ISC" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "license": "MIT", + "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/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true, + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.1" + } + }, + "node_modules/simple-git/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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "license": "MIT", + "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": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "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": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.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=", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "node_modules/sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sockjs/node_modules/websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "license": "MIT", + "dependencies": { + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.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==", + "dev": true, + "license": "MIT", + "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-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.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=", + "dev": true, + "license": "MIT" + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "license": "Apache-2.0", + "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, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "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, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/spdy-transport/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "license": "MIT", + "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/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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=", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/tags-input": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tags-input/-/tags-input-1.1.1.tgz", + "integrity": "sha1-1r1+kS8Wqb1BwDyKMFnkJFUoElo=", + "dev": true + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true, + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "license": "MIT", + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true, + "license": "MIT" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", + "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==", + "license": "MIT" + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "license": "MIT", + "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, + "license": "ISC", + "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, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true, + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "license": "MIT" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "license": "ISC" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "license": "MIT", + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/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=", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.0" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + }, + "engines": { + "node": "<8.10.0" + } + }, + "node_modules/watchpack/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/watchpack/node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/watchpack/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchpack/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/watchpack/node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/watchpack/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "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, + "license": "ISC" + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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=", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "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, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/rodan-client/code/package.json b/rodan-client/code/package.json index 27d2bb788..8a9f83547 100644 --- a/rodan-client/code/package.json +++ b/rodan-client/code/package.json @@ -55,12 +55,11 @@ "backbone": "^1.4.0", "backbone.marionette": "^4.1.2", "backbone.radio": "^2.0.0", - "bootstrap": "^4.4.1", - "eonasdan-bootstrap-datetimepicker": "4.17.47", "file-saver": "^2.0.2", "jquery": "^3.5.0", "jqueryui": "^1.11.1", "json-editor": "0.7.28", + "marionette.approuter": "^1.0.2", "moment": "^2.25.3", "moment-timezone": "^0.5.28", "popper.js": "^1.16.1", diff --git a/rodan-client/code/resources/images/clear-filters.svg b/rodan-client/code/resources/images/clear-filters.svg new file mode 100644 index 000000000..36e3dca80 --- /dev/null +++ b/rodan-client/code/resources/images/clear-filters.svg @@ -0,0 +1,12 @@ + + + + clear-filter + + + + + + + + \ No newline at end of file diff --git a/rodan-client/code/resources/images/dropdown-arrow.svg b/rodan-client/code/resources/images/dropdown-arrow.svg new file mode 100644 index 000000000..9d990ed6c --- /dev/null +++ b/rodan-client/code/resources/images/dropdown-arrow.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/rodan-client/code/resources/images/filter-icon.svg b/rodan-client/code/resources/images/filter-icon.svg new file mode 100644 index 000000000..4a34b2103 --- /dev/null +++ b/rodan-client/code/resources/images/filter-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/rodan-client/code/src/js/Application.js b/rodan-client/code/src/js/Application.js index 045c7e0e6..55674d0ed 100644 --- a/rodan-client/code/src/js/Application.js +++ b/rodan-client/code/src/js/Application.js @@ -1,6 +1,5 @@ import _ from 'underscore'; import $ from 'jquery'; -import bootstrap from 'bootstrap'; import Marionette from 'backbone.marionette'; import moment from 'moment'; import Radio from 'backbone.radio'; @@ -33,6 +32,8 @@ import GlobalResourceLabelCollection from './Collections/Global/GlobalResourceLa import LayoutViewMaster from './Views/Master/LayoutViewMaster'; import UpdateManager from './Managers/UpdateManager'; import TransferManager from './Managers/TransferManager'; +import Router from 'js/Router'; +import Backbone from 'backbone'; /** * Main application class. @@ -88,9 +89,7 @@ export default class Application extends Marionette.Application { this._transferManager = new TransferManager(); this._updateManager = new UpdateManager(); - // This is commented out because deleting a workflowRun throws a null error despite the error - // being non-existent. Its errors are not very useful anyway. Fix in progress, see issue 475 (Rodan). - // this._errorManager = new ErrorManager(); + this._errorManager = new ErrorManager(); } /** @@ -195,6 +194,10 @@ export default class Application extends Marionette.Application // Check authentication. Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_CHECK); + + // Start router. + new Router(); + Backbone.history.start(); } /** @@ -213,4 +216,4 @@ export default class Application extends Marionette.Application Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_SELECTED_COLLECTION); } } -Application.prototype.region = '#region-master'; +Application.prototype.region = '#app'; diff --git a/rodan-client/code/src/js/Behaviors/BehaviorTable.js b/rodan-client/code/src/js/Behaviors/BehaviorTable.js index e0924f77c..133a07e7c 100644 --- a/rodan-client/code/src/js/Behaviors/BehaviorTable.js +++ b/rodan-client/code/src/js/Behaviors/BehaviorTable.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import _ from 'underscore'; -import datetimepicker from 'eonasdan-bootstrap-datetimepicker'; +// import datetimepicker from 'eonasdan-bootstrap-datetimepicker'; import 'jqueryui'; import BaseCollection from 'js/Collections/BaseCollection'; import Configuration from 'js/Configuration'; @@ -27,7 +27,7 @@ export default class BehaviorTable extends Marionette.Behavior this._lastTarget = null; this._multipleSelectionKey = Environment.getMultipleSelectionKey(); this._rangeSelectionKey = Environment.getRangeSelectionKey(); - this._submitSearch = _.debounce((filters) => this.view.collection.fetchFilter(filters), Configuration.SEARCH_DEBOUNCE_DELAY); + this._submitSearch = _.debounce((filters) => this.view.collection.fetchFilter(filters), Configuration.DEBOUNCE_DELAY); } /** @@ -197,29 +197,22 @@ export default class BehaviorTable extends Marionette.Behavior _injectFiltering(filterFields) { var filters = this._getFilters(this.view.collection, filterFields); - for (var index in filters) + + for (let index in filters) { - var $collectionItem = $(filters[index].collectionItem); var $formInput = $(filters[index].input); - $collectionItem.click((event) => this._handleFilterClick(event)); - $(this.el).find('#filter-menu ul').append($collectionItem); $(this.el).find('#filter-inputs').append($formInput); } - // Setup datetimepickers. - for (index in this._datetimepickerElements) - { - var elementId = this._datetimepickerElements[index]; - $(this.el).find(elementId).datetimepicker(); - $(this.el).find(elementId).data('DateTimePicker').format(Configuration.DATETIME_FORMAT); - $(this.el).find(elementId).on('dp.change', () => this._handleSearch()); + // Load label filters. + if (filterFields.labels) { + this._updateFilterLabels(); } $(this.el).find('#filter-inputs input').on('change keyup paste mouseup', () => this._handleSearch()); $(this.el).find('#filter-inputs select').on('change keyup paste mouseup', () => this._handleSearch()); this._filtersInjected = true; - this._hideFormElements(); } /** @@ -253,41 +246,68 @@ export default class BehaviorTable extends Marionette.Behavior { var templateChoice = _.template($(this.options.templateFilterChoice).html()); var templateInput = _.template($(this.options.templateFilterMultipleEnum).html()); - var labelCollection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_RESOURCELABEL_COLLECTION); - var project = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); - var project_resources = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_CURRENT, {data: {project: project.id}}); - var labels = new Set(); - project_resources.each(function (resource) { - resource.attributes.labels.forEach(function ({ url }) { - labels.add(url); - }); - }); - var filtered_collection = labelCollection.filter(function (resource) { return labels.has(resource.attributes.url); }); - var labelModels = filtered_collection.map((label) => { - return { - label: label.get('name'), - value: label.get('uuid') - }; - }); var htmlChoice = templateChoice({label: label, field: field}); - var htmlInput = templateInput({label: label, field: field, values: labelModels}); + var htmlInput = templateInput({label: label, field: field, values: [] }); // Values will be populated later return {collectionItem: htmlChoice, input: htmlInput}; } + /** + * Update the label filters with the labels for the current project + */ + _updateFilterLabels() + { + const project = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); + + if (!project) { + return; + } + + const route = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'labels'); + const ajaxSettings = { + url: route + '?resource__project=' + project.get('uuid'), + type: 'GET', + dataType: 'json', + success: (data) => { + const select = document.getElementById('labels'); + if (select) { + const labels = data.results.map(label => { + const element = document.createElement('option'); + element.value = label.uuid; + element.label = label.name; + return element; + }); + select.replaceChildren(...labels); + } + }, + }; + + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings}); + } + /////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS - Event handlers /////////////////////////////////////////////////////////////////////////////////////// + + /** + * Handles click events on "Add Search Filter" button. + */ + _handleButtonAddFilter() { + $('#dropdown-menu-table-filter').toggleClass('hidden'); + } + /** * Handles filter click. */ _handleFilterClick(event) { var data = $(event.target).data(); - //this._hideFormElements(); if (data.id) { this._showFormElement(data.id); } + + // Hide filter menu dropdown. + $('#dropdown-menu-table-filter').toggleClass('hidden'); } /** @@ -306,6 +326,12 @@ export default class BehaviorTable extends Marionette.Behavior for (var index in values) { var name = values[index].name; + + // Format datetime values correctly. + if (name === 'updated__gt' || name === 'updated__lt' || name === 'created__gt' || name === 'created__lt') { + values[index].value = values[index].value.replace('T', ' '); + } + var value = values[index].value; if (typeof filters[name] === 'undefined') { filters[name] = value; @@ -419,6 +445,10 @@ export default class BehaviorTable extends Marionette.Behavior if (options) { this._injectFiltering(options.filter_fields); + + if (options.filter_fields.labels) { + collection.on('add remove sync', () => this._updateFilterLabels()); + } } } @@ -512,6 +542,11 @@ export default class BehaviorTable extends Marionette.Behavior this.view.collection.fetchPage({page: parseInt(event.currentTarget.value)}); } + _handleFiltersDropdown() { + $(this.el).find('#filter-inputs-wrapper').toggleClass('hidden'); + $(this.el).find('#filter-inputs-dropdown-btn').toggleClass('open'); + } + /////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS /////////////////////////////////////////////////////////////////////////////////////// @@ -633,10 +668,12 @@ BehaviorTable.prototype.ui = { paginationNext: '#pagination-next', paginationFirst: '#pagination-first', paginationLast: '#pagination-last', + buttonAddFilter: '#button-add-filter', buttonSearch: '#button-search', buttonRemove: '#button-remove', buttonClearAll: '#button-clearall', - paginationSelect: '#pagination-select' + paginationSelect: '#pagination-select', + filtersDropdown: '#filter-inputs-dropdown-btn', }; BehaviorTable.prototype.events = { 'click @ui.paginationPrevious': '_handlePaginationPrevious', @@ -644,12 +681,14 @@ BehaviorTable.prototype.events = { 'click @ui.paginationFirst': '_handlePaginationFirst', 'click @ui.paginationLast': '_handlePaginationLast', 'click th': '_handleSort', + 'click @ui.buttonAddFilter': '_handleButtonAddFilter', 'click @ui.buttonSearch': '_handleSearch', 'click @ui.buttonRemove': '_handleButtonRemove', 'click @ui.buttonClearAll': '_handleButtonClearAll', 'click tbody tr': '_handleLeftClickRow', 'contextmenu tbody tr': '_handleRowRightClick', - 'change @ui.paginationSelect': '_handlePaginationSelect' + 'change @ui.paginationSelect': '_handlePaginationSelect', + 'click @ui.filtersDropdown': '_handleFiltersDropdown', }; BehaviorTable.prototype.options = { 'templateControl': '#template-table_control', diff --git a/rodan-client/code/src/js/Collections/BaseCollection.js b/rodan-client/code/src/js/Collections/BaseCollection.js index 7863ae999..661dda7e6 100644 --- a/rodan-client/code/src/js/Collections/BaseCollection.js +++ b/rodan-client/code/src/js/Collections/BaseCollection.js @@ -275,6 +275,7 @@ export default class BaseCollection extends Backbone.Collection var models = this.models.slice(); models[index1] = models.splice(index2, 1, models[index1])[0]; this.set(models); + this.trigger('sort', this, {}); } } diff --git a/rodan-client/code/src/js/Configuration.js b/rodan-client/code/src/js/Configuration.js index 9ee01a182..9a005a15a 100644 --- a/rodan-client/code/src/js/Configuration.js +++ b/rodan-client/code/src/js/Configuration.js @@ -73,8 +73,8 @@ var Configuration = { // Interval (in milliseconds) that the RunJob controller will use to reacquire interactive locks. RUNJOB_ACQUIRE_INTERVAL: 5000, - // Time (in miliseconds) that the client will wait before submitting a search. - SEARCH_DEBOUNCE_DELAY: 400, + // Default debounce delay in milliseconds. + DEBOUNCE_DELAY: 400, /////////////////////////////////////////////////////////////////////////////////////// // DON'T EDIT BELOW THIS LINE (unless you know what you're doing) @@ -109,8 +109,8 @@ var Configuration = { */ Configuration.getServerURL = function() { - var url = this.SERVER_HOST + ':' + this.SERVER_PORT; - return this.SERVER_HTTPS ? 'https://' + url : 'http://' + url; + var url = (this.SERVER_HTTPS ? 'https://' : 'http://') + this.SERVER_HOST + '/api/'; + return url; }; /** diff --git a/rodan-client/code/src/js/Controllers/ControllerAuthentication.js b/rodan-client/code/src/js/Controllers/ControllerAuthentication.js index 333f6274d..19e3605c9 100644 --- a/rodan-client/code/src/js/Controllers/ControllerAuthentication.js +++ b/rodan-client/code/src/js/Controllers/ControllerAuthentication.js @@ -4,6 +4,7 @@ import Cookie from 'js/Shared/Cookie'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; import Radio from 'backbone.radio'; import User from 'js/Models/User'; +import ViewActivationRequired from '../Views/Master/Main/Login/ViewActivationRequired'; /** * Controls authentication. @@ -55,7 +56,11 @@ export default class ControllerAuthentication extends BaseController { oldOnBeforeSend(xhr); } - xhr.setRequestHeader('X-CSRFToken', that._token.value); + if (that._token.value) + { + xhr.setRequestHeader('X-CSRFToken', that._token.value); + } + }; } else if(Configuration.SERVER_AUTHENTICATION_TYPE === 'token') @@ -66,7 +71,10 @@ export default class ControllerAuthentication extends BaseController { oldOnBeforeSend(xhr); } - xhr.setRequestHeader('Authorization', 'Token ' + that._token.value); + if (that._token.value) + { + xhr.setRequestHeader('Authorization', 'Token ' + that._token.value); + } }; } } @@ -81,8 +89,19 @@ export default class ControllerAuthentication extends BaseController { Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_SAVED, (options) => this._handleEventGeneric(options)); Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_CHANGED_PASSWORD, (options) => this._handleEventGeneric(options)); + Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_REQUESTED, (options) => this._handleEventGeneric(options)); + Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_CONFIRMED, (options) => this._handleEventGeneric(options)); + Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_REGISTERED, (options) => this._handleEventGeneric(options)); + Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_ACTIVATED, (options) => this._handleEventGeneric(options)); + Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_RESENT_ACTIVATION_EMAIL, (options) => this._handleEventGeneric(options)); + Radio.channel('rodan').on(RODAN_EVENTS.EVENT__AUTHENTICATION_ACTIVATION_REQUIRED, (options) => this._handleActivationRequired(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_CHANGE_PASSWORD, (options) => this._handleRequestChangePassword(options)); + Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD, (options) => this._handleRequestResetPassword(options)); + Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD_CONFIRM, (options) => this._handleRequestResetPasswordConfirm(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_SAVE, (options) => this._handleRequestSaveUser(options)); + Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_REGISTER, (options) => this._handleRequestRegister(options)); + Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_ACTIVATE_ACCOUNT, (options) => this._handleRequestActivateAccount(options)); + Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_RESEND_ACTIVATION, (options) => this._handleResendActivationEmail(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__AUTHENTICATION_USER, () => this._handleRequestUser()); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__AUTHENTICATION_LOGIN, options => this._login(options)); @@ -93,7 +112,7 @@ export default class ControllerAuthentication extends BaseController /** * Handle authentication response. */ - _handleAuthenticationResponse(event) + _handleAuthenticationResponse(event, email) { var request = event.currentTarget; if (request.responseText === null) @@ -119,8 +138,7 @@ export default class ControllerAuthentication extends BaseController Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__AUTHENTICATION_LOGINREQUIRED); break; case 403: - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SYSTEM_HANDLE_ERROR, {response: request}); - Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__AUTHENTICATION_LOGINREQUIRED); + Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__AUTHENTICATION_ACTIVATION_REQUIRED, {email}); break; default: Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SYSTEM_HANDLE_ERROR, {response: request}); @@ -200,7 +218,7 @@ export default class ControllerAuthentication extends BaseController var authRoute = this._getAuthenticationRoute(); var authType = Configuration.SERVER_AUTHENTICATION_TYPE; var request = new XMLHttpRequest(); - request.onload = (event) => this._handleAuthenticationResponse(event); + request.onload = (event) => this._handleAuthenticationResponse(event, options.email); request.ontimeout = (event) => this._handleTimeout(event); request.open('POST', authRoute, true); if (authType === 'session') @@ -234,11 +252,11 @@ export default class ControllerAuthentication extends BaseController */ _setAuthenticationData(request) { - if (Configuration.SERVER_AUTHENTICATION_TYPE === 'token') + if (Configuration.SERVER_AUTHENTICATION_TYPE === 'token' && this._token.value) { request.setRequestHeader('Authorization', 'Token ' + this._token.value); } - else if (Configuration.SERVER_AUTHENTICATION_TYPE === 'session') + else if (Configuration.SERVER_AUTHENTICATION_TYPE === 'session' && this._token.value) { request.withCredentials = true; request.setRequestHeader('X-CSRFToken', this._token.value); @@ -347,6 +365,36 @@ export default class ControllerAuthentication extends BaseController Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, {title: 'Saving password', content: 'Please wait...'}); } + _handleRequestResetPassword(options) + { + const route = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'auth-reset-password'); + const ajaxSettings = { + success: (response) => this._handleRequestPasswordResetSuccess(response), + type: 'POST', + url: route, + data: { email: options.email } + }; + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings }); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: 'Requesting password reset', content: 'Please wait...'}); + } + + /** + * Handles password reset confirmation. + */ + _handleRequestResetPasswordConfirm(options) + { + const route = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'auth-reset-password-confirm'); + const ajaxSettings = { + success: (response) => this._handleResetPasswordConfirmationSuccess(response), + error: (response) => this._handleResetPasswordConfirmationError(response), + type: 'POST', + url: route, + data: { uid: options.uid, token: options.token, new_password: options.new_password } + }; + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings }); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: 'Resetting password', content: 'Please wait...'}); + } + /** * Handle response from saving user. */ @@ -373,4 +421,145 @@ export default class ControllerAuthentication extends BaseController { Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__USER_CHANGED_PASSWORD); } + + /** + * Handle reset password request success + */ + _handleRequestPasswordResetSuccess(response) + { + Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_REQUESTED); + } + + /** + * Handle reset password confirm success. + */ + _handleResetPasswordConfirmationSuccess(response) + { + Backbone.history.navigate(''); + Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_CONFIRMED); + } + + /** + * Handle error response from reset password attempt. + */ + _handleResetPasswordConfirmationError(response) + { + const errors = Object.values(response.responseJSON); + const content = errors.flat().join(" "); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content }); + } + + /** + * Handles registration request. + */ + _handleRequestRegister(options) + { + const route = Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'auth-register'); + const ajaxSettings = { + success: (response) => this._handleRequestRegisterSuccess(response), + error: (response) => this._handleRequestRegisterError(response), + type: "POST", + url: route, + data: { first_name: options.firstName, last_name: options.lastName, username: options.username, email: options.email, password: options.password } + }; + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings }); + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: 'Registering', content: 'Please wait...'}); + } + + /** + * Handle success response from register attempt. + */ + _handleRequestRegisterSuccess(response) + { + Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_REGISTERED); + } + + /** + * Handle error response from register attempt. + */ + _handleRequestRegisterError(response) + { + const errors = response.responseJSON; + Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_REGISTER_ERROR, { errors }); + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content: "An error occured during registration." }); + } + + /** + * Handles request to activate account. + */ + _handleRequestActivateAccount(options) + { + const { uid, token } = options; + const route = Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, "auth-activate"); + const ajaxSettings = { + success: (response) => this._handleRequestActivateAccountSuccess(response), + error: (response) => this._handleRequestActivateAccountError(response), + type: "POST", + url: route, + data: { uid, token } + }; + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings }); + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: "Activate Account", content: "Activating your account..." }); + } + + /** + * Handle success response from activate account. + */ + _handleRequestActivateAccountSuccess(response) + { + Backbone.history.navigate(""); + Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_ACTIVATED); + } + + /** + * Handles error response from activate account. + */ + _handleRequestActivateAccountError(response) + { + const error = response.responseJSON.detail; + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content: error }); + } + + /** + * Shows activation required modal. + */ + _handleActivationRequired(options) + { + const view = new ViewActivationRequired(options); + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: "Activation Required", content: view }); + } + + /** + * Requests new activation email. + */ + _handleResendActivationEmail(options) + { + const route = Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, "auth-resend-activation"); + const ajaxSettings = { + success: (response) => this._handleResendActivationEmailSuccess(response), + error: (response) => this._handleResendActivationEmailError(response), + type: "POST", + url: route, + data: { email: options.email } + }; + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings }); + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: "Resending Activation Email", content: "Please wait..." }); + } + + /** + * Handle success response from resend activation email. + */ + _handleResendActivationEmailSuccess(response) + { + Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_RESENT_ACTIVATION_EMAIL); + } + + /** + * Handle error response from resend activation email. + */ + _handleResendActivationEmailError(response) + { + const error = response.status === 400 ? "Invalid username." : "An error occured while resending activation email."; + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content: error }); + } } diff --git a/rodan-client/code/src/js/Controllers/ControllerContextMenu.js b/rodan-client/code/src/js/Controllers/ControllerContextMenu.js index 989364838..672cca735 100644 --- a/rodan-client/code/src/js/Controllers/ControllerContextMenu.js +++ b/rodan-client/code/src/js/Controllers/ControllerContextMenu.js @@ -51,10 +51,10 @@ export default class ControllerContextMenu extends BaseController Radio.channel(channel).request(data.request, data.options); }; - var anchor = $('' + label + ''); + var anchor = $('' + label + ''); anchor.data('radio', {request: radiorequest, options: callOptions}); anchor.click(functionCall); - $('#menu-context').append($('
  • ').append(anchor)); + $('#menu-context').append(anchor); } $('#menu-context').css('top', options.top); $('#menu-context').css('left', options.left); diff --git a/rodan-client/code/src/js/Controllers/ControllerModal.js b/rodan-client/code/src/js/Controllers/ControllerModal.js index 41e3b7ed1..00c0328d4 100644 --- a/rodan-client/code/src/js/Controllers/ControllerModal.js +++ b/rodan-client/code/src/js/Controllers/ControllerModal.js @@ -46,7 +46,7 @@ export default class ControllerModal extends BaseController { var $modalElement = $('#modal-generic'); $('.modal-footer').removeClass('modal-footer-error'); - $modalElement.modal('hide'); + $modalElement.hide(); this._waiting = false; } @@ -55,7 +55,9 @@ export default class ControllerModal extends BaseController */ _handleRequestModalShow(options) { + console.log(options); var $modalEl = $('#modal-generic'); + console.log($modalEl); if ($modalEl.is(':visible')) { return; @@ -63,27 +65,28 @@ export default class ControllerModal extends BaseController if (typeof options.content == 'string') { - this._layoutViewModal = new Marionette.View({template: _.template($('#template-modal_simple').text())}); + this._layoutViewModal = new Marionette.View({ template: _.template($('#template-modal_simple').text()) }); + this._layoutViewModal.setElement('
    '); this._layoutViewModal.render(); - $modalEl.css({top: 0, left: 0, position: 'absolute'}); $modalEl.html(this._layoutViewModal.el); $('.modal-title').text(options.title); $('.modal-body').append(options.content); - $modalEl.modal({backdrop: 'static', keyboard: false}); + $('#modal-close').on('click', () => Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_HIDE)); + $modalEl.show(); } else { - this._layoutViewModal = new Marionette.View({template: _.template($('#template-modal').text())}); + this._layoutViewModal = new Marionette.View({ template: _.template($('#template-modal').text()) }); + this._layoutViewModal.setElement('
    '); this._layoutViewModal.addRegions({modal_body: '#region-modal_body'}); this._layoutViewModal.render(); this._layoutViewModal.showChildView('modal_body', options.content); - $modalEl.css({top: 0, left: 0, position: 'absolute'}); $modalEl.html(this._layoutViewModal.el); - $modalEl.draggable({handle: '.modal-header'}); $('.modal-title').text(options.title); - $modalEl.modal({backdrop: 'static'}); + $('#modal-close').on('click', () => Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_HIDE)); + $modalEl.show(); } } @@ -97,6 +100,7 @@ export default class ControllerModal extends BaseController if ($modalEl.is(':visible')) { $('.modal-footer').text(options.title + ': ' + options.content); + $('.modal-footer').removeClass('modal-footer-error'); } else { @@ -118,7 +122,7 @@ export default class ControllerModal extends BaseController } else { - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, {title: 'ERROR', content: options.content}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, {title: options.title || 'Error', content: options.content}); } $('.modal-footer').addClass('modal-footer-error'); } diff --git a/rodan-client/code/src/js/Controllers/ControllerProject.js b/rodan-client/code/src/js/Controllers/ControllerProject.js index e1779e820..e96609a57 100644 --- a/rodan-client/code/src/js/Controllers/ControllerProject.js +++ b/rodan-client/code/src/js/Controllers/ControllerProject.js @@ -3,7 +3,6 @@ import _ from 'underscore'; import BaseController from './BaseController'; import BaseViewCollection from 'js/Views/Master/Main/BaseViewCollection'; import BaseViewCollectionItem from 'js/Views/Master/Main/BaseViewCollectionItem'; -import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel'; import LayoutViewProjectUsers from 'js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers'; import Project from 'js/Models/Project'; import Radio from 'backbone.radio'; @@ -98,6 +97,7 @@ export default class ControllerProject extends BaseController var collection = new UserCollection(); collection.fetch(); var userSelectionView = new BaseViewCollection({collection: collection, + el: '
    ', template: _.template($('#template-main_user_selection').text()), childView: BaseViewCollectionItem, childViewContainer: 'select', @@ -188,13 +188,14 @@ export default class ControllerProject extends BaseController { this._activeProject = options.project; this._activeProject.fetch(); + + // default collection inside project view is the workflowrun collection var collection = new WorkflowRunCollection(); collection.fetch({data: {project: this._activeProject.id}}); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [collection]}); - var layoutView = new LayoutViewModel({template: _.template($('#template-main_layoutview_model_inverse').text())}); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: layoutView}); - layoutView.showItem(new ViewProject({model: this._activeProject})); - layoutView.showCollection(new ViewWorkflowRunCollection({collection: collection})); + var viewProject = new ViewProject({model: this._activeProject}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: viewProject, options: {project: this._activeProject}}); + viewProject.showCollection(new ViewWorkflowRunCollection({collection: collection})); } /** diff --git a/rodan-client/code/src/js/Controllers/ControllerResource.js b/rodan-client/code/src/js/Controllers/ControllerResource.js index ce6dfcea8..90a649c94 100644 --- a/rodan-client/code/src/js/Controllers/ControllerResource.js +++ b/rodan-client/code/src/js/Controllers/ControllerResource.js @@ -2,7 +2,6 @@ import $ from 'jquery'; import _ from 'underscore'; import BaseController from './BaseController'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; -import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel'; import Radio from 'backbone.radio'; import Resource from 'js/Models/Resource'; import ResourceCollection from 'js/Collections/ResourceCollection'; @@ -10,6 +9,7 @@ import ViewResource from 'js/Views/Master/Main/Resource/Individual/ViewResource' import ViewResourceMulti from 'js/Views/Master/Main/Resource/Individual/ViewResourceMulti'; import ViewResourceCollection from 'js/Views/Master/Main/Resource/Collection/ViewResourceCollection'; import ViewResourceCollectionItem from 'js/Views/Master/Main/Resource/Collection/ViewResourceCollectionItem'; +import ViewProject from '../Views/Master/Main/Project/Individual/ViewProject'; /** * Controller for Resources. @@ -36,11 +36,11 @@ export default class ControllerResource extends BaseController Radio.channel('rodan').on(RODAN_EVENTS.EVENT__RESOURCE_SAVED, options => this._handleSuccessGeneric(options)); // Requests + Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, options => this._handleCommandShowLayoutView(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_CREATE, options => this._handleRequestResourceCreate(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_DELETE, options => this._handleCommandResourceDelete(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_DOWNLOAD, options => this._handleRequestResourceDownload(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_SAVE, options => this._handleCommandResourceSave(options)); - Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, options => this._handleCommandShowLayoutView(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_VIEWER_ACQUIRE, options => this._handleRequestViewer(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCES_LOAD, options => this._handleRequestResources(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCES_LOAD_NO_PAGE, options => this._handleRequestResourcesNoPagination(options)); @@ -52,7 +52,7 @@ export default class ControllerResource extends BaseController */ _handleCommandShowLayoutView(options) { - this._layoutView = options.layoutView; + this._projectView = options.projectView; } /** @@ -60,16 +60,18 @@ export default class ControllerResource extends BaseController */ _handleEventCollectionSelected(options) { - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_LOAD_NO_PAGE, {data: {project: options.project.id}}); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_LOAD, {data: {project: options.project.id}}); + this._collection = new ResourceCollection(); + this._collection.fetch({data: {project: options.project.id}}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [this._collection]}); - this._layoutView = new LayoutViewModel(); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._layoutView}); - var view = new ViewResourceCollection({collection: this._collection, - template: _.template($('#template-main_resource_collection').text()), - childView: ViewResourceCollectionItem, - model: options.project}); - this._layoutView.showCollection(view); + + const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); + this._projectView = new ViewProject({model: activeProject}); + + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView}); + + this._viewCollection = new ViewResourceCollection({collection: this._collection}); + this._projectView.showCollection(this._viewCollection); } /** @@ -100,13 +102,13 @@ export default class ControllerResource extends BaseController } if (this._selectedResources.size === 0) { - this._layoutView.clearItemView(); + this._projectView.clearCollectionItemInfoView(); } else if (this._selectedResources.size === 1) { - this._layoutView.showItem(new ViewResource({model: this._selectedResources.values().next().value})); + this._projectView.showCollectionItemInfo(new ViewResource({model: this._selectedResources.values().next().value})); } else { - this._layoutView.showItem(new ViewResourceMulti({models: this._selectedResources})); + this._projectView.showCollectionItemInfo(new ViewResourceMulti({models: this._selectedResources})); } } @@ -140,7 +142,7 @@ export default class ControllerResource extends BaseController _handleCommandResourceDelete(options) { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, {title: 'Deleting Resource', content: 'Please wait...'}); - this._layoutView.clearItemView(); + this._projectView.clearCollectionItemInfoView(); options.resource.destroy({success: (model) => this._handleDeleteSuccess(model, this._collection)}); } @@ -241,7 +243,7 @@ export default class ControllerResource extends BaseController * Handle delete success. */ _handleDeleteSuccess(model, collection) - { + { collection.remove(model); Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCE_DELETED, {resource: model}); } diff --git a/rodan-client/code/src/js/Controllers/ControllerResourceList.js b/rodan-client/code/src/js/Controllers/ControllerResourceList.js index 93fe99090..b95ba35ef 100644 --- a/rodan-client/code/src/js/Controllers/ControllerResourceList.js +++ b/rodan-client/code/src/js/Controllers/ControllerResourceList.js @@ -2,7 +2,6 @@ import $ from 'jquery'; import _ from 'underscore'; import BaseController from './BaseController'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; -import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel'; import LayoutViewResourceAssignment from 'js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment'; import Radio from 'backbone.radio'; import ResourceCollection from 'js/Collections/ResourceCollection'; diff --git a/rodan-client/code/src/js/Controllers/ControllerRunJob.js b/rodan-client/code/src/js/Controllers/ControllerRunJob.js index df092e119..8e343f6f1 100644 --- a/rodan-client/code/src/js/Controllers/ControllerRunJob.js +++ b/rodan-client/code/src/js/Controllers/ControllerRunJob.js @@ -3,12 +3,12 @@ import _ from 'underscore'; import BaseController from './BaseController'; import Configuration from 'js/Configuration'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; -import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel'; import Radio from 'backbone.radio'; import RunJobCollection from 'js/Collections/RunJobCollection'; import ViewRunJob from 'js/Views/Master/Main/RunJob/Individual/ViewRunJob'; import ViewRunJobCollection from 'js/Views/Master/Main/RunJob/Collection/ViewRunJobCollection'; import ViewRunJobCollectionItem from 'js/Views/Master/Main/RunJob/Collection/ViewRunJobCollectionItem'; +import ViewProject from '../Views/Master/Main/Project/Individual/ViewProject'; /** * Controller for RunJobs. @@ -47,7 +47,7 @@ export default class ControllerRunJob extends BaseController */ _handleCommandShowLayoutView(options) { - this._layoutView = options.layoutView; + this._projectView = options.projectView; } /** @@ -55,7 +55,7 @@ export default class ControllerRunJob extends BaseController */ _handleEventItemSelected(options) { - this._layoutView.showItem(new ViewRunJob({model: options.runjob})); + this._projectView.showCollectionItemInfo(new ViewRunJob({model: options.runjob})); } /** @@ -66,12 +66,13 @@ export default class ControllerRunJob extends BaseController this._collection = new RunJobCollection(); this._collection.fetch({data: {project: options.project.id}}); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [this._collection]}); - this._layoutView = new LayoutViewModel(); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._layoutView}); + const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); + this._projectView = new ViewProject({model: activeProject}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView}); var view = new ViewRunJobCollection({collection: this._collection, template: _.template($('#template-main_runjob_collection').text()), childView: ViewRunJobCollectionItem}); - this._layoutView.showCollection(view); + this._projectView.showCollection(view); } /** diff --git a/rodan-client/code/src/js/Controllers/ControllerServer.js b/rodan-client/code/src/js/Controllers/ControllerServer.js index 189058a66..087039b38 100644 --- a/rodan-client/code/src/js/Controllers/ControllerServer.js +++ b/rodan-client/code/src/js/Controllers/ControllerServer.js @@ -49,6 +49,8 @@ export default class ControllerServer extends BaseController oldOnBeforeSend(xhr); } + xhr.setRequestHeader('Accept', 'application/json'); + // Set a timeout for x seconds. if (that._responseTimeout === null) { @@ -363,4 +365,4 @@ export default class ControllerServer extends BaseController var ajaxSettings = this._applyAJAXResponseHandlers(options.settings); $.ajax(ajaxSettings); } -} \ No newline at end of file +} diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflow.js b/rodan-client/code/src/js/Controllers/ControllerWorkflow.js index 67252df73..2184b38ba 100644 --- a/rodan-client/code/src/js/Controllers/ControllerWorkflow.js +++ b/rodan-client/code/src/js/Controllers/ControllerWorkflow.js @@ -1,11 +1,11 @@ import BaseController from './BaseController'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; -import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel'; import Radio from 'backbone.radio'; import ViewWorkflow from 'js/Views/Master/Main/Workflow/Individual/ViewWorkflow'; import ViewWorkflowCollection from 'js/Views/Master/Main/Workflow/Collection/ViewWorkflowCollection'; import Workflow from 'js/Models/Workflow'; import WorkflowCollection from 'js/Collections/WorkflowCollection'; +import ViewProject from 'js/Views/Master/Main/Project/Individual/ViewProject'; /** * Controller for Workflows. @@ -46,10 +46,11 @@ export default class ControllerWorkflow extends BaseController this._collection = new WorkflowCollection(); this._collection.fetch({data: {project: options.project.id}}); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [this._collection]}); - this._layoutView = new LayoutViewModel(); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._layoutView}); + const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); + this._projectView = new ViewProject({model: activeProject}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView}); this._viewCollection = new ViewWorkflowCollection({collection: this._collection}); - this._layoutView.showCollection(this._viewCollection); + this._projectView.showCollection(this._viewCollection); } /** @@ -58,7 +59,7 @@ export default class ControllerWorkflow extends BaseController _handleEventItemSelected(options) { this._viewItem = new ViewWorkflow({model: options.workflow}); - this._layoutView.showItem(this._viewItem); + this._projectView.showCollectionItemInfo(this._viewItem); } /** @@ -70,7 +71,7 @@ export default class ControllerWorkflow extends BaseController // Clear the individual view (if there). if (this._viewItem !== null && options.workflow === this._viewItem.model) { - this._layoutView.clearItemView(); + this._projectView.clearItemView(); } options.workflow.destroy({success: (model) => this._handleDeleteSuccess(model, this._collection)}); } diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js b/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js index b98096317..8c15e3e8e 100644 --- a/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js +++ b/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js @@ -40,9 +40,11 @@ export default class ControllerWorkflowBuilder extends BaseController */ initialize() { - this._resourceAssignments = []; // this helps manage the list of resource assignments while building the resource + this._workflow = null; + this._resourceAssignments = {}; // this helps manage the list of resource assignments while building the resource this._resourcesAvailable = []; // this is just a cache for resources that will work with a given input port this._workflowRunOptions = {}; + this._debouncedSave = _.debounce(this._saveResourceAssignments, Configuration.DEBOUNCE_DELAY); } /////////////////////////////////////////////////////////////////////////////////////// @@ -86,6 +88,7 @@ export default class ControllerWorkflowBuilder extends BaseController Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_UNGROUP_WORKFLOWJOBGROUP, options => this._handleRequestWorkflowJobGroupUngroup(options), this); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, options => this._handleRequestValidateWorkflow(options), this); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_GET_SATISFYING_INPUTPORTS, options => this._handleRequestGetSatisfyingInputPorts(options), this); + Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS, options => this._handleRequestClearResourceAssignments(options), this); } /////////////////////////////////////////////////////////////////////////////////////// @@ -96,12 +99,45 @@ export default class ControllerWorkflowBuilder extends BaseController */ _handleEventBuilderSelected(options) { - this._resourceAssignments = []; + this._workflow = options.workflow; + this._resourceAssignments = {}; this._resourcesAvailable = []; this._addPorts = true; + this._fetchResourceAssignments(); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_LOAD_WORKFLOW, {'workflow': options.workflow}); } + /** + * Fetches all resource assignments for this workflow, creates a ResourceCollection for + * each InputPort, and adds listeners to each ResourceCollection to save when changed. + */ + _fetchResourceAssignments() + { + const ajaxSettings = { + url: this._workflow.get('url') + 'resourceassignments/', + method: 'GET', + dataType: 'json', + success: (response) => { + Object.entries(response).forEach(([url, resources]) => { + response[url] = this._createResourceAssignmentCollection(resources) + }); + this._resourceAssignments = response; + } + } + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings }); + } + + /** + * Creates a new collection for the given InputPort and list of resources + * and binds a listener to the collection to save when changed. + */ + _createResourceAssignmentCollection(resources) + { + const collection = new ResourceCollection(resources); + collection.on('all', () => this._debouncedSave()); + return collection; + } + /** * Handle request set add ports. */ @@ -118,7 +154,7 @@ export default class ControllerWorkflowBuilder extends BaseController this._workflowRunOptions = {workflow: options.workflow, assignments: {}}; var inputPortTypes = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_INPUTPORTTYPE_COLLECTION); var knownInputPorts = this._workflowRunOptions.workflow.get('workflow_input_ports').clone(); - for (var inputPortUrl in this._resourceAssignments) + for (const inputPortUrl of Object.keys(this._resourceAssignments)) { // If our assignments for an InputPort are not needed, we just skip it. var inputPort = knownInputPorts.findWhere({url: inputPortUrl}); @@ -175,6 +211,14 @@ export default class ControllerWorkflowBuilder extends BaseController } } + /** + * Handle request to clear all input port resource assignments. + */ + _handleRequestClearResourceAssignments(options) + { + Object.values(this._resourceAssignments).forEach(collection => collection.reset()); + } + /** * Handle request show Resource assignment view. */ @@ -208,7 +252,7 @@ export default class ControllerWorkflowBuilder extends BaseController */ _handleWorkflowLoadSuccess(workflow) { - this._processWorkflow(workflow); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOBGROUP_LOAD_COLLECTION, {workflow: workflow}); Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOWBUILDER_LOADED_WORKFLOW, {workflow: workflow}); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow}); } @@ -229,8 +273,7 @@ export default class ControllerWorkflowBuilder extends BaseController _handleRequestDeleteWorkflowJob(options) { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOB_DELETE, {workflowjob: options.workflowjob, workflow: options.workflow}); - Radio.channel('rodan').once(RODAN_EVENTS.EVENT__WORKFLOWJOB_DELETED, - () => Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: options.workflow})); + Radio.channel('rodan').once(RODAN_EVENTS.EVENT__WORKFLOWJOB_DELETED, () => this._handleWorkflowJobDeletionSuccess(options.workflowjob, options.workflow)); } /** @@ -361,13 +404,32 @@ export default class ControllerWorkflowBuilder extends BaseController Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOBGROUP_CREATE, {workflowjobs: options.workflowjobs, workflow: options.workflow}); } + /** + * Save resource assignments. + */ + _saveResourceAssignments() + { + const data = {}; + Object.entries(this._resourceAssignments).forEach(([url, resources]) => { + data[url] = resources.models.map(resource => resource.get('url')); + }); + + const ajaxSettings = { + url: this._workflow.get('url') + 'resourceassignments/', + type: 'PUT', + contentType: 'application/json', + data: JSON.stringify(data), + }; + + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings }); + } + /** * Handle request assign Resource to InputPort. */ _handleRequestAssignResource(options) { - var url = options.inputport.get('url'); - var resourcesAssigned = this._getResourceAssignments(url); + var resourcesAssigned = this._getResourceAssignments(options.inputport.get('url')); resourcesAssigned.add(options.resource); } @@ -385,8 +447,7 @@ export default class ControllerWorkflowBuilder extends BaseController */ _handleMoveUpAssignedResource(options) { - var url = options.inputport.get('url'); - var resourcesAssigned = this._getResourceAssignments(url); + var resourcesAssigned = this._getResourceAssignments(options.inputport.get('url')); var index1 = resourcesAssigned.indexOf(options.resource); var index2 = Math.max(0, index1 - 1); resourcesAssigned.swapItems(index1, index2); @@ -397,8 +458,7 @@ export default class ControllerWorkflowBuilder extends BaseController */ _handleMoveDownAssignedResource(options) { - var url = options.inputport.get('url'); - var resourcesAssigned = this._getResourceAssignments(url); + var resourcesAssigned = this._getResourceAssignments(options.inputport.get('url')); var index1 = resourcesAssigned.indexOf(options.resource); var index2 = Math.min(index1 + 1, resourcesAssigned.length - 1); resourcesAssigned.swapItems(index1, index2); @@ -541,6 +601,7 @@ export default class ControllerWorkflowBuilder extends BaseController { workflow.get('workflow_input_ports').add(model); workflowJob.get('input_ports').add(model); + this._resourceAssignments[model.get('url')] = this._createResourceAssignmentCollection(); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow}); } @@ -563,7 +624,7 @@ export default class ControllerWorkflowBuilder extends BaseController */ _handleConnectionCreationSuccess(model, workflow, inputPort, outputPort) { - workflow.get('connections').add(model); + workflow.get('workflow_connections').add(model); inputPort.fetch(); // to get populated Connection array outputPort.fetch(); // to get populated Connection array Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow}); @@ -575,6 +636,7 @@ export default class ControllerWorkflowBuilder extends BaseController _handleInputPortDeletionSuccess(model, workflow, workflowJob) { workflowJob.get('input_ports').remove(model); + delete this._resourceAssignments[model.get('url')]; Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow}); } @@ -592,10 +654,19 @@ export default class ControllerWorkflowBuilder extends BaseController */ _handleConnectionDeletionSuccess(model, workflow) { - workflow.get('connections').remove(model); + workflow.get('workflow_connections').remove(model); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow}); } + /** + * Handle WorkflowJob deletion success. + */ + _handleWorkflowJobDeletionSuccess(model, workflow) + { + model.get("input_ports").forEach((inputPort) => delete this._resourceAssignments[inputPort.get('url')]); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow}) + } + /** * Handle validation failure. */ @@ -617,106 +688,6 @@ export default class ControllerWorkflowBuilder extends BaseController connection.save({}, {success: (model) => this._handleConnectionCreationSuccess(model, workflow, inputPort, outputPort)}); } - /** - * Process workflow for GUI. - */ - _processWorkflow(workflow) - { - // Process all WorkflowJobs and their associated ports. - var connections = {}; - var workflowJobs = workflow.get('workflow_jobs'); - if (workflowJobs !== undefined) - { - for (var i = 0; i < workflowJobs.length; i++) - { - // Create WorkflowJob item then process connections. - var workflowJob = workflowJobs.at(i); - var tempConnections = this._processWorkflowJob(workflowJob); - - // For the connections returned, merge them into our master list. - for (var connectionUrl in tempConnections) - { - var connection = tempConnections[connectionUrl]; - if (connections.hasOwnProperty(connectionUrl)) - { - connections[connectionUrl].inputPort = - connections[connectionUrl].inputPort === null ? connection.inputPort : connections[connectionUrl].inputPort; - connections[connectionUrl].outputPort = - connections[connectionUrl].outputPort === null ? connection.outputPort : connections[connectionUrl].outputPort; - } - else - { - connections[connectionUrl] = connection; - } - } - } - } - - // Process connections. - for (var connectionUrl in connections) - { - var connection = connections[connectionUrl]; - var connectionId = BaseModel.parseIdFromUrl(connectionUrl); - var connectionModel = new Connection({ - input_port: connection.inputPort.get('url'), - output_port: connection.outputPort.get('url'), - url: connectionUrl, - uuid: connectionId - }); - workflow.get('connections').add(connectionModel); - } - - // Finally inport the WorkflowJobGroups. - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOBGROUP_LOAD_COLLECTION, {workflow: workflow}); - } - - /** - * Process workflow job for GUI. - */ - _processWorkflowJob(model) - { - // We want to keep track of what connections need to be made and return those. - var connections = {}; - - // Process input ports. - var inputPorts = model.get('input_ports'); - if (inputPorts !== undefined) - { - for (var i = 0; i < inputPorts.length; i++) - { - var inputPort = inputPorts.at(i); - - // Get connections. - var inputPortConnections = inputPort.get('connections'); - for (var k = 0; k < inputPortConnections.length; k++) - { - var connection = inputPortConnections[k]; - connections[connection] = {'inputPort': inputPort, 'outputPort': null}; - } - } - } - - // Process output ports. - var outputPorts = model.get('output_ports'); - if (outputPorts !== undefined) - { - for (var j = 0; j < outputPorts.length; j++) - { - var outputPort = outputPorts.at(j); - - // Get connections. - var outputPortConnections = outputPort.get('connections'); - for (var k = 0; k < outputPortConnections.length; k++) - { - var connection = outputPortConnections[k]; - connections[connection] = {'inputPort': null, 'outputPort': outputPort}; - } - } - } - - return connections; - } - /** * Attempts to validate Workflow. */ @@ -800,24 +771,6 @@ export default class ControllerWorkflowBuilder extends BaseController return satisfiableJobs; } - /** - * DEPRECATED - * Return InputPort URL that has multiple assignments. - * Returns null if DNE. - */ - _getInputPortURLWithMultipleAssignments() - { - for (var inputPortUrl in this._resourceAssignments) - { - var resourceAssignments = this._getResourceAssignments(inputPortUrl); - if (resourceAssignments.length > 1) - { - return inputPortUrl; - } - } - return null; - } - /** * Returns resource assignment for given InputPort url. */ diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js b/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js index 4e7f02ca1..4f9a6ece3 100644 --- a/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js +++ b/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js @@ -3,6 +3,7 @@ import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; import Radio from 'backbone.radio'; import WorkflowJobGroup from 'js/Models/WorkflowJobGroup'; import WorkflowJobGroupCollection from 'js/Collections/WorkflowJobGroupCollection'; +import wfbgui from 'js/WorkflowBuilderGUI'; /** * Controller for WorkflowJobGroups. @@ -56,7 +57,9 @@ export default class ControllerWorkflowJobGroup extends BaseController { urls.push(workflowJobs[index].get('url')); } - var workflowJobGroup = new WorkflowJobGroup({workflow_jobs: urls, workflow: workflow}); + const boundingBox = wfbgui._getBoundingBox(workflowJobs); + const appearance = wfbgui._getBoundingBoxCenter(boundingBox); + var workflowJobGroup = new WorkflowJobGroup({ appearance, workflow_jobs: urls, workflow: workflow }); workflowJobGroup.save({}, {success: (model) => this._handleWorkflowJobGroupCreationSuccess(model)}); } diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js b/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js index 90a08d6d3..8d73fdd34 100644 --- a/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js +++ b/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js @@ -5,6 +5,7 @@ import Radio from 'backbone.radio'; import ViewWorkflowRunCollection from 'js/Views/Master/Main/WorkflowRun/Collection/ViewWorkflowRunCollection'; import WorkflowRun from 'js/Models/WorkflowRun'; import WorkflowRunCollection from 'js/Collections/WorkflowRunCollection'; +import ViewProject from '../Views/Master/Main/Project/Individual/ViewProject'; /** * Controller for WorkflowRun. @@ -76,9 +77,12 @@ export default class ControllerWorkflowRun extends BaseController var resources = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_LOAD, {data: {result_of_workflow_run: options.workflowrun.id}}); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [runJobs, resources]}); - // Create view and show. - this._viewItem = new LayoutViewIndividualWorkflowRun({runjobs: runJobs, resources: resources, model: options.workflowrun}); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._viewItem}); + // Create view and show. + const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); + this._projectView = new ViewProject({model: activeProject}); + this._viewItem = new LayoutViewIndividualWorkflowRun({projectView: this._projectView, activeProject: activeProject, runjobs: runJobs, resources: resources, model: options.workflowrun}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView}); + this._projectView.showCollection(this._viewItem); } /** @@ -86,11 +90,18 @@ export default class ControllerWorkflowRun extends BaseController */ _handleEventCollectionSelected(options) { - var collection = new WorkflowRunCollection(); + // create new worlfow run collection and populate it through a fetch + const collection = new WorkflowRunCollection(); collection.fetchSort(false, 'created', {data: {project: options.project.id}}); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [collection]}); - var view = new ViewWorkflowRunCollection({collection: collection}); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: view}); + + // get active project and create project view + const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); + const projectView = new ViewProject({model: activeProject}); + + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: projectView}); + + projectView.showCollection(new ViewWorkflowRunCollection({collection: collection})); } /** diff --git a/rodan-client/code/src/js/Controllers/ItemController.js b/rodan-client/code/src/js/Controllers/ItemController.js index cd9d1ec38..bcfa8e7e1 100644 --- a/rodan-client/code/src/js/Controllers/ItemController.js +++ b/rodan-client/code/src/js/Controllers/ItemController.js @@ -21,8 +21,9 @@ class ItemController /** * Basic constructor */ - constructor() + constructor(options) { + this._workflow = options.workflow; this._selectedItems = {}; this._selectingMultiple = false; this._overItem = null; @@ -31,6 +32,7 @@ class ItemController this._initializeRadio(); this._createSegments(); + this._initializeItems(); } /** @@ -309,11 +311,47 @@ class ItemController }; } + /** + * This creates all the items initially in the workflow. + */ + _initializeItems() + { + // Initialize `WorkflowJobItem`s + const workflowJobs = this._workflow.get('workflow_jobs'); + if (workflowJobs) { + workflowJobs.each(workflowJob => this._initializeWorkflowJobItem(workflowJob)); + } + + // Initialize `InputPortItem`s + const inputPorts = this._workflow.get('input_ports'); + if (inputPorts) { + inputPorts.each(inputPort => this._initializeInputPortItem(inputPort)); + } + + // Initialize `OutputPortItem`s + const outputPorts = this._workflow.get('output_ports'); + if (outputPorts) { + outputPorts.each(outputPort => this._initializeOutputPortItem(outputPort)); + } + + // Initialize `ConnectionItem`s + const connections = this._workflow.get('connections'); + if (connections) { + connections.each(connection => this._initializeConnectionItem(connection)); + } + + // Initialize `WorkflowJobGroupItem`s + const workflowJobGroups = this._workflow.get('workflow_job_groups'); + if (workflowJobGroups) { + workflowJobGroups.each(workflowJobGroup => this._initializeWorkflowJobGroupItem(workflowJobGroup)); + } + } + /////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS - REST handlers /////////////////////////////////////////////////////////////////////////////////////// /** - * Handle event model sync. + * Handle event model sync. This creates new items as the workflow is updated. * * We check if an item exists for this model. If it does, don't do anything - the * model will take care of itself. If it doesn't, we create a new model. @@ -328,42 +366,24 @@ class ItemController switch (options.model.constructor.name) { case 'WorkflowJob': - { - var item = new WorkflowJobItem({segments: this._segments.workflowJobItem, model: options.model, text: true}); + this._initializeWorkflowJobItem(options.model); break; - } - case 'InputPort': - { - var item = new InputPortItem({segments: this._segments.portItem, model: options.model, workflowjoburl: options.model.get('workflow_job')}); + this._initializeInputPortItem(options.model); break; - } - case 'OutputPort': - { - var item = new OutputPortItem({segments: this._segments.portItem, model: options.model, workflowjoburl: options.model.get('workflow_job')}); + this._initializeOutputPortItem(options.model); break; - } - case 'Connection': - { - var item = new ConnectionItem({segments: this._segments.connection, - model: options.model, - inputporturl: options.model.get('input_port'), - outputporturl: options.model.get('output_port')}); + paper.project.layers['connections'].activate(); + this._initializeConnectionItem(options.model); + paper.project.layers['default'].activate(); break; - } - case 'WorkflowJobGroup': - { - var item = new WorkflowJobGroupItem({segments: this._segments.workflowJobItem, model: options.model, text: true}); + this._initializeWorkflowJobGroupItem(options.model); break; - } - default: - { break; - } } } else if (options.options.task === 'destroy') @@ -373,6 +393,36 @@ class ItemController } } + _initializeWorkflowJobItem(workflowJob) + { + return new WorkflowJobItem({segments: this._segments.workflowJobItem, model: workflowJob, text: true}); + } + + _initializeInputPortItem(inputPort) + { + return new InputPortItem({segments: this._segments.portItem, model: inputPort, workflowjoburl: inputPort.get('workflow_job')}); + } + + _initializeOutputPortItem(outputPort) + { + return new OutputPortItem({segments: this._segments.portItem, model: outputPort, workflowjoburl: outputPort.get('workflow_job')}); + } + + _initializeConnectionItem(connection) + { + return new ConnectionItem({ + segments: this._segments.connection, + model: connection, + inputporturl: connection.get('input_port'), + outputporturl: connection.get('output_port') + }); + } + + _initializeWorkflowJobGroupItem(workflowJobGroup) + { + return new WorkflowJobGroupItem({segments: this._segments.workflowJobItem, model: workflowJobGroup, text: true}); + } + /////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS - MouseEvent handlers /////////////////////////////////////////////////////////////////////////////////////// diff --git a/rodan-client/code/src/js/Items/ConnectionItem.js b/rodan-client/code/src/js/Items/ConnectionItem.js index 087fecb23..0b3d92b57 100644 --- a/rodan-client/code/src/js/Items/ConnectionItem.js +++ b/rodan-client/code/src/js/Items/ConnectionItem.js @@ -22,6 +22,7 @@ class ConnectionItem extends BaseItem this.menuItems = [{label: 'Delete', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_REMOVE_CONNECTION, options: {connection: options.model, workflow: workflow}}]; this.strokeWidth = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].STROKE_WIDTH; + this.fillColor = null; this._inputPortItem = null; this._outputPortItem = null; this._inputPortUrl = options.inputporturl; @@ -37,6 +38,9 @@ class ConnectionItem extends BaseItem this._circle.onMouseEnter = event => this._handleMouseEvent(event); this._circle.onMouseLeave = event => this._handleMouseEvent(event); this.addChild(this._circle); + this._padding = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].CONNECTION_PADDING; + this._offsetX = this._model.get('offset_x'); + this._offsetY = this._model.get('offset_y'); } /** @@ -44,7 +48,7 @@ class ConnectionItem extends BaseItem */ isMoveable() { - return false; + return true; } /** @@ -75,12 +79,43 @@ class ConnectionItem extends BaseItem if (this._inputPortItem && this._outputPortItem) { this._circle.visible = this.visible; - this.firstSegment.point.x = this._outputPortItem.position.x; - this.firstSegment.point.y = this._outputPortItem.bounds.bottom; - this.lastSegment.point.x = this._inputPortItem.position.x; - this.lastSegment.point.y = this._inputPortItem.bounds.top; - this._circle.position.x = this.firstSegment.point.x + ((this.lastSegment.point.x - this.firstSegment.point.x) / 2); - this._circle.position.y = this.firstSegment.point.y + ((this.lastSegment.point.y - this.firstSegment.point.y) / 2); + + this.removeSegments(); + + // If the input port is above the output port, we want to draw the connection in a different way using 5 line segments instead of 3. + if (this._inputPortItem.bounds.top < this._outputPortItem.bounds.bottom + 2 * this._padding) { + if (this._offsetX == null) { + this._circle.position.x = (this._inputPortItem.position.x + this._outputPortItem.position.x) / 2; + } else { + this._circle.position.x = this._outputPortItem.position.x + this._offsetX; + } + + this._circle.position.y = (this._inputPortItem.position.y + this._outputPortItem.position.y) / 2; + + const start = new Point(this._outputPortItem.position.x, this._outputPortItem.bounds.bottom); + const p1 = new Point(this._outputPortItem.position.x, this._outputPortItem.bounds.bottom + this._padding); + const p2 = new Point(this._circle.position.x, this._outputPortItem.bounds.bottom + this._padding); + const p3 = new Point(this._circle.position.x, this._inputPortItem.bounds.top - 5); + const p4 = new Point(this._inputPortItem.position.x, this._inputPortItem.bounds.top - 5); + const end = new Point(this._inputPortItem.position.x, this._inputPortItem.bounds.top); + + this.add(start, p1, p2, p3, p4, end); + } else { + if (this._offsetY == null) { + this._circle.position.y = (this._inputPortItem.bounds.top + this._outputPortItem.bounds.bottom) / 2; + } else { + this._circle.position.y = this._clamp(this._outputPortItem.bounds.bottom + this._offsetY, this._outputPortItem.bounds.bottom + this._padding, this._inputPortItem.bounds.top - 5); + } + + this._circle.position.x = (this._inputPortItem.position.x + this._outputPortItem.position.x) / 2; + + const start = new Point(this._inputPortItem.position.x, this._inputPortItem.bounds.top); + const p1 = new Point(this._inputPortItem.position.x, this._circle.position.y); + const p2 = new Point(this._outputPortItem.position.x, this._circle.position.y); + const end = new Point(this._outputPortItem.position.x, this._outputPortItem.bounds.bottom); + + this.add(start, p1, p2, end); + } } } @@ -103,9 +138,49 @@ class ConnectionItem extends BaseItem super.destroy(); } + /** + * Overrides move method to calculate and update offset instead of position. + */ + move(delta) + { + if (this._inputPortItem.bounds.top < this._outputPortItem.bounds.bottom + 2 * this._padding) { + this._offsetX = (this._circle.position.x - this._outputPortItem.position.x) + delta.x; + } else { + this._offsetY = (this._circle.position.y - this._outputPortItem.bounds.bottom) + delta.y; + } + this._hasMoved = true; + } + + /** + * Overrides updatePositionToServer to update offset instead of position. + */ + updatePositionToServer() + { + if (this.isMoveable() && this._hasMoved) + { + // If an ID exists, we know it exists on the server, so we can patch it. + // Else if we haven't tried saving it before, do it. This should create + // a new model on the server. + if (this._modelId || !this._coordinateSetSaveAttempted) + { + this._coordinateSetSaveAttempted = true; + this._model.set({ offset_x: this._offsetX, offset_y: this._offsetY }); + this._model.save(); + this._hasMoved = false; + } + } + } + /////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS /////////////////////////////////////////////////////////////////////////////////////// -} + /** + * Clamps a value between a min and max. + */ + _clamp(value, min, max) + { + return Math.min(Math.max(value, min), max); + } + } export default ConnectionItem; \ No newline at end of file diff --git a/rodan-client/code/src/js/Items/LineItem.js b/rodan-client/code/src/js/Items/LineItem.js index 90bfe1f5b..bb0357179 100644 --- a/rodan-client/code/src/js/Items/LineItem.js +++ b/rodan-client/code/src/js/Items/LineItem.js @@ -1,4 +1,5 @@ import BaseItem from './BaseItem'; +import Rodan from 'rodan'; /** * Line item. @@ -14,15 +15,29 @@ class LineItem extends BaseItem constructor(options) { super(options); - this.firstSegment.point = options.startPoint; + this.fillColor = null; + this._startPoint = options.startPoint; + this._padding = this._padding = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].CONNECTION_PADDING; } /** * Sets endpoint. */ - setEndPoint(point) + setEndPoint(endpoint) { - this.lastSegment.point = point; + this.removeSegments(); + + if (this._startPoint.y + 2 * this._padding > endpoint.y) { + const p1 = new Point(this._startPoint.x, this._startPoint.y + this._padding); + const p2 = new Point((this._startPoint.x + endpoint.x) / 2, this._startPoint.y + this._padding); + const p3 = new Point((this._startPoint.x + endpoint.x) / 2, endpoint.y - this._padding); + const p4 = new Point(endpoint.x, endpoint.y - 5); + this.add(this._startPoint, p1, p2, p3, p4, endpoint); + } else { + const p1 = new Point(this._startPoint.x, (this._startPoint.y + endpoint.y) / 2); + const p2 = new Point(endpoint.x, (this._startPoint.y + endpoint.y) / 2); + this.add(this._startPoint, p1, p2, endpoint); + } } /** diff --git a/rodan-client/code/src/js/Managers/ErrorManager.js b/rodan-client/code/src/js/Managers/ErrorManager.js index c4db53c48..890cc7995 100644 --- a/rodan-client/code/src/js/Managers/ErrorManager.js +++ b/rodan-client/code/src/js/Managers/ErrorManager.js @@ -53,31 +53,7 @@ export default class ErrorHandler } else { - var response = options.response; - var responseTextObject = JSON.parse(response.responseText); - var message = 'An unknown error occured.'; - - // Look for message in options first. - if (options.hasOwnProperty('message')) - { - message = options.message; - } - - // Go through the response text. - var first = true; - for(var property in responseTextObject) - { - if (responseTextObject.hasOwnProperty(property)) - { - message += '\n'; - if (first) - { - message += '\n'; - first = false; - } - message += responseTextObject[property]; - } - } + var message = options.message || 'An unknown error occured.'; this._showError(message, null); } } @@ -92,7 +68,9 @@ export default class ErrorHandler */ _showError(text, error) { - console.error(error); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_ERROR, {content: text, title: 'Error'}); + if (error) { + console.error(error); + } + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_ERROR, {content: text}); } } \ No newline at end of file diff --git a/rodan-client/code/src/js/Managers/UpdateManager.js b/rodan-client/code/src/js/Managers/UpdateManager.js index 48ad16587..4e74a0e46 100644 --- a/rodan-client/code/src/js/Managers/UpdateManager.js +++ b/rodan-client/code/src/js/Managers/UpdateManager.js @@ -54,6 +54,8 @@ export default class UpdateManager */ _handleRequestUpdateClear(options) { - this._updater.clear(); + if (this._updater) { + this._updater.clear(); + } } } \ No newline at end of file diff --git a/rodan-client/code/src/js/Models/Workflow.js b/rodan-client/code/src/js/Models/Workflow.js index dd93579b1..c2cc9b2a8 100644 --- a/rodan-client/code/src/js/Models/Workflow.js +++ b/rodan-client/code/src/js/Models/Workflow.js @@ -20,7 +20,7 @@ export default class Workflow extends BaseModel */ initialize(options) { - this.set('connections', new ConnectionCollection(options.connections)); + this.set('workflow_connections', new ConnectionCollection(options.connections)); this.set('workflow_input_ports', new InputPortCollection(options.workflow_input_ports)); this.set('workflow_output_ports', new OutputPortCollection(options.workflow_output_ports)); this.set('workflow_jobs', new WorkflowJobCollection(options.workflow_jobs)); @@ -45,43 +45,42 @@ export default class Workflow extends BaseModel */ parse(response) { - const workflow_runs = new WorkflowRunCollection(); - if (response.workflow_runs) { - for (const workflow_run of response.workflow_runs) { - workflow_runs.add(workflow_run); - } + for (var i in response.workflow_runs) + { + var modelClass = this.get('workflow_runs').model; + var model = new modelClass(response.workflow_runs[i]); + this.get('workflow_runs').add(model, {merge: true}); } + response.workflow_runs = this.get('workflow_runs'); - const workflow_jobs = new WorkflowJobCollection(); - if (response.workflow_jobs) { - for (const workflow_job of response.workflow_jobs) { - workflow_jobs.add(workflow_job); - } + for (var i in response.workflow_jobs) + { + var modelClass = this.get('workflow_jobs').model; + var model = new modelClass(response.workflow_jobs[i]); + this.get('workflow_jobs').add(model, {merge: true}); } + response.workflow_jobs = this.get('workflow_jobs'); - const workflow_input_ports = new InputPortCollection(); - if (response.workflow_input_ports) { - for (const workflow_input_port of response.workflow_input_ports) { - workflow_input_ports.add(workflow_input_port); - } - } + this.get('workflow_input_ports').set(response.workflow_input_ports, {merge: true, remove: true}); + response.workflow_input_ports = this.get('workflow_input_ports'); - const workflow_output_ports = new OutputPortCollection(); - if (response.workflow_output_ports) { - for (const workflow_output_port of response.workflow_output_ports) { - workflow_output_ports.add(workflow_output_port); - } + for (var i in response.workflow_output_ports) + { + var modelClass = this.get('workflow_output_ports').model; + var model = new modelClass(response.workflow_output_ports[i]); + this.get('workflow_output_ports').add(model, {merge: true}); } - - const parsed = { - ...response, - workflow_runs, - workflow_jobs, - workflow_input_ports, - workflow_output_ports + response.workflow_output_ports = this.get('workflow_output_ports'); + + for (var i in response.workflow_connections) + { + var modelClass = this.get('workflow_connections').model; + var model = new modelClass(response.workflow_connections[i]); + this.get('workflow_connections').add(model, {merge: true}); } + response.workflow_connections = this.get('workflow_connections'); - return parsed; + return response; } } Workflow.prototype.routeName = 'workflows'; \ No newline at end of file diff --git a/rodan-client/code/src/js/Router.js b/rodan-client/code/src/js/Router.js new file mode 100644 index 000000000..945aff239 --- /dev/null +++ b/rodan-client/code/src/js/Router.js @@ -0,0 +1,26 @@ +import Radio from "backbone.radio"; +import RODAN_EVENTS from "js/Shared/RODAN_EVENTS"; +import ViewResetPassword from "js/Views/Master/Main/User/Individual/ViewResetPassword"; +import AppRouter from "marionette.approuter"; + +const Router = AppRouter.extend({ + controller: { + resetPassword(uid, token) { + const options = { uid, token }; + const view = new ViewResetPassword(options); + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_HIDE); + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: "Reset Password", content: view }); + }, + activateAccount(uid, token) { + const options = { uid, token }; + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_ACTIVATE_ACCOUNT, options); + }, + }, + + appRoutes: { + "password-reset/:uid/:token": "resetPassword", + "activate/:uid/:token": "activateAccount", + } +}); + +export default Router; \ No newline at end of file diff --git a/rodan-client/code/src/js/Shared/RODAN_EVENTS.js b/rodan-client/code/src/js/Shared/RODAN_EVENTS.js index 0381edb26..f60176304 100644 --- a/rodan-client/code/src/js/Shared/RODAN_EVENTS.js +++ b/rodan-client/code/src/js/Shared/RODAN_EVENTS.js @@ -52,6 +52,8 @@ class RODAN_EVENTS this.EVENT__AUTHENTICATION_LOGIN_SUCCESS = 'EVENT__AUTHENTICATION_LOGIN_SUCCESS'; /** Triggered after authentication attempt; user must log in. */ this.EVENT__AUTHENTICATION_LOGINREQUIRED = 'EVENT__AUTHENTICATION_LOGINREQUIRED'; + /** Triggered if the account has not been activated. */ + this.EVENT__AUTHENTICATION_ACTIVATION_REQUIRED = 'EVENT__AUTHENTICATION_ACTIVATION_REQUIRED'; /** Triggered on success of deauthentication. */ this.EVENT__AUTHENTICATION_LOGOUT_SUCCESS = 'EVENT__AUTHENTICATION_LOGOUT_SUCCESS'; /** Request check of authentication status. The client will make a request to the Rodan server. Upon response from the server, the client will fire one of the above AUTHENTICATION events. */ @@ -351,12 +353,28 @@ class RODAN_EVENTS /////////////////////////////////////////////////////////////////////////////////////// /** Triggered when User has changed password. */ this.EVENT__USER_CHANGED_PASSWORD = 'EVENT__USER_CHANGED_PASSWORD'; + /** Triggered when User has requested a password request email */ + this.EVENT__USER_PASSWORD_RESET_REQUESTED = 'EVENT__USER_PASSWORD_RESET_REQUESTED'; + /** Triggered when User has successfully reset password */ + this.EVENT__USER_PASSWORD_RESET_CONFIRMED = 'EVENT__USER_PASSWORD_RESET_CONFIRMED'; /** Triggered when UserPreference for current User has been loaded. Sends {user_preference: UserPreference}. */ this.EVENT__USER_PREFERENCE_LOADED = 'EVENT__USER_PREFERENCE_LOADED'; /** Triggered when UserPreference saved. Sends {user_preference: UserPreference}. */ this.EVENT__USER_PREFERENCE_SAVED = 'EVENT__USER_PREFERENCE_SAVED'; /** Triggered when User has been saved. Sends {user: User}. */ this.EVENT__USER_SAVED = 'EVENT__USER_SAVED'; + /** Triggered when there are errors in registration. Sends {errors: {[string]: string[]}} */ + this.EVENT__USER_REGISTER_ERROR = 'EVENT__USER_REGISTER_ERROR'; + /** Triggered when User has been registered. Sends {user: User}. */ + this.EVENT__USER_REGISTERED = 'EVENT__USER_REGISTERED'; + /** Triggered when an account is activated. */ + this.EVENT__USER_ACTIVATED = 'EVENT__USER_ACTIVATED'; + /** Triggered when User has requested a new activation email. */ + this.EVENT__USER_RESENT_ACTIVATION_EMAIL = 'EVENT__USER_RESENT_ACTIVATION_EMAIL'; + /** Request a password reset email. Takes in {username: string}. */ + this.REQUEST__USER_RESET_PASSWORD = 'REQUEST__USER_RESET_PASSWORD'; + /** Request password reset using token from email. Takes in {cid: string, token: string, new_password: string}. */ + this.REQUEST__USER_RESET_PASSWORD_CONFIRM = 'REQUEST__USER_RESET_PASSWORD_CONFIRM'; /** Request current User's password be changed. Takes {currentpassword: string, newpassword: string}. */ this.REQUEST__USER_CHANGE_PASSWORD = 'REQUEST__USER_CHANGE_PASSWORD'; /** Request UserPreference for current User. Returns {user_preference: UserPreference (may be null if not yet loaded)}. */ @@ -365,6 +383,12 @@ class RODAN_EVENTS this.REQUEST__USER_PREFERENCE_SAVE = 'REQUEST__USER_PREFERENCE_SAVE'; /** Request a User be saved/updated. Takes {user_preference: UserPreference}. */ this.REQUEST__USER_SAVE = 'REQUEST__USER_SAVE'; + /** Request registration of new user */ + this.REQUEST__USER_REGISTER = 'REQUEST__USER_REGISTER'; + /** Request to activate account. Takes in {uid: string, token: string} */ + this.REQUEST__USER_ACTIVATE_ACCOUNT = 'REQUEST__USER_ACTIVATE_ACCOUNT'; + /** Request new activation email. Takes in {username: string} */ + this.REQUEST__USER_RESEND_ACTIVATION = 'REQUEST__USER_RESEND_ACTIVATION'; /////////////////////////////////////////////////////////////////////////////////////// // Workflow @@ -422,6 +446,8 @@ class RODAN_EVENTS this.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN = 'REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN'; /** Request the Resources that are currently assigned to an InputPort. Takes {inputport: InputPort}. Returns [Resource]. */ this.REQUEST__WORKFLOWBUILDER_GET_RESOURCEASSIGNMENTS = 'REQUEST__WORKFLOWBUILDER_GET_RESOURCEASSIGNMENTS'; + /** Request all InputPort resource assignments to be cleared. */ + this.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS = 'REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS'; /** Request all InputPorts that could satisfy the provided OutputPort in the given Workflow. Takes {workflow: Workflow, outputport: OutputPort}. Returns [string] (InputPort URLs). */ this.REQUEST__WORKFLOWBUILDER_GET_SATISFYING_INPUTPORTS = 'REQUEST__WORKFLOWBUILDER_GET_SATISFYING_INPUTPORTS'; /** Request a Workflow (origin) be added to another Workflow (target). Takes {origin: Workflow, target: Workflow}. */ diff --git a/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js b/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js index 71de7f672..f3b949b68 100644 --- a/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js +++ b/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js @@ -22,6 +22,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__UPDATER_CLEAR); this._lastErrorCode = ''; this._lastErrorDetails = ''; + this.setElement('
    '); } /** @@ -58,11 +59,20 @@ class LayoutViewWorkflowBuilder extends Marionette.View this.rodanChannel.on(Rodan.RODAN_EVENTS.EVENT__SERVER_ERROR, options => this._handleEventRodanError(options), this); } + /** + * Hide all dropdowns in the workflow builder. + */ + _hideDropdowns() + { + $('.dropdown-menu').hide(); + } + /** * Handle button zoom in. */ _handleButtonZoomIn() { + this._hideDropdowns(); this.guiChannel.request(GUI_EVENTS.REQUEST__WORKFLOWBUILDER_GUI_ZOOM_IN); } @@ -71,6 +81,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View */ _handleButtonZoomOut() { + this._hideDropdowns(); this.guiChannel.request(GUI_EVENTS.REQUEST__WORKFLOWBUILDER_GUI_ZOOM_OUT); } @@ -79,6 +90,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View */ _handleButtonZoomReset() { + this._hideDropdowns(); this.guiChannel.request(GUI_EVENTS.REQUEST__WORKFLOWBUILDER_GUI_ZOOM_RESET); } @@ -87,14 +99,25 @@ class LayoutViewWorkflowBuilder extends Marionette.View */ _handleButtonEdit() { + this._hideDropdowns(); this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOW_VIEW, {workflow: this.model}); } + + /** + * Handle button clear assigned resources. + */ + _handleButtonClearAssignedResources() + { + this._hideDropdowns(); + this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS, {workflow: this.model}); + } /** * Handle button add job. */ _handleButtonAddJob() { + this._hideDropdowns(); this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_JOBCOLLECTION_VIEW, {workflow: this.model}); } @@ -103,6 +126,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View */ _handleButtonImportWorkflow() { + this._hideDropdowns(); this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOWCOLLECTION_VIEW, {workflow: this.model}); } @@ -111,6 +135,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View */ _handleButtonRun() { + this._hideDropdowns(); this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN, {workflow: this.model}); } @@ -127,10 +152,10 @@ class LayoutViewWorkflowBuilder extends Marionette.View * Handle click data status. */ _handleClickDataStatus() - { + { if (this._lastErrorCode !== '' || this._lastErrorDetails !== '') { - this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__MODAL_SHOW, {title: "ERROR", content: "Error code: " + this._lastErrorCode + " " + this._lastErrorDetails}); + this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: "Invalid Workflow", content: this._lastErrorDetails }); } } @@ -141,27 +166,68 @@ class LayoutViewWorkflowBuilder extends Marionette.View { var checked = this.ui.checkboxAddPorts.is(':checked'); this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SET_ADDPORTS, {addports: checked}); + this._hideDropdowns(); + } + + /** + * Handle click on "Workflow" navbar button. + */ + _handleClickWorkflowDropdownToggle() + { + this.ui.viewDropdownToggle.siblings('.dropdown-menu').hide(); + this.ui.settingsDropdownToggle.siblings('.dropdown-menu').hide(); + this.ui.workflowDropdownToggle.siblings('.dropdown-menu').toggle(); + } + + /** + * Handle click on "View" navbar button. + */ + _handleClickViewDropdownToggle() + { + this.ui.settingsDropdownToggle.siblings('.dropdown-menu').hide(); + this.ui.workflowDropdownToggle.siblings('.dropdown-menu').hide(); + this.ui.viewDropdownToggle.siblings('.dropdown-menu').toggle(); } + /** + * Handle click on "Settings" navbar button. + */ + _handleClickSettingsDropdownToggle() + { + this.ui.viewDropdownToggle.siblings('.dropdown-menu').hide(); + this.ui.workflowDropdownToggle.siblings('.dropdown-menu').hide(); + this.ui.settingsDropdownToggle.siblings('.dropdown-menu').toggle(); + } + + /** * Updates info of Workflow in view. */ _updateView(event, model) { - this.ui.workflowName.text(this.model.get('name')); + const workflowName = this.model.get('name'); + this.ui.workflowName.text(workflowName); if (this.model.get('valid')) { this._lastErrorCode = ''; this._lastErrorDetails = ''; - this.ui.dataStatus.text('Workflow "' + this.model.get('name') + '" is valid'); + this.ui.dataStatus.text(`Workflow "${workflowName}" is valid.`); + this.ui.dataStatus.removeClass('text-danger'); } else { - if (this._lastErrorCode == '' && this._lastErrorDetails == '') { - this.ui.dataStatus.text('Workflow "' + this.model.get('name') + '" setup is incomplete.'); - } else { - this.ui.dataStatus.text('Workflow "' + this.model.get('name') + '" is INVALID (click here for details)'); + if (this._lastErrorCode == '' && this._lastErrorDetails == '') + { + this.ui.dataStatus.text(`Workflow "${workflowName}" setup is incomplete.`); + } + else if (this._lastErrorDetails == '') { + this.ui.dataStatus.text(`Workflow "${workflowName}" is invalid.`); + } + else + { + this.ui.dataStatus.text(`Workflow "${workflowName}" is invalid: ${this._lastErrorDetails}`); } + this.ui.dataStatus.addClass('text-danger'); } } } @@ -179,9 +245,13 @@ LayoutViewWorkflowBuilder.prototype.ui = { checkboxAddPorts: '#checkbox-add_ports', dataStatus: '#data-workflow_status', buttonEdit: '#button-edit', + buttonClearAssignedResources: '#button-clear_assigned_resources', buttonAddJob: '#button-add_job', buttonImportWorkflow: '#button-import_workflow', - buttonRun: '#button-run' + buttonRun: '#button-run', + workflowDropdownToggle: '#workflow-dropdown-toggle', + viewDropdownToggle: '#view-dropdown-toggle', + settingsDropdownToggle: '#settings-dropdown-toggle', }; LayoutViewWorkflowBuilder.prototype.events = { 'click @ui.buttonZoomIn': '_handleButtonZoomIn', @@ -190,9 +260,13 @@ LayoutViewWorkflowBuilder.prototype.events = { 'click @ui.dataStatus': '_handleClickDataStatus', 'change @ui.checkboxAddPorts': '_handleClickCheckboxAddPorts', 'click @ui.buttonEdit': '_handleButtonEdit', + 'click @ui.buttonClearAssignedResources': '_handleButtonClearAssignedResources', 'click @ui.buttonAddJob': '_handleButtonAddJob', 'click @ui.buttonImportWorkflow': '_handleButtonImportWorkflow', - 'click @ui.buttonRun': '_handleButtonRun' + 'click @ui.buttonRun': '_handleButtonRun', + 'click @ui.workflowDropdownToggle': '_handleClickWorkflowDropdownToggle', + 'click @ui.viewDropdownToggle': '_handleClickViewDropdownToggle', + 'click @ui.settingsDropdownToggle': '_handleClickSettingsDropdownToggle' }; LayoutViewWorkflowBuilder.prototype.modelEvents = { 'all': '_updateView' diff --git a/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js b/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js index ae4757e44..3e2da8ad1 100644 --- a/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js +++ b/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js @@ -18,13 +18,17 @@ export default class LayoutViewMaster extends Marionette.View */ initialize() { + // Replace default Marionette wrapping div with our own div that has an ID. + this.setElement('
    '); + + // Add regions. this.addRegions({ regionMain: '#region-main', regionNavigation: '#region-navigation', - regionStatus: '#region-status' + regionStatus: '#requests-status' }); - this._initializeViews(); + this._initializeViews(); } /** diff --git a/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js b/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js index 31ed53e18..a7c368326 100644 --- a/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js +++ b/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js @@ -6,4 +6,5 @@ import Marionette from 'backbone.marionette'; export default class BaseViewCollection extends Marionette.CollectionView {} BaseViewCollection.prototype.modelEvents = { 'all': 'render' }; BaseViewCollection.prototype.childViewContainer = 'tbody'; -BaseViewCollection.prototype.allowMultipleSelection = false; \ No newline at end of file +BaseViewCollection.prototype.allowMultipleSelection = false; +BaseViewCollection.prototype.el = '
    '; \ No newline at end of file diff --git a/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js index 6e96979c6..55942b7a5 100644 --- a/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js +++ b/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js @@ -18,9 +18,21 @@ export default class ViewInputPortCollectionItem extends BaseViewCollectionItem * @param {object} options Marionette.View options object; 'options.workflow' (Workflow) and 'options.workflowjob' (WorkflowJob) must also be provided */ initialize(options) - { + { this._workflow = options.workflow; this._workflowJob = options.workflowjob; + + this._minimum = this._getMinimumInputPortCount(); + + this._inputPorts = this._workflowJob.get("input_ports"); + this._inputPorts.on("change add remove reset", () => this._handleInputPortsChange()); + } + + templateContext() + { + return { + disableDelete: this._getCurrentInputPortCount() <= this._minimum + }; } /////////////////////////////////////////////////////////////////////////////////////// @@ -33,6 +45,27 @@ export default class ViewInputPortCollectionItem extends BaseViewCollectionItem { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_REMOVE_INPUTPORT, {inputport: this.model, workflow: this._workflow, workflowjob: this._workflowJob}); } + + _handleInputPortsChange() + { + this.render(); // We need to re-render if the the job's input port changes to disable/enable delete button. + } + + _getCurrentInputPortCount() + { + return this._inputPorts.where({ input_port_type: this.model.get("input_port_type") }).length; + } + + _getMinimumInputPortCount() + { + const jobCollection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_JOB_COLLECTION); + const inputPortTypes = jobCollection.get(this._workflowJob.getJobUuid()).get("input_port_types"); + + const portTypeUrl = this.model.get("input_port_type"); + const portType = inputPortTypes.findWhere({url: portTypeUrl}); + + return portType.get("minimum"); + } } ViewInputPortCollectionItem.prototype.ui = { buttonDelete: '#button-delete' diff --git a/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js index a5ecaa6fb..0cb1f5074 100644 --- a/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js +++ b/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js @@ -21,6 +21,15 @@ export default class ViewInputPortTypeCollectionItem extends BaseViewCollectionI { this._workflowJob = options.workflowjob; this._workflow = options.workflow; + this._inputPorts = this._workflowJob.get("input_ports"); + this._inputPorts.on("change add remove reset", () => this._handleInputPortsChange()); + } + + templateContext() + { + return { + current: this._getCurrentInputPortCount() + }; } /////////////////////////////////////////////////////////////////////////////////////// @@ -33,6 +42,16 @@ export default class ViewInputPortTypeCollectionItem extends BaseViewCollectionI { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_ADD_INPUTPORT, {inputporttype: this.model, workflowjob: this._workflowJob, workflow: this._workflow}); } + + _handleInputPortsChange() + { + this.render(); // We need to re-render if the the job's input port changes to update the current count. + } + + _getCurrentInputPortCount() + { + return this._inputPorts.where({ input_port_type: this.model.get("url") }).length; + } } ViewInputPortTypeCollectionItem.prototype.tagName = 'tr'; ViewInputPortTypeCollectionItem.prototype.template = _.template($('#template-main_inputporttype_collection_item').text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js b/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js index ee498bd46..79285eb52 100644 --- a/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js +++ b/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js @@ -18,8 +18,12 @@ export default class LayoutViewMain extends Marionette.View */ initialize() { + this.setElement('
    '); this.addRegions({ - region: 'div' + region: { + el: 'div', + replaceElement: true + } }); this._initializeRadio(); } diff --git a/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js b/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js index 5b5e28503..ee01836d2 100644 --- a/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js +++ b/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js @@ -1,55 +1,130 @@ -import $ from 'jquery'; -import _ from 'underscore'; -import Marionette from 'backbone.marionette'; - -/** - * This is a layout to help render a Collection and a single item. - * We're using a LayoutView as opposed to a CompositeView because the single model - * that would be associated with the CompositveView is not initially known, so it can't - * rerender. - */ -export default class LayoutViewModel extends Marionette.View -{ -/////////////////////////////////////////////////////////////////////////////////////// -// PUBLIC METHODS -/////////////////////////////////////////////////////////////////////////////////////// - /** - * Initializes the instance. - */ - initialize() - { - this.addRegions({ - regionCollection: '#region-main_layoutview_model_collection', - regionItem: '#region-main_layoutview_model_item' - }); - } - - /** - * Show a Collection view. - * - * @param {Marionette.View} view Collection view to show - */ - showCollection(view) - { - this.showChildView('regionCollection', view); - } - - /** - * Show an item view. - * - * @param {Marionette.View} view item view to show - */ - showItem(view) - { - this.showChildView('regionItem', view); - } - - /** - * Clears item view. - */ - clearItemView() - { - this.getRegion('regionItem').empty(); - } -} -LayoutViewModel.prototype.template = _.template($('#template-main_layoutview_model').text()); +// import $ from 'jquery'; +// import _ from 'underscore'; +// import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; +// import Marionette from 'backbone.marionette'; +// import Radio from 'backbone.radio'; + +// /** +// * This is a layout to help render a Collection and a single item. +// * We're using a LayoutView as opposed to a CompositeView because the single model +// * that would be associated with the CompositveView is not initially known, so it can't +// * rerender. +// */ +// export default class LayoutViewModel extends Marionette.View +// { +// /////////////////////////////////////////////////////////////////////////////////////// +// // PUBLIC METHODS +// /////////////////////////////////////////////////////////////////////////////////////// +// /** +// * Initializes the instance. +// */ +// initialize() +// { +// console.log(this); +// this.setElement('
    '); +// this.addRegions({ +// regionCollection: '#region-main_layoutview_model_collection', +// regionProjectInfo: '#region-main_layoutview_model_item', +// regionCollectionItemInfo: '#region-main_layoutview_model_collection_item' +// }); +// } + +// /** +// * Show a Collection view. +// * +// * @param {Marionette.View} view Collection view to show +// */ +// showCollection(view) +// { +// console.log(view); +// this.showChildView('regionCollection', view); +// } + +// /** +// * Show an item view. +// * +// * @param {Marionette.View} view item view to show +// */ +// showItem(view) +// { +// console.log(view); +// this.showChildView('regionProjectInfo', view); +// } + +// /** +// * Show an item view. This is for the secondary item view. +// * +// * @param {Marionette.View} view item view to show +// */ +// showSecondaryItem(view) { +// this.showChildView('regionCollectionItemInfo', view); +// } + +// /** +// * Clears item view. +// */ +// clearItemView() +// { +// this.getRegion('regionCollectionItemInfo').empty(); +// } + +// /** +// * Handle RunJob button. +// */ +// _handleButtonRunJobs() +// { +// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RUNJOB_SELECTED_COLLECTION, {project: this.model}); +// } + +// /** +// * Handle click resource count. +// */ +// _handleClickResourceCount() +// { +// console.log(this); +// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCE_SELECTED_COLLECTION, {project: this.model}); +// } + +// /** +// * Handle click workflow count. +// */ +// _handleClickWorkflowCount() +// { +// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOW_SELECTED_COLLECTION, {project: this.model}); +// } + +// /** +// * Handle click button ResourceLists. +// */ +// _handleButtonResourceLists() +// { +// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCELIST_SELECTED_COLLECTION, {project: this.model}); +// } + +// /** +// * Handle button Project users. +// */ +// _handleButtonProjectUsers() +// { +// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_USERS_SELECTED, {project: this.model}); +// } +// } + + +// LayoutViewModel.prototype.ui = { +// // buttonResourceLists: '#button-resourcelists', +// resourceCount: '#resource_count', +// workflowCount: '#workflow_count', +// buttonRunJobs: '#button-runjobs', +// buttonUsers: '#button-project_users' +// }; + +// LayoutViewModel.prototype.events = { +// 'click @ui.resourceCount': '_handleClickResourceCount', +// 'click @ui.workflowCount': '_handleClickWorkflowCount', +// 'click @ui.buttonRunJobs': '_handleButtonRunJobs', +// 'click @ui.buttonResourceLists': '_handleButtonResourceLists', +// 'click @ui.buttonUsers': '_handleButtonProjectUsers' +// }; + +// LayoutViewModel.prototype.template = _.template($('#template-main_layoutview_model').text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewActivationRequired.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewActivationRequired.js new file mode 100644 index 000000000..bb7cf39d0 --- /dev/null +++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewActivationRequired.js @@ -0,0 +1,39 @@ +import Marionette from "backbone.marionette"; +import Radio from "backbone.radio"; +import $ from "jquery"; +import RODAN_EVENTS from "js/Shared/RODAN_EVENTS"; +import _ from "underscore"; + +/** + * Activation required view. + */ +export default class ViewActivationRequired extends Marionette.View { + + initialize(options) { + this._email = options.email; + } + + /////////////////////////////////////////////////////////////////////////////////////// + // PRIVATE METHODS + /////////////////////////////////////////////////////////////////////////////////////// + /** + * Handle resend activation email. + */ + _handleButtonSubmit() { + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_RESEND_ACTIVATION, { email: this._email }); + } +} + +ViewActivationRequired.prototype.modelEvents = { + "all": "render" +}; + +ViewActivationRequired.prototype.ui = { + buttonSubmit: "#button-resend_activation_email", +}; + +ViewActivationRequired.prototype.events = { + "click @ui.buttonSubmit": "_handleButtonSubmit" +}; + +ViewActivationRequired.prototype.template = _.template($("#template-main_activation-required").text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewForgotPassword.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewForgotPassword.js new file mode 100644 index 000000000..f4375ae4d --- /dev/null +++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewForgotPassword.js @@ -0,0 +1,32 @@ +import Marionette from "backbone.marionette"; +import Radio from "backbone.radio"; +import $ from "jquery"; +import RODAN_EVENTS from "js/Shared/RODAN_EVENTS"; +import _ from "underscore"; + +/** + * Forgot password view. + */ +export default class ViewForgotPassword extends Marionette.View { + /////////////////////////////////////////////////////////////////////////////////////// + // PRIVATE METHODS + /////////////////////////////////////////////////////////////////////////////////////// + /** + * Handle save button. + */ + _handleButtonSubmit() { + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD, { email: this.ui.textEmail.val() }); + } +} +ViewForgotPassword.prototype.modelEvents = { + "all": "render" +}; +ViewForgotPassword.prototype.ui = { + buttonSubmit: "#button-request_password_reset", + textEmail: "#text-email", + textMessage: "#text-message", +}; +ViewForgotPassword.prototype.events = { + "click @ui.buttonSubmit": "_handleButtonSubmit" +}; +ViewForgotPassword.prototype.template = _.template($("#template-main_forgot-password").text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js index c800e8a94..612cdf8a9 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js +++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js @@ -3,6 +3,8 @@ import _ from 'underscore'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; import Marionette from 'backbone.marionette'; import Radio from 'backbone.radio'; +import ViewForgotPassword from './ViewForgotPassword'; +import ViewRegister from './ViewRegister'; /** * Login view. @@ -30,6 +32,24 @@ export default class ViewLogin extends Marionette.View { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_LOGIN, { email: this.ui.textEmail.val(), password: this.ui.textPassword.val() }); } + + /** + * Handle register button. + */ + _handleButtonRegister() + { + const content = new ViewRegister(); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: 'Register', content }); + } + + /** + * Handle forgot password button. + */ + _handleButtonForgotPassword() + { + const content = new ViewForgotPassword(); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: 'Forgot Password', content }); + } } ViewLogin.prototype.modelEvents = { 'all': 'render' @@ -37,9 +57,13 @@ ViewLogin.prototype.modelEvents = { ViewLogin.prototype.ui = { textEmail: '#text-login_email', textPassword: '#text-login_password', - buttonLogin: '#button-login' + buttonLogin: '#button-login', + buttonRegister: '#button-register', + buttonForgotPassword: '#button-forgot_password' }; ViewLogin.prototype.events = { - 'click @ui.buttonLogin': '_handleButton' + 'click @ui.buttonLogin': '_handleButton', + 'click @ui.buttonRegister': '_handleButtonRegister', + 'click @ui.buttonForgotPassword': '_handleButtonForgotPassword' }; ViewLogin.prototype.template = _.template($('#template-main_login').text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewRegister.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewRegister.js new file mode 100644 index 000000000..cc8d91a1f --- /dev/null +++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewRegister.js @@ -0,0 +1,133 @@ +import Marionette from "backbone.marionette"; +import Radio from "backbone.radio"; +import $ from "jquery"; +import RODAN_EVENTS from "js/Shared/RODAN_EVENTS"; +import _ from "underscore"; + +/** + * Forgot password view. + */ +export default class ViewRegister extends Marionette.View { + initialize() { + Radio.channel("rodan").on(RODAN_EVENTS.EVENT__USER_REGISTER_ERROR, options => this._handleRegisterError(options)); + } + /////////////////////////////////////////////////////////////////////////////////////// + // PRIVATE METHODS + /////////////////////////////////////////////////////////////////////////////////////// + /** + * Handle register button. + */ + _handleButtonRegister() { + const valid = this._validateFields(); + if (valid) { + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_REGISTER, { + username: this.ui.textUsername.val(), + email: this.ui.textEmail.val(), + password: this.ui.textPassword.val(), + }); + } + } + + /** + * Validate all fields. + */ + _validateFields() { + this._validateUsername(); + this._validateEmail(); + this._validatePassword(); + this._validatePasswordConfirm(); + return this.ui.errorUsername.text() === "" && this.ui.errorEmail.text() === "" && this.ui.errorPassword.text() === "" && this.ui.errorPasswordConfirm.text() === ""; + } + + /** + * Validate username. + */ + _validateUsername() { + const username = this.ui.textUsername.val(); + if (username === "") { + this.ui.errorUsername.text("Username cannot be empty."); + } else { + this.ui.errorUsername.text(""); + } + } + + /** + * Validate email. + */ + _validateEmail() { + const email = this.ui.textEmail.val(); + if (email === "") { + this.ui.errorEmail.text("Email cannot be empty."); + } else if (!/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(email)) { + this.ui.errorEmail.text("Invalid email."); + } else { + this.ui.errorEmail.text(""); + } + } + + /** + * Validate password. + */ + _validatePassword() { + const password = this.ui.textPassword.val(); + if (password === "") { + this.ui.errorPassword.text("Password cannot be empty."); + } else { + this.ui.errorPassword.text(""); + } + } + + /** + * Validate password confirm. + */ + _validatePasswordConfirm() { + const password = this.ui.textPassword.val(); + const passwordConfirm = this.ui.textPasswordConfirm.val(); + if (password !== passwordConfirm) { + this.ui.errorPasswordConfirm.text("Passwords do not match."); + } else { + this.ui.errorPasswordConfirm.text(""); + } + } + + /** + * Handle errors returned from server. + * @param {{errors: {[string]: string[]}}} options map from field name to error messages + */ + _handleRegisterError(options) { + const errorMap = options.errors; + for (const [key, errors] of Object.entries(errorMap)) { + if (key === "username") { + this.ui.errorUsername.text(errors.join(" ")); + } else if (key === "email") { + this.ui.errorEmail.text(errors.join(" ")); + } else if (key === "password") { + this.ui.errorPassword.text(errors.join(" ")); + } else if (key === "password_confirm") { + this.ui.errorPasswordConfirm.text(errors.join(" ")); + } + } + } +} + +ViewRegister.prototype.modelEvents = { + "all": "render" +}; + +ViewRegister.prototype.ui = { + buttonRegister: "#button-register", + textUsername: "#text-username", + textEmail: "#text-email", + textPassword: "#text-password", + textPasswordConfirm: "#text-password_confirm", + errorUsername: "#error-username", + errorEmail: "#error-email", + errorPassword: "#error-password", + errorPasswordConfirm: "#error-password_confirm" +}; + +ViewRegister.prototype.events = { + "click @ui.buttonRegister": "_handleButtonRegister" +}; + +ViewRegister.prototype.template = _.template($("#template-main_register").text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js index c10d50e80..efd2a7b96 100644 --- a/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js +++ b/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js @@ -21,6 +21,18 @@ export default class ViewOutputPortCollectionItem extends BaseViewCollectionItem { this._workflow = options.workflow; this._workflowJob = options.workflowjob; + + this._minimum = this._getMinimumOutputPortCount(); + + this._outputPorts = this._workflowJob.get("output_ports"); + this._outputPorts.on("change add remove reset", () => this._handleOutputPortsChange()); + } + + templateContext() + { + return { + disableDelete: this._getCurrentOutputPortCount() <= this._minimum + } } /////////////////////////////////////////////////////////////////////////////////////// @@ -33,6 +45,27 @@ export default class ViewOutputPortCollectionItem extends BaseViewCollectionItem { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_REMOVE_OUTPUTPORT, {outputport: this.model, workflow: this._workflow, workflowjob: this._workflowJob}); } + + _handleOutputPortsChange() + { + this.render(); // We need to re-render if the the job's output port changes to disable/enable delete button. + } + + _getCurrentOutputPortCount() + { + return this._outputPorts.where({ output_port_type: this.model.get("output_port_type") }).length; + } + + _getMinimumOutputPortCount() + { + const jobCollection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_JOB_COLLECTION); + const outputPortTypes = jobCollection.get(this._workflowJob.getJobUuid()).get("output_port_types"); + + const portTypeUrl = this.model.get("output_port_type"); + const portType = outputPortTypes.findWhere({url: portTypeUrl}); + + return portType.get("minimum"); + } } ViewOutputPortCollectionItem.prototype.ui = { buttonDelete: '#button-delete' diff --git a/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js index 29675235b..fad3c988a 100644 --- a/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js +++ b/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js @@ -21,6 +21,15 @@ export default class ViewOutputPortTypeCollectionItem extends BaseViewCollection { this._workflowJob = options.workflowjob; this._workflow = options.workflow; + this._outputPorts = this._workflowJob.get("output_ports"); + this._outputPorts.on("change add remove reset", () => this._handleOutputPortsChange()); + } + + templateContext() + { + return { + current: this._getCurrentOutputPortCount() + } } /////////////////////////////////////////////////////////////////////////////////////// @@ -33,6 +42,16 @@ export default class ViewOutputPortTypeCollectionItem extends BaseViewCollection { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_ADD_OUTPUTPORT, {outputporttype: this.model, workflowjob: this._workflowJob, workflow: this._workflow}); } + + _handleOutputPortsChange() + { + this.render(); // We need to re-render if the the job's output port changes to update the current count. + } + + _getCurrentOutputPortCount() + { + return this._outputPorts.where({ output_port_type: this.model.get("url") }).length; + } } ViewOutputPortTypeCollectionItem.prototype.tagName = 'tr'; ViewOutputPortTypeCollectionItem.prototype.template = _.template($('#template-main_outputporttype_collection_item').text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js b/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js index 75680f460..8136c87e6 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js +++ b/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js @@ -1,5 +1,5 @@ import $ from 'jquery'; -import _ from 'underscore'; +import _, { initial } from 'underscore'; import BehaviorTable from 'js/Behaviors/BehaviorTable'; import BaseViewCollection from 'js/Views/Master/Main/BaseViewCollection'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; @@ -11,6 +11,11 @@ import ViewProjectCollectionItem from './ViewProjectCollectionItem'; */ export default class ViewProjectCollection extends BaseViewCollection { + initialize() { + super.initialize(); + this.setElement('
    '); + } + _handleButtonNewProject() { var user = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_USER); diff --git a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js index e8ad7ab40..f11974686 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js +++ b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js @@ -28,6 +28,7 @@ export default class LayoutViewProjectUsers extends Marionette.View this._viewProjectWorkers = options.viewprojectworkers; this._viewUsers = options.viewusers; this._project = options.project; + this.setElement('
    '); } /** diff --git a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js index 3a142617e..d6898d31b 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js +++ b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js @@ -7,8 +7,58 @@ import Radio from 'backbone.radio'; /** * Project view. */ -export default class ViewProject extends Marionette.CollectionView +export default class ViewProject extends Marionette.View { + + /** + * Initializes the instance. + */ + initialize() + { + this.setElement('
    '); + this.addRegions({ + regionCollection: '#region-collection-container', + // regionProjectInfo: '#region-project-details-panel', + regionCollectionItemInfo: '#region-collection-item-details-panel' + }); + } + + /** + * Show a Collection view. + * + * @param {Marionette.View} view Collection view to show + */ + showCollection(view) + { + this.showChildView('regionCollection', view); + } + + /** + * Show an item view. + * + * @param {Marionette.View} view item view to show + */ + // showProjectInfo(view) + // { + // this.showChildView('regionProjectInfo', view); + // } + + /** + * Show an item view. This is for the secondary item view. + * + * @param {Marionette.View} view item view to show + */ + showCollectionItemInfo(view) { + this.showChildView('regionCollectionItemInfo', view); + } + + /** + * Clears item view. + */ + clearCollectionItemInfoView() + { + this.getRegion('regionCollectionItemInfo').empty(); + } /////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS /////////////////////////////////////////////////////////////////////////////////////// @@ -17,9 +67,15 @@ export default class ViewProject extends Marionette.CollectionView */ _handleButtonSave() { - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_SAVE, - {project: this.model, - fields: {name: _.escape(this.ui.textName.val()), description: _.escape(this.ui.textDescription.val())}}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_SAVE, + { + project: this.model, + fields: { + name: _.escape(this.ui.textName.val()), + description: _.escape(this.ui.textDescription.val()) + } + } + ); } /** @@ -29,68 +85,91 @@ export default class ViewProject extends Marionette.CollectionView { Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_DELETE, {project: this.model}); } - + /** - * Handle RunJob button. - */ + * Handle RunJob button. + */ _handleButtonRunJobs() { Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RUNJOB_SELECTED_COLLECTION, {project: this.model}); + $('.project-nav-bar-btn').removeClass('active'); + $('#button-runjobs').addClass('active'); } /** - * Handle click resource count. - */ + * Handle click resource count. + */ _handleClickResourceCount() { Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCE_SELECTED_COLLECTION, {project: this.model}); + $('.project-nav-bar-btn').removeClass('active'); + $('#resource_count').addClass('active'); } /** - * Handle click workflow count. - */ + * Handle click workflow count. + */ _handleClickWorkflowCount() { - Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOW_SELECTED_COLLECTION, {project: this.model}); + Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOW_SELECTED_COLLECTION, {view: this, project: this.model}); + $('.project-nav-bar-btn').removeClass('active'); + $('#workflow_count').addClass('active'); } /** - * Handle click button ResourceLists. + * Handle button WorkflowRuns. */ + _handleButtonWorkflowRuns() + { + Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOWRUN_SELECTED_COLLECTION, {project: this.model}); + $('.project-nav-bar-btn').removeClass('active'); + $('#button-workflow_runs').addClass('active'); + } + + /** + * Handle click button ResourceLists. + */ _handleButtonResourceLists() { Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCELIST_SELECTED_COLLECTION, {project: this.model}); + $('.project-nav-bar-btn').removeClass('active'); + $('#resource_count').addClass('active'); } /** - * Handle button Project users. - */ + * Handle button Project users. + */ _handleButtonProjectUsers() { Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_USERS_SELECTED, {project: this.model}); + $('.project-nav-bar-btn').removeClass('active'); + $('#button-project_users').addClass('active'); } } -ViewProject.prototype.modelEvents = { - 'all': 'render' - }; + ViewProject.prototype.ui = { - buttonSave: '#button-save_project', - buttonDelete: '#button-delete_project', - buttonResourceLists: '#button-resourcelists', - resourceCount: '#resource_count', - workflowCount: '#workflow_count', - buttonRunJobs: '#button-runjobs', - textName: '#text-project_name', - textDescription: '#text-project_description', - buttonUsers: '#button-project_users' - }; + // buttonResourceLists: '#button-resourcelists', + resourceCount: '#resource_count', + workflowCount: '#workflow_count', + buttonRunJobs: '#button-runjobs', + buttonUsers: '#button-project_users', + buttonWorkflowRuns: '#button-workflow_runs', + buttonDeleteProject: '#button-delete_project', + buttonSaveProject: '#button-save_project', + textName: '#text-project_name', + textDescription: '#text-project_description' +}; + ViewProject.prototype.events = { - 'click @ui.buttonSave': '_handleButtonSave', - 'click @ui.buttonDelete': '_handleButtonDelete', - 'click @ui.resourceCount': '_handleClickResourceCount', - 'click @ui.workflowCount': '_handleClickWorkflowCount', - 'click @ui.buttonRunJobs': '_handleButtonRunJobs', - 'click @ui.buttonResourceLists': '_handleButtonResourceLists', - 'click @ui.buttonUsers': '_handleButtonProjectUsers' - }; + 'click @ui.resourceCount': '_handleClickResourceCount', + 'click @ui.workflowCount': '_handleClickWorkflowCount', + 'click @ui.buttonRunJobs': '_handleButtonRunJobs', + 'click @ui.buttonResourceLists': '_handleButtonResourceLists', + 'click @ui.buttonUsers': '_handleButtonProjectUsers', + 'click @ui.buttonWorkflowRuns': '_handleButtonWorkflowRuns', + 'click @ui.buttonDeleteProject': '_handleButtonDelete', + 'click @ui.buttonSaveProject': '_handleButtonSave' +}; + +// ViewProject.prototype.template = _.template($('#template-main_layoutview_model').text()); ViewProject.prototype.template = _.template($('#template-main_project_individual').text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js b/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js index 485ec078e..35e80d2de 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js +++ b/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js @@ -5,6 +5,7 @@ import BehaviorTable from 'js/Behaviors/BehaviorTable'; import BaseViewCollection from 'js/Views/Master/Main/BaseViewCollection'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; import Radio from 'backbone.radio'; +import ViewResourceCollectionItem from './ViewResourceCollectionItem'; /** * View for Resource Collection. @@ -24,10 +25,11 @@ export default class ViewResourceCollection extends BaseViewCollection for (var i = 0; i < this.ui.fileInput[0].files.length; i++) { var file = this.ui.fileInput[0].files[i]; - var escapedFile = new File([file.slice(0, file.size)], _.escape(_.escape(file.name))); // This won't work with only one escape! + var escapedFile = new File([file.slice(0, file.size)], _.escape(_.escape(file.name))); // This won't work with only one escape! + const project = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE); Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCE_CREATE, { - project: this.model, + project: project, file: escapedFile, resourcetype: this.octetStreamType, label_names: this.ui.labelInput[0].value @@ -62,6 +64,9 @@ export default class ViewResourceCollection extends BaseViewCollection } } } + +ViewResourceCollection.prototype.template = _.template($('#template-main_resource_collection').text()); +ViewResourceCollection.prototype.childView = ViewResourceCollectionItem; ViewResourceCollection.prototype.behaviors = [{behaviorClass: BehaviorTable, table: '#table-resources'}] ViewResourceCollection.prototype.ui = { fileInput: '#file-main_resource_file', diff --git a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js index 0d1e0b477..15c27de37 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js +++ b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js @@ -25,6 +25,7 @@ export default class ViewResource extends Marionette.CollectionView this.collection.each(function(model) { model.unset('selected'); }); var resourceType = this.collection.findWhere({url: this.model.get('resource_type')}); resourceType.set('selected', 'selected'); + this.setElement('
    '); // set container element } /** diff --git a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js index 99242855d..30897d18f 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js +++ b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js @@ -20,6 +20,7 @@ export default class ViewResourceMulti extends Marionette.CollectionView this.labelNames = ''; this.isSameType = true; this.isSameLabel = true; + this.setElement('
    '); // set container element for (let model of this._models) { let modelResourceTypeURL = model.get('resource_type'); diff --git a/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js b/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js index 700352cbf..d0900e375 100644 --- a/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js +++ b/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js @@ -26,6 +26,7 @@ export default class LayoutViewResourceAssignment extends Marionette.View this._viewAssignedResources = options.viewassignedresources; this._viewAssignedResources.collection.on('update', this._updateAssignedCount); + this.setElement('
    '); } /** diff --git a/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js b/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js index 676598b93..9e145b0e5 100644 --- a/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js +++ b/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js @@ -9,9 +9,15 @@ import Radio from 'backbone.radio'; */ export default class ViewRunJob extends Marionette.View { + + initialize() { + this.setElement('
    '); + } + /////////////////////////////////////////////////////////////////////////////////////// // PUBLIC METHODS -/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// + /** * Set 'Open' button availability after render. * @@ -41,5 +47,5 @@ ViewRunJob.prototype.ui = { }; ViewRunJob.prototype.events = { 'click @ui.buttonOpen': '_handleButtonOpen' - }; +}; ViewRunJob.prototype.template = _.template($('#template-main_runjob_individual').text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js index caf1fa6e3..779238019 100644 --- a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js +++ b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js @@ -20,7 +20,7 @@ export default class ViewPassword extends Marionette.CollectionView var passwordError = this._checkPassword(); if (passwordError) { - this.ui.textmessage.text(passwordError); + this.ui.textMessage.text(passwordError); } else { @@ -54,7 +54,7 @@ ViewPassword.prototype.ui = { buttonSave: '#button-save_password', textPassword: '#text-password', textPasswordConfirm: '#text-password_confirm', - textmessage: '#text-message', + textMessage: '#text-message', textPasswordCurrent: '#text-password_current' }; ViewPassword.prototype.events = { diff --git a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewResetPassword.js b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewResetPassword.js new file mode 100644 index 000000000..a3897eeef --- /dev/null +++ b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewResetPassword.js @@ -0,0 +1,58 @@ +import Marionette from "backbone.marionette"; +import Radio from "backbone.radio"; +import $ from "jquery"; +import RODAN_EVENTS from "js/Shared/RODAN_EVENTS"; +import _ from "underscore"; + +/** + * Password reset view. + */ +export default class ViewResetPassword extends Marionette.View { + initialize(options) { + this._uid = options.uid; + this._token = options.token; + } + /////////////////////////////////////////////////////////////////////////////////////// + // PRIVATE METHODS + /////////////////////////////////////////////////////////////////////////////////////// + /** + * Handle submit button. + */ + _handleButtonSubmit() { + var passwordError = this._checkPassword(); + if (passwordError) { + this.ui.textMessage.text(passwordError); + } + else { + Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD_CONFIRM, { uid: this._uid, token: this._token, new_password: this.ui.textPassword.val() }); + } + } + + /** + * Checks password fields. Will provide error text if passwords no good, else null. + */ + _checkPassword() { + var password = this.ui.textPassword.val(); + var confirm = this.ui.textPasswordConfirm.val(); + if (!password) { + return "Your password cannot be empty. Come on, you must have done this before."; + } + else if (password !== confirm) { + return "Passwords do not match."; + } + return null; + } +} +ViewResetPassword.prototype.modelEvents = { + "all": "render" +}; +ViewResetPassword.prototype.ui = { + buttonSubmit: "#button-reset_password", + textPassword: "#text-password", + textPasswordConfirm: "#text-password_confirm", + textMessage: "#text-message", +}; +ViewResetPassword.prototype.events = { + "click @ui.buttonSubmit": "_handleButtonSubmit" +}; +ViewResetPassword.prototype.template = _.template($("#template-main_user_reset-password").text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js index 713390e82..9cfd0d081 100644 --- a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js +++ b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js @@ -21,6 +21,7 @@ export default class ViewUser extends Marionette.CollectionView /** @ignore */ Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_PREFERENCE_LOADED, (options) => this._handleUserPreferenceLoaded(options)); Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__MODAL_FORM_VALIDATION_ERROR, (options) => this._handleErrors(options)); + this.setElement('
    '); } /** diff --git a/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js b/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js index 24c9de11b..29ead9ef1 100644 --- a/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js +++ b/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js @@ -9,6 +9,10 @@ import Radio from 'backbone.radio'; */ export default class ViewWorkflow extends Marionette.View { + + initialize() { + this.setElement('
    '); + } /////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS /////////////////////////////////////////////////////////////////////////////////////// diff --git a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js index b877a77d2..db99e7060 100644 --- a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js +++ b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js @@ -20,6 +20,7 @@ export default class ViewControlWorkflowJob extends Marionette.View initialize(options) { this._workflow = options.workflow; + this.setElement('
    '); } /////////////////////////////////////////////////////////////////////////////////////// diff --git a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js index 7916b07e1..82d3e84dc 100644 --- a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js +++ b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js @@ -21,6 +21,7 @@ export default class ViewSettings extends Marionette.View initialize(options) { this._workflow = options.workflow; + this.setElement('
    '); } /** @@ -63,16 +64,19 @@ export default class ViewSettings extends Marionette.View var jobUuid = this.model.getJobUuid(); var collection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_JOB_COLLECTION); var job = collection.get(jobUuid); + console.log(job); + console.log(job.get('settings')); var settingsSchema = { schema: job.get('settings'), - theme: 'bootstrap3', + theme: 'barebones', disable_collapse: true, disable_edit_json: true, disable_properties: true, no_additional_properties: true, show_errors: 'always', startval: startValues, - form_name_root: ' ' + form_name_root: ' ', + onClassName: () => { return 'content-wrapper row-content'; }, }; this._editor = new JSONEditor(element, settingsSchema); } @@ -90,8 +94,8 @@ ViewSettings.prototype.modelEvents = { }; ViewSettings.prototype.ui = { buttonSave: '#button-save_workflowjob_settings' - }; +}; ViewSettings.prototype.events = { 'click @ui.buttonSave': '_handleButtonSave' - }; +}; ViewSettings.prototype.template = _.template($('#template-main_workflowjob_settings').text()); diff --git a/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js b/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js index 62e7e40b3..15866f98f 100644 --- a/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js +++ b/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js @@ -1,7 +1,6 @@ import $ from 'jquery'; import _ from 'underscore'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; -import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel'; import Marionette from 'backbone.marionette'; import Radio from 'backbone.radio'; import ViewResourceCollection from 'js/Views/Master/Main/Resource/Collection/ViewResourceCollection'; @@ -24,12 +23,16 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View */ initialize(options) { + // console.log(options); + this._projectView = options.projectView; + this._activeProject = options.activeProject; this._runJobs = options.runjobs; this._resources = options.resources; this.addRegions({ regionRunJobCollection: '#region-main_workflowrun_individual_runjobs', regionResourceCollection: '#region-main_workflowrun_individual_resources' }); + this.setElement('
    '); } /** @@ -37,34 +40,26 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View */ onRender() { - // Empty regions. - this.getRegion('regionRunJobCollection').empty(); - this.getRegion('regionResourceCollection').empty(); - - if (this.getRegion('regionRunJobCollection').el === undefined || this.getRegion('regionResourceCollection').el === undefined) { - this.getRegion('regionRunJobCollection').el = '#region-main_workflowrun_individual_runjobs' - this.getRegion('regionResourceCollection').el = '#region-main_workflowrun_individual_resources' - } + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, {projectView: this._projectView}); + Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RUNJOB_SHOWLAYOUTVIEW, {projectView: this._projectView}); // Create Resource collection view. - this._layoutViewResources = new LayoutViewModel(); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, {layoutView: this._layoutViewResources}); - this.showChildView('regionResourceCollection', this._layoutViewResources); - this._viewResourceCollection = new ViewResourceCollection({collection: this._resources, - template: _.template($('#template-main_workflowrun_individual_resources_collection').text()), - childView: ViewResourceCollectionItem}); - this._layoutViewResources.showCollection(this._viewResourceCollection); + this._viewResourceCollection = new ViewResourceCollection({ + collection: this._resources, + template: _.template($('#template-main_workflowrun_individual_resources_collection').text()), + childView: ViewResourceCollectionItem + }); // Create RunJob collection view. - this._layoutViewRunJobs = new LayoutViewModel(); - Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RUNJOB_SHOWLAYOUTVIEW, {layoutView: this._layoutViewRunJobs}); - this.showChildView('regionRunJobCollection', this._layoutViewRunJobs); - this._viewRunJobCollection = new ViewRunJobCollection({collection: this._runJobs, - template: _.template($('#template-main_runjob_collection_notitle').text()), - childView: ViewRunJobCollectionItem}); - this._layoutViewRunJobs.showCollection(this._viewRunJobCollection); + this._viewRunJobCollection = new ViewRunJobCollection({ + collection: this._runJobs, + template: _.template($('#template-main_runjob_collection_notitle').text()), + childView: ViewRunJobCollectionItem + }); - // Show Resources on default. + // Show Resource collection view by default. + // If needed, this can be changed to show RunJob collection view by default (_showRunJobs()). + // Consult with regular Rodan users and researchers before changing. this._showResources(); } @@ -76,13 +71,10 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View */ _showResources() { - this.getRegion('regionRunJobCollection').$el.hide(); - this.ui.buttonShowResources.css('text-decoration', 'underline'); - this.ui.buttonShowRunJobs.css('text-decoration', 'none'); - if (!this.getRegion('regionResourceCollection').$el.is(':visible')) - { - this.getRegion('regionResourceCollection').$el.toggle('fast'); - } + this.detachChildView('regionRunJobCollection'); + this.showChildView('regionResourceCollection', this._viewResourceCollection) + this.ui.buttonShowResources.addClass('active'); + this.ui.buttonShowRunJobs.removeClass('active'); } /** @@ -90,13 +82,11 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View */ _showRunJobs() { - this.getRegion('regionResourceCollection').$el.hide(); - this.ui.buttonShowResources.css('text-decoration', 'none'); - this.ui.buttonShowRunJobs.css('text-decoration', 'underline'); - if (!this.getRegion('regionRunJobCollection').$el.is(':visible')) - { - this.getRegion('regionRunJobCollection').$el.toggle('fast'); - } + // Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RUNJOB_SELECTED, {project: this._activeProject}); + this.detachChildView('regionResourceCollection') + this.showChildView('regionRunJobCollection', this._viewRunJobCollection) + this.ui.buttonShowRunJobs.addClass('active'); + this.ui.buttonShowResources.removeClass('active'); } /** diff --git a/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js b/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js index e2cb14aea..8e65166a3 100644 --- a/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js +++ b/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js @@ -23,9 +23,12 @@ export default class LayoutViewNavigation extends Marionette.View */ initialize() { + // Replace default Marionette wrapping div with our own div that has an ID. + this.setElement(''); + this._initializeRadio(); this.addRegions({ - regionNavigationTree: '#region-navigation_tree' + regionNavigationTree: '#project-navigation-tree' }); } @@ -237,6 +240,7 @@ export default class LayoutViewNavigation extends Marionette.View this.$el.find('#button-navigation_last').prop('disabled', false); } } + LayoutViewNavigation.prototype.template = _.template($('#template-navigation').text()); LayoutViewNavigation.prototype.ui = { buttonLogout: '#button-navigation_logout', diff --git a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js index c6de0d4a9..3dec6000f 100644 --- a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js +++ b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js @@ -15,16 +15,15 @@ export default class ViewNavigationNode extends Marionette.CollectionView /** * Initialize. */ - initialize() - { + initialize() { + this.setElement('
    '); Radio.channel('rodan-navigation').on(NAV_EVENTS.EVENT__NAVIGATION_SELECTED_NODE, event => this._handleEventNodeSelected(event)); } /** * Hide subviews on render (initially). */ - onRender() - { + onRender() { this._hideSubviews(); } @@ -34,25 +33,23 @@ export default class ViewNavigationNode extends Marionette.CollectionView /** * Sets highlight of this menu entry. */ - _setHighlight(highlight) - { - var node = $(this.$el.find('.node_text')[0]); - if (highlight) - { - // TODO magic number - node.css('background-color', '#444444'); + _setHighlight(highlight) { + const node = $(this.$el.find('.node-text')[0]); + + if (highlight) { + // adding 'highlighted' class will visually highlight the node + node.addClass('highlighted'); } - else - { - node.css('background-color', ''); + else { + // adding 'highlighted' class will visually un-highlight the node + node.removeClass('highlighted'); } } /** * Handle click. */ - _handleClick(event) - { + _handleClick(event) { this._toggleSubviews(); event.stopPropagation(); this._sendClickEvents(); @@ -61,8 +58,7 @@ export default class ViewNavigationNode extends Marionette.CollectionView /** * Toggle subview show. */ - _toggleSubviews() - { + _toggleSubviews() { var firstUl = $(this.$el.find(this.childViewContainer)[0]); if (firstUl !== undefined && firstUl.find('div').length > 0) { @@ -71,10 +67,9 @@ export default class ViewNavigationNode extends Marionette.CollectionView } /** - * Hide subvies. + * Hide subviews. */ - _hideSubviews() - { + _hideSubviews() { var firstUl = $(this.$el.find(this.childViewContainer)[0]); if (firstUl !== undefined) { @@ -85,8 +80,7 @@ export default class ViewNavigationNode extends Marionette.CollectionView /** * Show subviews. */ - _showSubviews() - { + _showSubviews() { // Show subviews. var firstUl = $(this.$el.find(this.childViewContainer)[0]); if (firstUl !== undefined) @@ -98,8 +92,7 @@ export default class ViewNavigationNode extends Marionette.CollectionView /** * Expand parent. */ - _expandParent() - { + _expandParent() { // Show parents. if (this._parent !== null && this._parent !== undefined && this._parent instanceof ViewNavigationNode) { @@ -111,24 +104,25 @@ export default class ViewNavigationNode extends Marionette.CollectionView /** * Does highlighting. */ - _handleEventNodeSelected(event) - { + _handleEventNodeSelected(event) { if (this === event.node) { this._setHighlight(true); this._expandParent(); } - else + // we don't want to unhighlight the root node + // it should always remain the color of the primary app color + else /// if (!(event.node instanceof ViewNavigationNodeRoot)) { this._setHighlight(false); } } } ViewNavigationNode.prototype.ui = { - text: '.node_text' + text: '.node-text' }; ViewNavigationNode.prototype.events = { 'click @ui.text': '_handleClick' }; ViewNavigationNode.prototype.template = _.template($('#template-navigation_node').text()); -ViewNavigationNode.prototype.childViewContainer = 'ul'; +ViewNavigationNode.prototype.childViewContainer = '.navigation-tree-child-view-container'; diff --git a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js index 50999da95..4e6050b4f 100644 --- a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js +++ b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js @@ -31,9 +31,18 @@ export default class ViewNavigationNodeRoot extends ViewNavigationNode { Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_SELECTED_COLLECTION); } + + /** + * Handle click. + * We don't want to toggle subviews here, so we override the parent method. + */ + _handleClick(event) { + event.stopPropagation(); + this._sendClickEvents(); + } } ViewNavigationNodeRoot.prototype.ui = { - text: '.node_text' + text: '#my-projects-btn' }; ViewNavigationNodeRoot.prototype.events = { 'click @ui.text': '_handleClick' diff --git a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js index 26ad51a28..d2808d061 100644 --- a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js +++ b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js @@ -1,5 +1,5 @@ -import $ from 'jquery'; -import _ from 'underscore'; +import $ from 'jquery'; +import _ from 'underscore'; import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS'; import NAV_EVENTS from './Events'; import Radio from 'backbone.radio'; @@ -47,4 +47,4 @@ export default class ViewNavigationNodeRunJobs extends ViewNavigationNode } } } -ViewNavigationNodeRunJobs.prototype.template = _.template($('#template-navigation_runjobs').text()); +ViewNavigationNodeRunJobs.prototype.template = _.template($('#template-navigation_runjobs').text()); diff --git a/rodan-client/code/src/js/WorkflowBuilderGUI.js b/rodan-client/code/src/js/WorkflowBuilderGUI.js index 5c4e97035..9523990da 100644 --- a/rodan-client/code/src/js/WorkflowBuilderGUI.js +++ b/rodan-client/code/src/js/WorkflowBuilderGUI.js @@ -73,7 +73,7 @@ class WorkflowBuilderGUI "GRID": { "DIMENSION": 20, - "LINE_COLOR": "#606060", + "LINE_COLOR": "#9e9e9ec7", "LINE_WIDTH": 0.5 }, "DATABASE_COORDINATES_MULTIPLIER": 1500, // Legacy workflows stored coordinates in the database differently. This is to maintain backwards compatibility. @@ -98,6 +98,7 @@ class WorkflowBuilderGUI "STROKE_COLOR_SELECTED": "#0000ff", "STROKE_WIDTH_SELECTED": 2, "CONNECTION_CIRCLE_RADIUS": 4, + "CONNECTION_PADDING": 5, "HOVER_TIME": 1000, "LOCAL_STORAGE_ITEMS": ['scroll', 'zoom'] } @@ -121,10 +122,13 @@ class WorkflowBuilderGUI { var view = new LayoutViewWorkflowBuilder({model: this.getWorkflow()}); Radio.channel('rodan').request(Rodan.RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: view}); - this._menuItems = [{label: 'Edit Name/Description', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOW_VIEW, options: {workflow: this.getWorkflow()}}, - {label: 'Add Job', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_JOBCOLLECTION_VIEW, options: {workflow: this.getWorkflow()}}, - {label: 'Import Workflow', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOWCOLLECTION_VIEW, options: {workflow: this.getWorkflow()}}, - {label: 'Run', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN, options: {workflow: this.getWorkflow()}}]; + this._menuItems = [ + { label: 'Edit Name/Description', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOW_VIEW, options: { workflow: this.getWorkflow() } }, + { label: 'Add Job', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_JOBCOLLECTION_VIEW, options: { workflow: this.getWorkflow() } }, + { label: 'Import Workflow', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOWCOLLECTION_VIEW, options: { workflow: this.getWorkflow() } }, + { label: 'Clear Assigned Resources', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS, options: { workflow: this.getWorkflow() } }, + { label: 'Run', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN, options: { workflow: this.getWorkflow() } } + ]; } /** @@ -136,7 +140,7 @@ class WorkflowBuilderGUI this._multipleSelectionKey = Rodan.Environment.getMultipleSelectionKey(); this._line = null; this._zoomRate = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].ZOOM_RATE; - this._itemController = new ItemController(); + this._itemController = new ItemController({ workflow: this._workflow }); paper.handleMouseEvent = event => this._itemController.handleMouseEvent(event); window.addEventListener('keydown', (e) => { @@ -219,6 +223,8 @@ class WorkflowBuilderGUI { paper.install(window); paper.setup(canvasElementId); + new paper.Layer({ name: 'connections' }); + new paper.Layer({ name: 'default' }); paper.view.onFrame = (event) => this._handleFrame(event); this.drawGrid = drawGrid; this.drawGrid(Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].GRID, paper); @@ -515,7 +521,7 @@ class WorkflowBuilderGUI { const boundingBox = this._getWorkflowBoundingBox(); if (boundingBox) { - const workflowCenter = this._getWorkflowCenter(boundingBox); + const workflowCenter = this._getBoundingBoxCenter(boundingBox); paper.view.center = workflowCenter; const width = boundingBox.bottomRight.x - boundingBox.topLeft.x + 2 * Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].WORKFLOW_PADDING; const height = boundingBox.bottomRight.y - boundingBox.topLeft.y + 2 * Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].WORKFLOW_PADDING; @@ -539,34 +545,48 @@ class WorkflowBuilderGUI return Math.min(Math.max(zoom, Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].ZOOM_MIN), Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].ZOOM_MAX); } + /** + * Calculates the bounding box given a list of workflow jobs. + * @param {WorkflowJob[]} workflow_jobs - The workflow jobs to calculate the bounding box for. + * @returns the bounding box of the workflow jobs or null if no workflow_jobs are provided. + */ + _getBoundingBox(workflow_jobs) + { + if (!workflow_jobs) return null; + let minX, maxX, minY, maxY; + workflow_jobs.forEach(job => { + const { x, y } = job.get('appearance'); + minX = minX === undefined || x < minX ? x : minX; + maxX = maxX === undefined || x > maxX ? x : maxX; + minY = minY === undefined || y < minY ? y : minY; + maxY = maxY === undefined || y > maxY ? y : maxY; + }); + const topLeft = { x: minX, y: minY }; + const bottomRight = { x: maxX, y: maxY }; + return { topLeft, bottomRight }; + } + /** * Calculate the bounding box of the workflow in paper.js project coordinates. * @returns {{topLeft: {x: number, y: number}, bottomRight: {x: number, y: number}} | null} The bounds of the workflow in paper.js project coordinates or null if there are no jobs. */ _getWorkflowBoundingBox() { - let minX, maxX, minY, maxY; if (this._workflow && this._workflow.get('workflow_jobs').length > 0) { - this._workflow.get('workflow_jobs').forEach(job => { - const { x, y } = job.get('appearance'); - minX = minX === undefined || x < minX ? x : minX; - maxX = maxX === undefined || x > maxX ? x : maxX; - minY = minY === undefined || y < minY ? y : minY; - maxY = maxY === undefined || y > maxY ? y : maxY; - }); - const topLeft = BaseItem.appearanceToProject({ x: minX, y: minY }); - const bottomRight = BaseItem.appearanceToProject({ x: maxX, y: maxY }); + const boundingBox = this._getBoundingBox(this._workflow.get('workflow_jobs')); + const topLeft = BaseItem.appearanceToProject(boundingBox.topLeft); + const bottomRight = BaseItem.appearanceToProject(boundingBox.bottomRight); return { topLeft, bottomRight }; } return null; } /** - * Calculates the paper.js project coordinates of the center of the workflow. - * @param {{topLeft: {x: number, y: number}, bottomRight: {x: number, y: number}} | null} boundingBox The bounding box of the workflow in paper.js project coordinates. - * @return {{x: number, y: number} | null} The center of the workflow in paper.js project coordinates or null if no bounding box is provided. + * Calculates the center of a bounding box. + * @param {{topLeft: {x: number, y: number}, bottomRight: {x: number, y: number}} | null} boundingBox The bounding box. + * @return {{x: number, y: number} | null} The center of the bounding box or null if no bounding box is provided. */ - _getWorkflowCenter(boundingBox) + _getBoundingBoxCenter(boundingBox) { return boundingBox ? { x: (boundingBox.topLeft.x + boundingBox.bottomRight.x) / 2, y: (boundingBox.topLeft.y + boundingBox.bottomRight.y) / 2 } : null; } @@ -578,9 +598,7 @@ class WorkflowBuilderGUI */ _handleGetNewJobPosition() { - const x = this._rightClickPosition === null ? paper.view.center.x : this._rightClickPosition.x; - const y = this._rightClickPosition === null ? paper.view.center.y : this._rightClickPosition.y; - const position = { x, y}; + const position = this._rightClickPosition == null ? paper.view.center : this._rightClickPosition; return BaseItem.projectToAppearance(position); } diff --git a/rodan-client/code/styles/default.css b/rodan-client/code/styles/default.css index e2c4504be..5e44366bd 100644 --- a/rodan-client/code/styles/default.css +++ b/rodan-client/code/styles/default.css @@ -1,12 +1,49 @@ /** * Styles for Rodan client. + * + * ------------------------------------ + * PLEASE READ BEFORE MAKING CHANGES!!! + * ------------------------------------ + * + * ----------- + * Terminology + * ----------- + * + * Navigation region: + * The region that displays the Rodan logo, status bar, navigation tree, + * and a button menu at the bottom. + * + * Main region: + * The region that displays project information, + * resource information, allows for resource creation, project-name modification etc. + * + * Whenever a user selects anything in the navigation tree within the nagivation region, + * The main region's content will be dynamically updated. + * */ /************************************************************************************** * General parameters *************************************************************************************/ + /* Set values for variables used throughout the stylesheet */ :root { + /* Navigation tree area */ + --navigation-node-color: #939393; + + /* Status area */ + --background-color-status: #000000; + --text-color-status-user: #cccccc; + --text-color-status-user: #cccccc; + --text-color-status-server: #cccccc; + + --primary-app-color: #7ab2b7; + --secondary-app-color: #589ed5; + --text-color-navigation: white; + --app-font: Montserrat, sans-serif; + --btn-remove-color: #E76B6B; + --btn-save-color: #EB9E3E; + /* Navigation area */ --background-color-navigation: #000000; --text-color-navigation: #cccccc; @@ -21,7 +58,7 @@ --background-color-main: #ffffff; /* WorkflowBuilder area */ - --background-color-workflowbuilder-workspace: #dddddd; + --background-color-workflowbuilder-workspace: #f2f2f2; --background-color-workflowbuilder-menu: #000000; --text-color-workflowbuilder-menu: #ffffff; @@ -35,77 +72,791 @@ --height-gui: 100; /* % of vertical space in GUI viewport */ --height-gui_menu: 4; /* % of vertical space in GUI viewport for menu */ --size-font: 11px; /* pixels */ + --font-weight: 100; } +/* ------------------------------------ */ +/* General styles +/* ------------------------------------ */ -/* General classes */ +/* + * General styles (especially .content-wrapper styles) are used EVERYWHERE. + * If you modify these styles, it will affect a lot of the UI throughout the whole website. + * PLEASE MAKE SURE YOU KNOW WHAT YOU'RE DOING! + */ + +* { + box-sizing: border-box; +} .text-small { font-size: x-small; } +body { + width: 100vw; + height: 100vh; + font-family: var(--app-font); + font-size: var(--size-font); + font-weight: var(--font-weight); + margin: 0px; + overflow: hidden; +} +input, select { + border: 1px solid #cecece; + border-radius: 3px; + font-family: Montserrat, sans-serif; + padding: 2px; + box-sizing: border-box; + flex-grow: 1; + outline: none; +} +textarea { + border: 1px solid #cecece; + height: 50px; + width: 100%; + resize: vertical; + box-sizing: border-box; + border-radius: 3px; + outline: none; +} + +/* Table styles */ +table { + user-select: none; + text-align: left; + width: 98%; + border-collapse: collapse; + border-spacing: 0; + height: fit-content; + font-size: 15px; +} +thead { + background-color: #ecf0f5; + position: sticky; + top: 0px; +} +th, td { + cursor: pointer; + padding: 10px; +} +td { + border-top: 1px solid rgb(215 215 215); +} +tr { + cursor: default; +} +th { + font-weight: 400; + text-align: left; + text-wrap: nowrap; +} +hr { + border: 1px solid #e5e5e5; + width: 100%; +} +tbody > tr:hover { + background-color: var(--secondary-app-color); + color: white; + cursor: pointer; +} +/* flex content alignment */ +.content-wrapper { + display: flex; + align-items: center; + width: 100%; + height: 100%; +} +.content-wrapper.column-content { + flex-direction: column; +} +.content-wrapper.row-content { + flex-direction: row; +} +/* flex horizontal alignment */ +.column-left { + align-items: flex-start; +} +.row-left { + justify-content: flex-start; +} +.column-center { + align-items: center; +} +.row-center { + justify-content: center; +} +.column-right { + align-items: flex-end; +} +.row-right { + justify-content: flex-end; +} +/* flex vertical alignment */ +.column-top { + justify-content: flex-start; +} +.row-top { + align-items: flex-start; +} +.column-middle { + justify-content: center; +} +.row-middle { + align-items: center; +} +.column-bottom { + justify-content: flex-end; +} +.row-bottom { + align-items: flex-end; +} +/* flex gap */ +.flex-gap-5 { + gap: 5px; +} +.flex-gap-10 { + gap: 10px; +} +.flex-gap-20 { + gap: 20px; +} +.flex-gap-30 { + gap: 30px; +} +/* padding */ +.padding-5 { + padding: 5px; +} +.padding-10 { + padding: 10px; +} +.padding-20 { + padding: 20px; +} +.padding-30 { + padding: 30px; +} +/* positioning */ +.pos-absolute { + position: absolute; +} +.pos-relative { + position: relative; +} +.pos-fixed { + position: fixed; +} +.pos-static { + position: static; +} +/* text */ +.text-nowrap { + text-wrap: nowrap; +} +.overflow-scroll { + overflow: scroll; +} +.overflow-auto { + overflow: auto; +} +.overflow-hidden { + overflow: hidden; +} +/* buttons */ +.btn { + display: flex; + justify-content: center; + align-items: center; + outline: none; + border: none; + cursor: pointer; + padding: 0.3vh; + border-radius: 3px; + box-sizing: border-box; + color: white; + background-color: var(--secondary-app-color); + border: 1px solid var(--secondary-app-color); +} +.btn:hover { + background-color: white; + color: var(--secondary-app-color); +} +.btn.btn-delete, .btn.btn-remove, .btn.btn-logout { + color: white; + background-color: var(--btn-remove-color); + border: 1px solid var(--btn-remove-color); +} +.btn.btn-delete:hover, .btn.btn-remove:hover, .btn.btn-logout:hover { + color: var(--btn-remove-color); + background-color: white; +} +.btn.save-btn { + color: white; + background-color: var(--btn-save-color); + border: 1px solid var(--btn-save-color); +} +.btn.save-btn:hover { + background-color: white; + color: var(--btn-save-color); +} +:disabled +{ + color: white !important; + background: #dddddd !important; + border: 1px solid #dddddd !important; + cursor: not-allowed !important; +} +:disabled:hover +{ + background: #dddddd !important; + border: 1px solid #dddddd !important; + color: white !important; +} +/* dropdowns */ +.dropdown { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + position: relative; +} +.dropdown-toggle { + height: 100%; + display: flex; + align-items: center; + justify-content: flex-start; + cursor: pointer; +} +.dropdown-menu { + display: none; + position: absolute; + top: 100%; + left: -15%; + width: fit-content; + min-width: 150px; + height: fit-content; + background-color: white; + color: black; + box-sizing: border-box; + box-shadow: 0px 5px 5px 1px #00000057; + border-radius: 0px 0px 3px 3px; +} +.dropdown-menu.context-menu { + box-shadow: 0px 0px 5px 1px #00000057; + border-radius: 3px; +} +.dropdown-btn { + display: flex; + width: 100%; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + padding: 10px; + font-size: 13px; + text-wrap: nowrap; + cursor: pointer; +} +.dropdown-btn:hover { + color: white; + background-color: var(--primary-app-color); +} -/* Navigation region */ -div#region-navigation -{ - background: var(--background-color-navigation); +/* ------------------------------------ */ +/* General styles end +/* ------------------------------------ */ + + + + +#app { + width: 100%; height: 100%; - color: var(--text-color-navigation); +} +#app-content-wrapper { + justify-content: center; + align-items: center; +} + +/* /////////////////////////////////////////////////////////////////////////////////////// +// Navigation region +/////////////////////////////////////////////////////////////////////////////////////// */ + +#region-navigation { + background: #0000000f; + width: 16.66666667%; + color: var(--navigation-node-color); overflow-y: auto; overflow-x: hidden; - cursor: default; + z-index: 999; + justify-content: center; +} +#region-navigation .node-text { + cursor: pointer; +} +#navigation-panel-content-wrapper { + justify-content: center; + width: 92%; +} +#app-navbar { + height: 99%; + justify-content: space-between; } -div#region-navigation ul -{ - list-style-type: disc; - margin: 0; - padding-left: 10px; +/* Logo and requests status styles */ +#rodan-logo { + font-size: 35px; + display: flex; + align-items: flex-start; + color: var(--primary-app-color); + height: 45px; +} +#requests-status { + color: var(--primary-app-color); + height: 10%; + align-items: flex-start; } -div#region-navigation div.node_text -{ +/* Project navigation tree styles */ +.navigation-tree-node { cursor: pointer; } - -.workflow-name, .workflow-status { - color: #9d9d9d; - line-height: 20px; - padding: 15px; - margin: 0; - display: block; +.navigation-tree-node:hover { + background-color: var(--primary-app-color); + color: white; +} +#my-projects-btn { + font-size: 15px; + padding-top: 5px; + padding-bottom: 5px; +} +#my-projects-btn:hover { + background-color: var(--primary-app-color); + color: white; +} +#project-navigation-tree { + list-style-type: disc; +} +.navigation-tree-child-view-container { + display: flex; + flex-direction: column; + align-items: flex-end; + width: 90%; + padding-left: 5px; + border-left: 2px solid #69a3a870; +} +.navigation-tree-child-view-container.no-indent { + width: 100%; + border: none; + padding: 0; +} +.btn-group.main-navbar-btn-group { + flex-wrap: wrap; + justify-content: flex-start; + align-items: stretch; + gap: 3px; +} +.node-text { + font-size: 15px; + width: 100%; + padding: 3px; +} +.node-text:hover { + background-color: var(--primary-app-color); + color: white; +} +.node-text.highlighted { + background-color: var(--primary-app-color); + color: white; +} +.node-text.project { + margin-top: 7px; + margin-bottom: 4px; +} +.node-text.project-child { + margin-top: 3px; + margin-bottom: 3px; } -.workflow-name { - float: left; - height: 50px; - font-size: 18px; - margin-left: -15px; +/* main navbar buttons */ +#navigation-panel-btns { + height: auto; +} +.btn.main-navbar-btn { + background-color: white; + outline: none; + border: 1px solid #dedede; + color: var(--primary-app-color); + border-radius: 3px; + flex-grow: 1; + min-height: 25px; } +.btn.main-navbar-btn:hover { + background-color: var(--primary-app-color); + color: white; +} +.btn.main-navbar-btn#button-navigation_logout { + color: #E76B6B; +} +.btn.main-navbar-btn#button-navigation_logout:hover { + background-color: #E76B6B; + color: white; +} + + +/* /////////////////////////////////////////////////////////////////////////////////////// +// Main region +/////////////////////////////////////////////////////////////////////////////////////////*/ -/* Main region */ -div#region-main +/* Main region general styles */ +#region-main { - /*background-image: url("resources/rodan.jpg"); */ - background-repeat: no-repeat; + Background-repeat: no-repeat; background-position: center center; - height: 100%; + width: 83.33333333%; overflow-y: auto; overflow-x: hidden; - cursor: default; + flex-grow: 1; + justify-content: center; +} +#region-main-content-wrapper { + gap: 15px; +} +.region-main-section { + width: 100%; +} +/* Main region header */ +.region-main-section.region-main-header { + width: 100%; + height: 40px; + justify-content: space-between; + border-bottom: 2px solid #e5e5e5; +} +#region-main-header { + width: 98%; + justify-content: space-between; +} +.region-main-content-title { + font-size: 15px; + font-weight: 100; +} +.region-main-default-btn { + border: none; + background-color: var(--secondary-app-color); + border: 1px solid var(--secondary-app-color); + color: white; + border-radius: 3px; + padding: 5px; + font-family: Montserrat, sans-serif; + cursor: pointer; +} +.region-main-default-btn:hover { + background-color: white; + color: var(--secondary-app-color); +} +/* Table controls */ +.region-main-section.table-control { + height: fit-content; + justify-content: center; + align-items: center; } -/* Canvas */ -div#canvas-wrap -{ +/* Table controls: table filtering */ +#table-filters-header-container { + height: fit-content; +} +#filter-inputs-dropdown-btn { + width: 25px; + cursor: pointer; +} +#filter-inputs-dropdown-btn.open { + transform: rotate(180deg); +} +.region-main-section.table-control.filters { + background-color: #fafafa; + padding: 8px; + gap: 3px; + box-sizing: border-box; + border: 1px solid #d7d7d7; + border-radius: 5px; +} +#clear-filters-btn-wrapper { + width: auto; + height: 100%; +} +#button-clearall { + height: 100%; + max-height: 25px; +} +#filter-inputs-wrapper { + gap: 10px; height: 100%; overflow: hidden; - padding: 0px; + box-sizing: border-box; +} +#filter-inputs-wrapper.hidden { + display: none; +} +#filter-inputs-title { + width: 100%; + font-size: 12px; +} +#filter-inputs { + display: flex; + flex-direction: row; + gap: 10px; + flex-wrap: wrap; + height: fit-content; + align-items: center; + justify-content: flex-start; +} +.filter-input-wrapper { + width: fit-content; + align-items: flex-start; + background-color: #488bcb12; + border-radius: 3px; + /* border: 1px solid #e5e5e5; */ + gap: 3px; + font-size: 12px; + font-weight: 500; + box-sizing: border-box; + padding: 7px; + color: var(--secondary-app-color); + flex: 1; +} +.filter-values-wrapper { + gap: 5px; +} + +/* pagination controls styles */ +.region-main-section.table-control.pagination { + display: flex; + flex-direction: row; + justify-content: flex-start; + width: 98%; + gap: 5px; +} +#table-pagination-controls-wrapper { + display: flex; + flex-direction: row; + width: fit-content; + border-radius: 3px; + overflow: hidden; +} +.pagination-btn { + color: white; + background-color: var(--secondary-app-color); + padding: 3px; + box-sizing: border-box; +} + +/* ----------------------- */ +/* Individual project view */ +/* ----------------------- */ +.region-main-content { + overflow: auto; + height: 96%; +} +.individual-project-view { + display: flex; +} +.table-responsive { + border: 1px solid #dfdfdf; + border-radius: 5px; + background-color: #f0f0f047; + height: fit-content; + width: 100%; + overflow-x: auto; + max-height: 1000px; +} +.project-collections { + gap: 25px; + padding-top: 20px; + box-sizing: border-box; + width: 85%; + border-right: 2px solid #dfdfdf; +} +.project-navigation-bar { + height: 25px; + display: flex; + justify-content: space-around; + border-bottom: 2px solid #f0f0f0; + width: 90%; + box-sizing: border-box; +} +.project-nav-bar-btn { + background-color: transparent; + font-size: 15px; + color: grey; + border-radius: 0px; + border: none; + padding: 2px; +} +.project-nav-bar-btn:hover { + color: var(--primary-app-color); + background-color: transparent; +} +.project-nav-bar-btn.active { + border-bottom: 3px solid var(--primary-app-color); +} +#region-collection-container { + height: 94%; + display: flex; + border-radius: 3px; +} +.single-project-view-collection-wrapper { + gap: 10px; +} +.resource-upload-container { + height: fit-content; + gap: 10px; +} +.main-region-action-btn { + padding: 5px; + border-radius: 3px; + background-color: var(--secondary-app-color); + border: 1px solid var(--secondary-app-color); + color: white; + font-size: 13px; + cursor: pointer; + font-weight: 400; +} +.main-region-action-btn:hover { + background-color: white; + color: var(--secondary-app-color); +} + +/* Workflows collection page */ +#new-workflow-btns-container { + height: fit-content; + gap: 5px; + width: 98%; +} + + +/* Project and collection details panels */ +.detail-panels-container { + width: 25%; + box-sizing: border-box; +} +.details-panel { + box-sizing: border-box; + border-bottom: 2px solid #dfdfdf; + font-size: 13px; + display: flex; + justify-content: space-between; + /* height: 50%; */ +} +#region-project-details-panel, #region-collection-item-details-panel { + height: 50%; } +.details-panel-title-section { + background-color: #f2f2f2; + height: 40px; +} +.details-panel-details-section { + /* height: 80%; */ + gap: 10px; + overflow: auto; + flex-grow: 1; +} +.details-panel-action-btns-section { + height: 5vh; + gap: 5px; + border-top: 2px solid #f2f2f2; + overflow-x: auto; + overflow-y: hidden; + padding: 5px; +} +.details-item-container { + height: fit-content; + align-items: flex-start; + gap: 7px; +} +.content-wrapper.row-content.details-item-container { + align-items: center; + height: fit-content; +} +.details-item-value { + overflow-wrap: anywhere; + background-color: whitesmoke; + padding: 3px; + border-radius: 3px; + box-sizing: border-box; +} +#select-resourcetype { + width: 100%; +} +/* Individual workflow runs page */ +#individual-workflow-run-container { + border-radius: 5px; + overflow: hidden; +} +#workflow-run-details-and-action-btns-container { + border: 1px solid #efefef; + height: 30%; +} +#workflow-run-resources-and-run-jobs-container { + border: 1px solid #efefef; + height: 64%; +} +#workflow-run-collections-wrapper { + height: fit-content; + padding-top: 10px; +} +#region-main_workflowrun_individual_resources { + padding-top: 20px; +} +#region-main_workflowrun_individual_resources, #region-main_workflowrun_individual_runjobs { + height: fit-content; + max-height: 82%; +} + -div#canvas-tooltip +/*////////////////////////////////////////////////////////////////////////////////////// +// Canvas +/////////////////////////////////////////////////////////////////////////////////////// */ +#workflow-builder-container { + border-left: 2px solid #69a3a8; + box-sizing: border-box; +} +#workflow-builder-navbar { + height: 50px; + color: white; + background-color: #69a3a8; + position: static; +} +#worlkflow-builder-navbar-content-wrapper { + gap: 5vw; + padding: 0px 2vw; +} +#navbar-header { + display: flex; + align-items: center; + width: fit-content; +} +#navbar-workflow-name { + font-size: 20px; + text-wrap: nowrap; +} +#data-workflow_status { + text-wrap: nowrap; +} +#workflow-builder-navbar-btns-wrapper { + gap: 3vw; + font-size: 13px; +} +#canvas-wrap +{ + /* flex-grow: 0.9; */ + overflow: hidden; + padding: 0px; + height: 100%; + /* height: -webkit-fill-available; */ +} +#canvas-tooltip { position: fixed; background-color: #ffff88; @@ -115,111 +866,181 @@ div#canvas-tooltip border-style: solid; border-width: 2px; width: auto; - visibility: visible; + visibility: hidden; display: inline-block; } - canvas#canvas-workspace { background-color: var(--background-color-workflowbuilder-workspace); padding: 0px; } - canvas[resize] { width: 100%; height: 100%; } - /* Input fields */ -textarea[type=text] -{ - height: 200px; - width: 100%; - resize: vertical; -} - .vertical-center { height: calc(var(--height-top) * 1%); /*fallback */ height: calc(var(--height-top) * 1vh); display: flex; align-items: center; } - .horizontal-center { width: 100%; text-align: center; } - -body -{ - overflow: hidden; - font-family: Arial, Helvetica, sans-serif; - font-size: var(--size-font); -} - -div.fixed_individual { - /*position: fixed;*/ - width: 100%; -} - div.top { height: calc(var(--height-top) * 1%); /*fallback */ height: calc(var(--height-top) * 1vh); } - div.gui { height: calc(var(--height-gui) * 1%); /*fallback*/ height: calc(var(--height-gui) * 1vh); display: flex; flex-direction: column; } - div#main_workflowbuilder { background-color: white; height: 100%; overflow: auto; } - .instruction { font-style: italic; } -:disabled -{ - background: #dddddd; +/* ------------------------------------ */ +/* ----------- Modal Styles ----------- */ +/* ------------------------------------ */ + +@keyframes fade-in { + from {opacity: 0;} + to {opacity: 1;} } -/* Modals */ +/* general modal styles */ +#modal-generic { + position: absolute; + width: initial; + height: initial; + max-width: 1200px; + min-width: 500px; + background-color: #ffffff90; + box-shadow: 0px 0px 5000px 5000px #0000005c; + z-index: 9999; + border-radius: 5px; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + overflow: hidden; + display: none; + animation: fade-in 0.2s ease-in-out forwards; +} +.modal-dialog { + width: fit-content; + height: fit-content; + border-radius: 3px; + position: relative; + overflow: hidden; + background-color: white; + backdrop-filter: blur(20px); + min-width: 500px; + max-width: 100%; + /* min-height: 300px; */ +} +.modal-header { + align-items: center; + justify-content: space-between; + padding: 10px; + box-sizing: border-box; + background-color: #488bcb; + color: white; + font-size: 15px; + height: 40px; +} +.modal-close { + cursor: pointer; +} .modal-body { max-height: 600px; overflow-y: auto; + padding: 20px; + box-sizing: border-box; + font-size: 12px; } - -.modal-content -{ - opacity: 1 !important; +.modal-body-section { + align-items: flex-start; } - -.modal-backdrop -{ - opacity: 0.3 !important; +.modal-subtitle-container { + height: 30px; +} +.modal-subtitle { + font-size: 13px; + font-weight: bold; } - .modal-footer { - text-align: left !important; + padding: 10px; + max-height: 40px; + height: fit-content; } - -.modal-footer-error +.modal-footer-error, .modal-input-error { color: #aa0000; } +.modal-body-section-left { + align-items: flex-start; +} + +/* project-users modal styles */ +#admins-and-workers-tables { + align-items: flex-start; + gap: 25px; + + .table-responsive { + width: 100%; + } +} + +/* user preferences modal */ +#checkbox-send_email { + flex-grow: 0; /* overwrite general input element styles (which have flex-grow value of 1) */ +} + +/* resource assignment modal */ +#resource-assignment-actions-container { + height: fit-content; + padding: 5px; + border: 1px solid #cecece; + border-radius: 3px; + background-color: #f9f9f9; + max-width: 150px; +} + +/* job settings modal */ +#workflowjob-settings:first-child { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +#workflowjob-settings { + +} + +.this-is-my-class { + background-color: green; +} + + + +/* ------------ */ +/* Table styles */ +/* ------------ */ -/* Table overrides */ /** * Make text in table unselectable. This helps make multiple selection look better. */ @@ -241,17 +1062,9 @@ table .table tr.clickable-row.active td { - background-color: #93DB70; -} - -div.table-control -{ - width: 100%; - padding-left: 10px; - padding-right: 10px; + background-color: var(--secondary-app-color); } - -div.table-control span +.table-control span { display:inline-block; font-size: var(--size-font); @@ -290,4 +1103,35 @@ table.scroll overflow-x: hidden; } -.tags-input{display:inline-block;padding:0 2px;background:#FFF;border:1px solid #CCC;width:16em;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.tags-input .tag{display:inline-block;background:#EEE;color:#444;padding:0 4px;margin:2px;border:1px solid #CCC;border-radius:2px;font:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;transition:all .1s ease}.tags-input .tag.selected{background-color:#777;border-color:#777;color:#EEE}.tags-input .tag.dupe{-webkit-transform:scale3d(1.2,1.2,1.2);transform:scale3d(1.2,1.2,1.2);background-color:#FCC;border-color:#700}.tags-input input{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:inline-block!important;padding:3px;margin:0!important;background:0 0!important;border:none!important;box-shadow:none!important;font:inherit!important;font-size:100%!important;outline:0!important}.tags-input .selected~input{opacity:.3} +/* Styles for smaller devices */ +@media screen and (max-width: 768px) { + /* .rodan-region { + width: 100%; + } + #region-navigation { + height: 7%; + width: 100%; + overflow: hidden; + } + #app-navbar { + height: 100%; + width: 100%; + flex-direction: column; + } + .navbar-section.main-navbar-section { + width: 98%; + } + #rodan-logo { + height: 100%; + justify-content: center; + } + .navbar-sections-wrapper { + display: none; + } + #region-main { + height: 93%; + width: 100%; + } */ +} + +.tags-input{display:inline-block;padding:0 2px;background:#FFF;border:1px solid #CCC;width:16em;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.tags-input .tag{display:inline-block;background:#EEE;color:#444;padding:0 4px;margin:2px;border:1px solid #CCC;border-radius:2px;font:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;transition:all .1s ease}.tags-input .tag.selected{background-color:#777;border-color:#777;color:#EEE}.tags-input .tag.dupe{-webkit-transform:scale3d(1.2,1.2,1.2);transform:scale3d(1.2,1.2,1.2);background-color:#FCC;border-color:#700}.tags-input input{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:inline-block!important;padding:3px;margin:0!important;background:0 0!important;border:none!important;box-shadow:none!important;font:inherit!important;font-size:100%!important;outline:0!important}.tags-input .selected~input{opacity:.3} \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html b/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html index ea4b38f1f..a2e23f0e8 100644 --- a/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html +++ b/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html @@ -1,2 +1,2 @@ <%= label %> - \ No newline at end of file + \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html index 82358e747..d94c3dda2 100644 --- a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html @@ -4,6 +4,7 @@

    Input Port Types

    Name + Current Min Max diff --git a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html index ece49558a..67ef0f0e4 100644 --- a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html +++ b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html @@ -1,4 +1,7 @@ <%= name %> +<%= current %> <%= minimum %> <%= maximum %> - \ No newline at end of file + + + \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_activation-required.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_activation-required.html new file mode 100644 index 000000000..44cd46723 --- /dev/null +++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_activation-required.html @@ -0,0 +1,7 @@ +
    +

    An activation email has been send to the email you registered with. Please check your inbox to verify your account before you sign in.

    +
    +
    + +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_forgot-password.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_forgot-password.html new file mode 100644 index 000000000..7a72acce0 --- /dev/null +++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_forgot-password.html @@ -0,0 +1,11 @@ +
    +

    Please enter your email. If there is an account associated with the email address, you will receive a link to reset your password.

    + + + +
    +
    +
    + +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html index ebea17db8..a23fe9a21 100644 --- a/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html +++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html @@ -2,7 +2,7 @@
    -
    +
    @@ -12,6 +12,8 @@
    + +
    diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_register.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_register.html new file mode 100644 index 000000000..26b17df21 --- /dev/null +++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_register.html @@ -0,0 +1,24 @@ +
    + + + + + + + + + + + + + + + + +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html b/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html index ea4b38f1f..a2e23f0e8 100644 --- a/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html +++ b/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html @@ -1,2 +1,2 @@ <%= label %> - \ No newline at end of file + \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html index a28a295da..2877440a3 100644 --- a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html @@ -4,6 +4,7 @@

    Output Port Types

    Name + Current Min Max diff --git a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html index 7ea4ebb5f..063588554 100644 --- a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html +++ b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html @@ -1,4 +1,7 @@ <%= name %> +<%= current %> <%= minimum %> <%= maximum %> - \ No newline at end of file + + + \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html b/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html index 026e79816..12a32e405 100644 --- a/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html @@ -1,20 +1,26 @@ -

    Projects

    - -
    -
    - - - - - - - - - - - - - - -
    NameCreatorCreatedUpdatedResourcesResource ListsWorkflows
    +
    +
    +
    My Projects
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + +
    NameCreatorCreatedUpdatedResourcesResource ListsWorkflows
    +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html index 660e0d320..cc6ef5e97 100644 --- a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html +++ b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html @@ -1,20 +1,83 @@ -
    -

    Project

    - - - - - Creator: <%= creator %>
    - Created on: <%= _.formatFromUTC(created) %>
    - Updated on: <%= _.formatFromUTC(updated) %>
    - URL: <%= url %>
    -
    - - - - - - - +
    +
    +
    +
    My Projects / <%= name %>
    +
    +
    + +
    + +
    +
    + + + + + +
    + +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    PROJECT DETAILS
    +
    +
    + + +
    +
    + + +
    + +
    + + +
    + +
    +
    Creator:
    +
    <%= creator %>
    +
    + +
    +
    Created on:
    +
    <%= _.formatFromUTC(created) %>
    +
    + +
    +
    Updated on:
    +
    <%= _.formatFromUTC(updated) %>
    +
    + +
    +
    URL:
    +
    <%= url %>
    +
    +
    + + +
    + + + +
    +
    +
    + + +
    + +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html index 13a17847a..17272c060 100644 --- a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html +++ b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html @@ -1,28 +1,22 @@ -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    +
    +
    Select a user and add them as an admin or worker
    +
    +
    +
    + + +
    -
    -
    -

    Admins

    +
    +
    +
    -
    -

    Workers

    +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html b/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html index 241172a40..78bc4b168 100644 --- a/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html @@ -1,12 +1,12 @@ -

    Resources

    - - -
    -
    +
    + + +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html index 7bd728ddc..ee33a8199 100644 --- a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html +++ b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html @@ -1,25 +1,53 @@ -
    -

    Resource

    - - - - -
    -
    - Creator: <%= creator %>
    - Created: <%= _.formatFromUTC(created) %>
    - Updated: <%= _.formatFromUTC(updated) %>
    - URL: <%= url %>
    - Type:
    -
    -
    - - - -
    -
    -
    -

    Note: opening the Resource "View" (if available) may require authentication, but no authentication is required for "Download".

    + +
    +
    +
    RESOURCE DETAILS
    +
    +
    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    Creator:
    +
    <%= creator %>
    +
    +
    +
    Created:
    +
    <%= _.formatFromUTC(created) %>
    +
    +
    +
    Updated:
    +
    <%= _.formatFromUTC(updated) %>
    +
    +
    +
    URL:
    +
    <%= url %>
    +
    +
    +
    Type:
    + +
    +
    + + +
    + + + + +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html index cb84cb76d..a7a94e52d 100644 --- a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html +++ b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html @@ -1,20 +1,39 @@ -
    -

    Resources

    - <%- count %> Resources Selected
    - - + +
    +
    +
    RESOURCE DETAILS
    +
    +
    + + + +
    +
    +
    <%- count %> Resources Selected.
    +
    +
    + + +
    <% if (isSameLabel) { %> - + <% } %> -
    -
    - - - -
    +
    +
    Note: multi-selecting resources is still experimental.
    -
    -

    Note: multi-selecting resources is still experimental.

    + + + +
    + + + + +
    + + + diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html b/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html index 46c9dd64c..bdb2a3390 100644 --- a/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html +++ b/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html @@ -1,22 +1,26 @@ -
    -
    -

    Available Resources

    -
    +
    +
    + +
    -
    -
    - - - -
    - - - +
    +
    + + +
    + +
    -
    -

    Assigned Resources

    -

    Resource(s) Assigned

    -
    +
    + +
    diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html b/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html index cd817211a..d056cc923 100644 --- a/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html @@ -1,4 +1,4 @@ -

    Resource Lists

    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html b/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html index e41b61924..be79f6e3e 100644 --- a/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html +++ b/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html @@ -1,4 +1,4 @@ -
    +

    Resource List

    diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html b/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html index 979f1a9d6..896aef3f6 100644 --- a/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html @@ -1,4 +1,4 @@ -

    Resource Types

    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html b/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html index 9e5429d6c..63ff4dd2d 100644 --- a/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html @@ -1,5 +1,3 @@ -

    Run Jobs

    -
    diff --git a/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html b/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html index e9f915de0..6282dc1e6 100644 --- a/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html +++ b/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html @@ -1,13 +1,39 @@ -
    -

    Run Job

    - Name: <%= job_name %>
    - Created: <%= _.formatFromUTC(created) %>
    - Updated: <%= _.formatFromUTC(updated) %>
    - Status: <%= statusText %>
    -
    - -

    - Error summary: <%= error_summary %>
    - Error details:
    - + +
    +
    +
    RUN JOB DETAILS
    +
    +
    + + +
    +
    +
    Name:
    +
    <%= job_name %>
    +
    +
    +
    Created:
    +
    <%= _.formatFromUTC(created) %>
    +
    +
    +
    Updated:
    +
    <%= _.formatFromUTC(updated) %>
    +
    +
    +
    Status:
    +
    <%= statusText %>
    +
    +
    +
    Error summary:
    +
    <%= error_summary %>
    +
    +
    +
    Error details:
    + +
    +
    + + +
    +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html b/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html index 740011fd9..7c6652adb 100644 --- a/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html +++ b/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html @@ -1,4 +1,4 @@
    - \ No newline at end of file + \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html index 3057cfedb..2f3732ab7 100644 --- a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html +++ b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html @@ -1,26 +1,42 @@ -
    - - -

    +
    - - -

    +
    + + +

    +
    + +
    + + +

    +
    - - -

    +
    + + +

    +
    - - -

    +
    + + +

    +
    -
    - +
    +
    -
    Waiting for user preferences to load.
    -
    - - + +
    +
    Waiting for user preferences to load.
    +
    + + +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html index 253b8154f..47ca62978 100644 --- a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html +++ b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_reset-password.html b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_reset-password.html new file mode 100644 index 000000000..240e46db9 --- /dev/null +++ b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_reset-password.html @@ -0,0 +1,12 @@ +
    + + + + + +
    +
    +
    + +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html b/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html index ae7299bc2..5f4a36a8e 100644 --- a/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html @@ -1,11 +1,11 @@ -

    Workflows

    -
    - -
    <%= username %> <%= first_name %> <%= last_name %>
    diff --git a/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html b/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html index 3840977d5..8c6859c75 100644 --- a/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html +++ b/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html @@ -1,19 +1,48 @@ -
    -

    Workflow

    - - - - - Creator: <%= creator %>
    - Created: <%= _.formatFromUTC(created) %>
    - Updated: <%= _.formatFromUTC(updated) %>
    - URL: <%= url %>
    - Valid: <%= valid %>
    -
    - - - - - + +
    +
    +
    WORKFLOW DETAILS
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    Creator:
    +
    <%= creator %>
    +
    +
    +
    Created:
    +
    <%= _.formatFromUTC(created) %>
    +
    +
    +
    Updated:
    +
    <%= _.formatFromUTC(updated) %>
    +
    +
    +
    URL:
    +
    <%= url %>
    +
    +
    +
    Valid:
    +
    <%= valid %>
    +
    +
    + + +
    + + + + +
    + diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html index a569b04f5..484c6e622 100644 --- a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html +++ b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html @@ -1,7 +1,16 @@ - - -
    -<%= job_name %> +
    + + +
    + +
    + + <%= job_name %> +
    +
    - - \ No newline at end of file + +
    + + +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html index f542023f4..fa4af1c87 100644 --- a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html +++ b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html @@ -1,2 +1,2 @@ -
    - \ No newline at end of file +
    + \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html index 8cf2d2cea..b230f3ec1 100644 --- a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html +++ b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html @@ -1,10 +1,10 @@ -

    Workflow Runs

    +
    - + diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html index c8a903ed5..c1e5bc1a9 100644 --- a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html +++ b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html @@ -1,23 +1,81 @@ -
    -
    -

    Workflow Run

    - - - - - Creator: <%= creator %>
    - Created on: <%= _.formatFromUTC(created) %>
    - Updated on: <%= _.formatFromUTC(updated) %>
    - URL: <%= url %>
    - Status: <%= statusText %>
    - - + +
    + +
    +
    +
    WORKFLOW RUN DETAILS
    +
    -
    -
    -
    -

    Resources | Run Jobs

    -
    -
    + + +
    + +
    +
    +
    +
    Creator:
    +
    <%= creator %>
    +
    + +
    + + +
    + +
    + + +
    + +
    +
    Creator:
    +
    <%= creator %>
    +
    + +
    +
    Created on:
    +
    <%= _.formatFromUTC(created) %>
    +
    + +
    +
    Updated on:
    +
    <%= _.formatFromUTC(updated) %>
    +
    + +
    +
    URL:
    +
    <%= url %>
    +
    + +
    +
    Status:
    +
    <%= statusText %>
    +
    +
    +
    + + +
    + + +
    +
    + + +
    + +
    +
    +
    WORKFLOW RUN RESOURCES & RUN JOBS
    +
    +
    + +
    + Resources + Run Jobs +
    +
    +
    + diff --git a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html index f37c18165..89d030229 100644 --- a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html +++ b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html @@ -1,4 +1,16 @@ -
    -
    -
    +
    + +
    +
    +
    My Projects
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html index 7683d341b..b3ddb9bff 100644 --- a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html +++ b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html @@ -1,4 +1,4 @@ -
    +
    -
    +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html b/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html index 866b145d5..ecddb3b19 100644 --- a/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html +++ b/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html @@ -1,18 +1,26 @@ -

    Rodan server

    -Version: <%= version %>
    -URI: <%= hostname %>
    -Last known server date/time: <%= date %>
    -Pagination length: <%= serverConfiguration.page_length %>
    -Job packages: -
      -<% for(var package in serverConfiguration.job_packages) { %> -
    • <%= package %> (<%= serverConfiguration.job_packages[package] %>)
    • -<% } %> -
    -
    -

    Rodan client

    -
      -<% for(var field in client) { %> -
    • <%= field %>: <%= client[field] %>
    • -<% } %> -
    +
    +
    +

    Rodan server

    +
    Version: <%= version %>
    +
    URI: <%= hostname %>
    +
    Last known server date/time: <%= date %>
    +
    Pagination length: <%= serverConfiguration.page_length %>
    +
    Job packages:
    +
      + <% for(var package in serverConfiguration.job_packages) { %> +
    • <%= package %> (<%= serverConfiguration.job_packages[package] %>)
    • + <% } %> +
    +
    + +
    + +
    +

    Rodan client

    +
      + <% for(var field in client) { %> +
    • <%= field %>: <%= client[field] %>
    • + <% } %> +
    +
    +
    diff --git a/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html b/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html index 0b824fab2..8aad76ffa 100644 --- a/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html +++ b/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html @@ -1,2 +1,4 @@ -Please visit <%= url %>
    -Client admin: <%= name %> \ No newline at end of file +
    + Please visit <%= url %> + Client admin: <%= name %> +
    \ No newline at end of file diff --git a/rodan-client/code/templates/Views/Master/Modal/template-modal.html b/rodan-client/code/templates/Views/Master/Modal/template-modal.html index aa114f795..0f204862e 100644 --- a/rodan-client/code/templates/Views/Master/Modal/template-modal.html +++ b/rodan-client/code/templates/Views/Master/Modal/template-modal.html @@ -1,12 +1,10 @@ -
    NameCreatorCreator Created Updated Status
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    name - - -string - - - - -

    The name for the timer.

    - -
    @@ -261,9 +208,9 @@ was called.

    exports -

    ModifySettingsViewModel

    -

    The ViewModel for the ModifySettingsView. When the user clicks on the button in the ModifySettingsView, the callback property -is called.

    +

    ModifySettingsView

    +

    A view which displays a message, a list of settings for the users to edit, and a confirm button for the user to click. When they click the button, an arbitrary +callback function is called.

    @@ -381,9 +328,8 @@ is called.

    exports -

    ModifySettingsView

    -

    A view which displays a message, a list of settings for the users to edit, and a confirm button for the user to click. When they click the button, an arbitrary -callback function is called.

    +

    RecursiveUnorderedListView

    +

    This view is a recursive unordered list. This view is the main component of the ClassTreeView.

    @@ -501,8 +447,7 @@ callback function is called.

    exports -

    This class maintains a runjob.working_user_expiry Rodan token throughout its lifetime.

    -

    For more information, see https://github.com/DDMAL/Interactive-Classifier/wiki/Token-Authentication.

    +

    A Timer class for use in application performance profiling.

    @@ -514,7 +459,7 @@ callback function is called.


    -

    new exports()

    +

    new exports(name)

    @@ -522,8 +467,8 @@ callback function is called.

    -

    Grabs the authentication URL from the page URL and sets the timeout -to 5000 miliseconds.

    +

    Construct the Timer and set the initial time. All future ticks will measure time elapsed since this function +was called.

    @@ -533,6 +478,56 @@ to 5000 miliseconds.

    +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    name + + +string + + + + +

    The name for the timer.

    + +
    @@ -625,11 +620,9 @@ to 5000 miliseconds.

    exports -

    ModalViewModel

    -

    This ViewModel controls the state of a modal.

    -

    The innerView property points to an arbitrary view that is rendered -in the body of the modal.

    -

    The isClosable property determines whether or not the user has the power to manually close the view.

    +

    ConfirmViewModel

    +

    The ViewModel for the ConfirmView. When the user clicks on the button in the ConfirmView, the callback property +is called.

    @@ -747,8 +740,8 @@ in the body of the modal.

    exports -

    RecursiveUnorderedListView

    -

    This view is a recursive unordered list. This view is the main component of the ClassTreeView.

    +

    LoadingScreenView

    +

    A view which displays some text and an infinite loading bar.

    @@ -866,8 +859,8 @@ in the body of the modal.

    exports -

    LoadingScreenView

    -

    A view which displays some text and an infinite loading bar.

    +

    This class maintains a runjob.working_user_expiry Rodan token throughout its lifetime.

    +

    For more information, see https://github.com/DDMAL/Interactive-Classifier/wiki/Token-Authentication.

    @@ -886,6 +879,11 @@ in the body of the modal.

    +
    +

    Grabs the authentication URL from the page URL and sets the timeout +to 5000 miliseconds.

    +
    + @@ -985,9 +983,9 @@ in the body of the modal.

    exports -

    ConfirmView

    -

    A view which displays a message and a button for the user to click. When they click the button, an arbitrary -callback function is called.

    +

    ModifySettingsViewModel

    +

    The ViewModel for the ModifySettingsView. When the user clicks on the button in the ModifySettingsView, the callback property +is called.

    @@ -1105,9 +1103,11 @@ callback function is called.

    exports -

    ConfirmViewModel

    -

    The ViewModel for the ConfirmView. When the user clicks on the button in the ConfirmView, the callback property -is called.

    +

    ModalViewModel

    +

    This ViewModel controls the state of a modal.

    +

    The innerView property points to an arbitrary view that is rendered +in the body of the modal.

    +

    The isClosable property determines whether or not the user has the power to manually close the view.

    @@ -1253,7 +1253,7 @@ is called.

    Documentation generated by JSDoc 3.5.5 - on 2023-05-10T12:12:57-04:00 + on 2023-08-07T15:17:22-04:00 using the DocStrap template. diff --git a/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/modules.list.html b/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/modules.list.html index ece786f03..a76286485 100644 --- a/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/modules.list.html +++ b/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/modules.list.html @@ -287,7 +287,7 @@ Documentation generated by JSDoc 3.5.5 - on 2023-05-10T12:12:57-04:00 + on 2023-08-07T15:17:22-04:00 using the DocStrap template. diff --git a/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/quicksearch.html b/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/quicksearch.html index c3381269a..03f1b4074 100644 --- a/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/quicksearch.html +++ b/rodan-main/code/rodan/jobs/interactive_classifier/docs/jsdoc/quicksearch.html @@ -7,7 +7,7 @@