diff --git a/.env b/.env new file mode 100644 index 0000000..d45268d --- /dev/null +++ b/.env @@ -0,0 +1,12 @@ +# --- Database Credentials (Fixes DB Initialization Error) --- +POSTGRES_DB=deans_cms_db +POSTGRES_USER=deans_user +POSTGRES_PASSWORD=your_secure_db_password # <--- REPLACE ME + +# --- API Secrets (Fixes SECRET_KEY exposure) --- +DJANGO_SECRET_KEY=a_new_secure_secret_for_django # <--- REPLACE ME + +# --- Inter-Service Decoupling --- +# The Notification service name is 'deans-notification' in the parent repository structure, +# and it runs on a known port (e.g., 5000) within the Docker network. +NOTIFICATION_SERVICE_URL=http://deans-notification:5000 diff --git a/.gitignore b/.gitignore index e7aee2f..56336cb 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,7 @@ venv.bak/ migrations/ tidb/ +.env + +# Environment variables for local deployment +.env diff --git a/.gitmodules b/.gitmodules index ad695c4..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +0,0 @@ -[submodule "deans-api"] - path = deans-api - url = https://github.com/Deans-CMS/deans-api -[submodule "deans-frontend"] - path = deans-frontend - url = https://github.com/Deans-CMS/deans-frontend -[submodule "deans-notification"] - path = deans-notification - url = https://github.com/Deans-CMS/deans-notification.git diff --git a/deans-api b/deans-api deleted file mode 160000 index dbfa6b6..0000000 --- a/deans-api +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dbfa6b63ddb5b8d401dbd2fa7319d6d22e895d8a diff --git a/deans-api/.gitignore b/deans-api/.gitignore new file mode 100644 index 0000000..d4fcd9c --- /dev/null +++ b/deans-api/.gitignore @@ -0,0 +1,244 @@ +.idea/ +.vscode +# Created by https://www.gitignore.io/api/macos,linux,django,python,pycharm + +### Django ### +*.log +*.pot +*.pyc +__pycache__/ +local_settings.py +db.sqlite3 +media +static +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Python ### +# Byte-compiled / optimized / DLL files +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo + +# Django stuff: + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# End of https://www.gitignore.io/api/macos,linux,django,python,pycharm + + +#docker +.vagrant* +bin +docker/docker +.*.swp +a.out +*.orig +build_src +.flymake* +.idea +.DS_Store +docs/_build +docs/_static +docs/_templates +.gopath/ +.dotcloud +*.test +bundles/ +.hg/ +.git/ +vendor/pkg/ +pyenv +Vagrantfile + +migrations/ +deans_api/.pytest_cache +deans_api/api/.pytest_cache +*.pytest_cache \ No newline at end of file diff --git a/deans-api/.pytest_cache/README.md b/deans-api/.pytest_cache/README.md new file mode 100644 index 0000000..bb78ba0 --- /dev/null +++ b/deans-api/.pytest_cache/README.md @@ -0,0 +1,8 @@ +# pytest cache directory # + +This directory contains data from the pytest's cache plugin, +which provides the `--lf` and `--ff` options, as well as the `cache` fixture. + +**Do not** commit this to version control. + +See [the docs](https://docs.pytest.org/en/latest/cache.html) for more information. diff --git a/deans-api/.pytest_cache/v/cache/nodeids b/deans-api/.pytest_cache/v/cache/nodeids new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/deans-api/.pytest_cache/v/cache/nodeids @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/deans-api/Dockerfile b/deans-api/Dockerfile new file mode 100644 index 0000000..5a83482 --- /dev/null +++ b/deans-api/Dockerfile @@ -0,0 +1,37 @@ +FROM python:3.6 + +ENV PYTHONUNBUFFERED 1 +ENV IN_DOCKER "1" +ENV BASEDIR /work +ENV DJANGO_ROOT $BASEDIR/deans-api/deans_api +ENV DATA_ROOT /data +ENV ENTRY_DIR $DJANGO_ROOT +ENV PATH "$DJANGO_ROOT:$BASEDIR:$PATH" +# RUN mkdir /code/deans-api + +WORKDIR $BASEDIR + +ADD debs/ $BASEDIR/ +RUN dpkg -i *.deb + +COPY ./start_django.sh $BASEDIR/ +RUN chmod +x start_django.sh + +ADD requirements.txt $BASEDIR/ +RUN pip install -r requirements.txt +RUN sed -i -e 's/\r$//' start_django.sh +WORKDIR $BASEDIR +ADD ./deans_api $DJANGO_ROOT/ +ADD ./data $DATA_DIR + +WORKDIR $ENTRY_DIR +# CMD ["python3","$DJANGO_ROOT/manage.py", "runserver", "0.0.0.0:8000"] + + + +# # cron +# RUN apt-get -y install cron +# COPY cron/* /etc/cron.d/ +# RUN chmod 0644 /etc/cron.d/* +# RUN touch /var/log/cron.log +# # RUN service cron start \ No newline at end of file diff --git a/deans-api/README.md b/deans-api/README.md new file mode 100644 index 0000000..00eb521 --- /dev/null +++ b/deans-api/README.md @@ -0,0 +1,54 @@ +# Dean's Crisis Management System + + +# Setup envirment + +## On *nix + +1. Install `docker` and `docker-compose` correctly. + +[How to install on mac](http://sourabhbajaj.com/mac-setup/Docker/) + +2. Setup python +```shell +$ virtualenv -p python3 env +$ source env/bin/activate +$ pip install -r requirments.txt +``` + +## On Windows +``` +``` + +# Run server + +If on Mac or Windows the container will run on Docker Machine which is a virtual machine, and will have its own ip address. You could run`docker-machine ip` to check the address, and such address will used to access the front end. However, on Linux, you could simplly access `localhost`. + +## On *nux + +If using you will need `sudo` to run the following command. +```shell +$ docker-compose up +``` + +## On Windows + +``` + +``` + + +# Useful commands + +## Django migrattion + +``` shell +docker-compose run web python manage.py migrate +``` + +# TODO + +- [ ] persist data in a dockerized postgres database using volumes +- [ ] django-restful doc +- [ ] remove 'ADD' on setting page +- [ ] diff --git a/deans-api/cron/president-email-cron b/deans-api/cron/president-email-cron new file mode 100644 index 0000000..46b6e80 --- /dev/null +++ b/deans-api/cron/president-email-cron @@ -0,0 +1,2 @@ +* * * * * root python3 /code/deans_api/manage.py runcrons >> /var/log/cron.log +# Mandatory blank line diff --git a/deans-api/data/users.json b/deans-api/data/users.json new file mode 100644 index 0000000..2498197 --- /dev/null +++ b/deans-api/data/users.json @@ -0,0 +1,38 @@ +[ +{ + "model": "auth.user", + "pk": 1, + "fields": { + "password": "pbkdf2_sha256$120000$remm8Dri3omu$QkcVCtFHJPeiDytAxCZMTkigHtmO5gC4Oa3QmChhCz0=", + "last_login": "2018-10-24T06:41:45.252Z", + "is_superuser": true, + "username": "admin", + "first_name": "", + "last_name": "", + "email": "abc.demo.com", + "is_staff": true, + "is_active": true, + "date_joined": "2018-10-24T06:37:43.077Z", + "groups": [], + "user_permissions": [] + } +}, +{ + "model": "auth.user", + "pk": 2, + "fields": { + "password": "pbkdf2_sha256$120000$t1u1yfi9F9F0$vbQU9+9ng/wm1Cml0YtbuaLvpZGRr4cBBFi+ngObpP8=", + "last_login": null, + "is_superuser": false, + "username": "operator", + "first_name": "", + "last_name": "", + "email": "", + "is_staff": false, + "is_active": true, + "date_joined": "2018-10-24T06:51:03.072Z", + "groups": [], + "user_permissions": [] + } +} +] diff --git a/deans-api/deans_api/.pytest_cache/README.md b/deans-api/deans_api/.pytest_cache/README.md new file mode 100644 index 0000000..bb78ba0 --- /dev/null +++ b/deans-api/deans_api/.pytest_cache/README.md @@ -0,0 +1,8 @@ +# pytest cache directory # + +This directory contains data from the pytest's cache plugin, +which provides the `--lf` and `--ff` options, as well as the `cache` fixture. + +**Do not** commit this to version control. + +See [the docs](https://docs.pytest.org/en/latest/cache.html) for more information. diff --git a/deans-api/deans_api/.pytest_cache/v/cache/nodeids b/deans-api/deans_api/.pytest_cache/v/cache/nodeids new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/deans-api/deans_api/.pytest_cache/v/cache/nodeids @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/deans-api/deans_api/api/.pytest_cache/README.md b/deans-api/deans_api/api/.pytest_cache/README.md new file mode 100644 index 0000000..bb78ba0 --- /dev/null +++ b/deans-api/deans_api/api/.pytest_cache/README.md @@ -0,0 +1,8 @@ +# pytest cache directory # + +This directory contains data from the pytest's cache plugin, +which provides the `--lf` and `--ff` options, as well as the `cache` fixture. + +**Do not** commit this to version control. + +See [the docs](https://docs.pytest.org/en/latest/cache.html) for more information. diff --git a/deans-api/deans_api/api/.pytest_cache/v/cache/nodeids b/deans-api/deans_api/api/.pytest_cache/v/cache/nodeids new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/deans-api/deans_api/api/.pytest_cache/v/cache/nodeids @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/deans-api/deans_api/api/__init__.py b/deans-api/deans_api/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deans-api/deans_api/api/admin.py b/deans-api/deans_api/api/admin.py new file mode 100644 index 0000000..66adfd5 --- /dev/null +++ b/deans-api/deans_api/api/admin.py @@ -0,0 +1,24 @@ +from django.contrib import admin +from .models import ( + Operator, + Crisis, + CrisisType, + CrisisAssistance, + SiteSettings, + EmergencyAgencies, + SocialMediaAccount + ) + +admin.site.register(Operator) +''' + Call the django default admin page to handel the models we have in admin panel +''' +class CrisisAdmin(admin.ModelAdmin): + list_display = ('crisis_id', 'crisis_description','crisis_time','visible') + list_editable = ('visible',) +admin.site.register(Crisis, CrisisAdmin) +admin.site.register(CrisisType) +admin.site.register(CrisisAssistance) +admin.site.register(SiteSettings) +admin.site.register(EmergencyAgencies) +admin.site.register(SocialMediaAccount) \ No newline at end of file diff --git a/deans-api/deans_api/api/apps.py b/deans-api/deans_api/api/apps.py new file mode 100644 index 0000000..c147de3 --- /dev/null +++ b/deans-api/deans_api/api/apps.py @@ -0,0 +1,4 @@ +from django.apps import AppConfig + +class ApiConfig(AppConfig): + name = 'api' diff --git a/deans-api/deans_api/api/consumers.py b/deans-api/deans_api/api/consumers.py new file mode 100644 index 0000000..fdb0200 --- /dev/null +++ b/deans-api/deans_api/api/consumers.py @@ -0,0 +1,44 @@ +# from .models import Crisis +from channels.generic.websocket import JsonWebsocketConsumer, WebsocketConsumer +from asgiref.sync import async_to_sync +import json +from .models import Crisis +from .serializer import CrisisSerializer +from rest_framework.response import Response + +class CrisesConsumer(WebsocketConsumer): + + def connect(self): + """ + Perform things on connection start + """ + # Join group + async_to_sync(self.channel_layer.group_add)( + "crises", + self.channel_name + ) + + self.accept() + + def receive(self, text_data): + """ + Called when a message is received + """ + pass + + def disconnect(self, message, **kwargs): + """ + Perform things on connection close + """ + # Leave group + async_to_sync(self.channel_layer.group_discard)( + "crises", + self.channel_name + ) + + def crises_update(self, event): + """ + Called when a message is received from redis + """ + payload = event["payload"] + self.send(payload) \ No newline at end of file diff --git a/deans-api/deans_api/api/cron.py b/deans-api/deans_api/api/cron.py new file mode 100644 index 0000000..29e21bb --- /dev/null +++ b/deans-api/deans_api/api/cron.py @@ -0,0 +1,122 @@ +from django_cron import CronJobBase, Schedule +from .models import Crisis, SiteSettings +import datetime +import requests +from django.template.loader import get_template +from django.template import Context +# --- REENGINEERING CHANGE 1: Import Django Settings --- +from django.conf import settings +# ------------------------------------------------------ + +import logging +logger = logging.getLogger("django") + +email_template = get_template('president_email.html') + +def construct_report_data(): + payload = {} + # d = Context({ 'username': username + # [cite: 43] }) + # html_content = htmly.render(d) + + created_time = datetime.datetime.now() - datetime.timedelta(minutes=30) # crisis created since 30 mins ago + new_crisis = Crisis.objects.filter(crisis_time__gte=created_time) + recent_resolved_crisis = Crisis.objects.filter(updated_at__gte=created_time, crisis_status="RS") + active_crisis = Crisis.objects.exclude(crisis_status="RS") + + + # logger.info("Reporting" + str(len(latest_crisis))+ "crisis.") + payload['email'] = "deanscms@gmail.com" # SiteSettings.load().summary_reporting_email + payload['new_crisis'] = [] + payload['recent_resolved_crisis'] = [] + payload['active_crisis'] = [] + for i in new_crisis: + payload['new_crisis'].append( + + { + "crisis_time":i.crisis_time.strftime("%Y-%m-%d %H:%M:%S"), + "resolved_by": i.updated_at.strftime("%Y-%m-%d %H:%M:%S") if i.crisis_status == "RS" else "None", + "location": i.crisis_location1, + "location2": i.crisis_location2, + "type": ", ".join([j.name for j in i.crisis_type.all()]), + "status": i.crisis_status, + + "crisis_description": i.crisis_description, + "crisis_assistance": ", ".join([j.name for j in i.crisis_assistance.all()]), + "assistance_description": i.crisis_assistance_description + } + ) + for i in recent_resolved_crisis: + payload['recent_resolved_crisis'].append( + { + "crisis_time":i.crisis_time.strftime("%Y-%m-%d %H:%M:%S"), + + "resolved_by": i.updated_at.strftime("%Y-%m-%d %H:%M:%S") if i.crisis_status == "RS" else "None", + "location": i.crisis_location1, + "location2": i.crisis_location2, + "type": ", ".join([j.name for j in i.crisis_type.all()]), + "status": i.crisis_status, + "crisis_description": i.crisis_description, + "crisis_assistance": ", ".join([j.name for +j in i.crisis_assistance.all()]), + "assistance_description": i.crisis_assistance_description + } + ) + for i in active_crisis: + payload['active_crisis'].append( + { + "crisis_time":i.crisis_time.strftime("%Y-%m-%d %H:%M:%S"), + "resolved_by": i.updated_at.strftime("%Y-%m-%d %H:%M:%S") if i.crisis_status == "RS" else "None", + + "location": i.crisis_location1, + "location2": i.crisis_location2, + "type": ", ".join([j.name for j in i.crisis_type.all()]), + "status": i.crisis_status, + "crisis_description": i.crisis_description, + "crisis_assistance": ", ".join([j.name for j in i.crisis_assistance.all()]), + "assistance_description": i.crisis_assistance_description + + } + ) + return payload + +class CronEmail(CronJobBase): + RUN_EVERY_MINS = 1 + ALLOW_PARALLEL_RUNS = True + schedule = Schedule(run_every_mins=RUN_EVERY_MINS) + code = 'api.CronEmail' + print("CRON JOB!!!!!!!") + def do(self): + print("Doing") + # --- REENGINEERING CHANGE 2: Decouple Notification URL --- + # Replace hardcoded URL string with the settings variable + # Note: We must append the /reports/ endpoint to the base URL + url = f"{settings.NOTIFICATION_SERVICE_URL}/reports/" + # -------------------------------------------------------- + payload = construct_report_data() + print("payload", payload) + headers = {'Content-Type': "application/json"} + + print("Before sending") + response = requests.request("POST", url, json=payload, headers=headers) + print("Sent request") + # logger.info(response.text) + logger.info('Sent email to President Office.') + + +# class CronSocialMedia(CronJobBase): +# RUN_EVERY_MINS = 1 +# ALLOW_PARALLEL_RUNS = True +# schedule = Schedule(run_every_mins=RUN_EVERY_MINS) +# code = 'api.CronSocialMedia' +# def do(self): +# # --- REENGINEERING CHANGE 3: Decouple Social Media URL (conceptual) --- +# # We apply the same logic here to decouple the second hardcoded URL +# url = f"{settings.NOTIFICATION_SERVICE_URL}/socialmessages/" +# # -------------------------------------------------------------------- +# payload = construct_report_data() +# headers = {'Content-Type': "application/json"} +# response = requests.request("POST", url, json=payload, headers=headers) +# # logger.info(response.text) +# logger.info('Sent message to social medias.') +```eof diff --git a/deans-api/deans_api/api/models/Crisis.py b/deans-api/deans_api/api/models/Crisis.py new file mode 100644 index 0000000..ead64f6 --- /dev/null +++ b/deans-api/deans_api/api/models/Crisis.py @@ -0,0 +1,263 @@ +from django.contrib.auth.models import User +from django.db import models +from .CrisisType import CrisisType +from .Operator import Operator +from .CrisisAssistance import CrisisAssistance +from django.db.models import signals +import requests +import datetime +import channels.layers +from asgiref.sync import async_to_sync +from rest_framework.response import Response # this is bad! +import json +import logging +logger = logging.getLogger("django") + +STATUS_CHOICES = ( + ('PD', 'Pending'), + ('DP', 'Dispatched'), + ('RS', 'Resolved'), +) +''' + This is the most important model of the whole CMS System. The Crisis Model consists of all the information that a crisis needs. + Details: + reporter's name, String + reporter's mobile_number, String + crisis_id, String + crisis_type, Many to many field linked to CrisisType Model + crisis_description, longer String, Text Field + crisis_assistance, Many to many field linked to CrisisAssistance Model + crisis_assistance_description, longer string, Text Field + crisis_time, a date time field + crisis_location1&2, longer String, Text field + updated_at, a date time field records last object modification + owner, a Many to many field linked to User Model + visible, a boolean field recording the visibility of a crisis in the front end + dispatch_trigger, a boolean field recording the signal of a dispatch action + crisis status, a tuple recording the crisis status +''' +class Crisis(models.Model): + your_name = models.CharField(default=None,max_length=255) + mobile_number = models.CharField(default=None,max_length=255) + crisis_id = models.AutoField(primary_key=True) + crisis_type = models.ManyToManyField(CrisisType) + crisis_description = models.TextField(default="") + crisis_assistance = models.ManyToManyField(CrisisAssistance) + crisis_assistance_description = models.TextField(default="") + crisis_time = models.DateTimeField(auto_now_add=True) + crisis_location1 = models.TextField() + crisis_location2 = models.TextField(default="") + updated_at = models.DateTimeField(auto_now_add=True) + owner = models.ManyToManyField(User) + visible = models.BooleanField(default=True) + phone_number_to_notify = models.CharField(default="",max_length=255) + dispatch_trigger = models.BooleanField(default=False) + + crisis_status = models.CharField(choices=STATUS_CHOICES, default='PD', max_length=254) + + def __str__(self): + return str(self.crisis_id) + + class Meta: + ordering = ['-crisis_id'] + +''' + social media announcement generator +''' + +def construct_social_media_data(this_crisis): + payload = {} + + # shelter location url, immediate Crisis, recent_resolved_crisis, Dispatched Crisis, + + created_time = datetime.datetime.now() - datetime.timedelta(minutes=30) # crisis created since 30 mins ago + recent_resolved_crisis = Crisis.objects.filter(updated_at__gte=created_time, crisis_status="RS") + active_crisis = Crisis.objects.exclude(crisis_status="RS") + + payload['postTime'] = created_time.strftime('%Y-%m-%d %H:%M') + payload['deansURL'] = "https://deans.csming.com/" + payload['shelterURL'] = "https://deans.csming.com/" + payload['recent_resolved_crisis'] = [] + payload['active_crisis'] = [] + payload['new_crisis'] = [] + print("payload", payload) + + payload['new_crisis'].append({ + "crisis_time": this_crisis.crisis_time.strftime("%Y-%m-%d %H:%M:%S"), + "resolved_by": this_crisis.updated_at.strftime("%Y-%m-%d %H:%M:%S") if this_crisis.crisis_status == "RS" else "None", + "location": this_crisis.crisis_location1, + "location2": this_crisis.crisis_location2, + "type": ", ".join([j.name for j in this_crisis.crisis_type.all()]), + "status": this_crisis.crisis_status, + "crisis_description": this_crisis.crisis_description, + "crisis_assistance": ", ".join([j.name for j in this_crisis.crisis_assistance.all()]), + "assistance_description": this_crisis.crisis_assistance_description + } + ) + + reported_time = str(this_crisis.crisis_time) + name = this_crisis.your_name + mobile_number = this_crisis.mobile_number + location1 = this_crisis.crisis_location1 + location2 = this_crisis.crisis_location2 + # create crisis type + crisis_type_queryset = this_crisis.crisis_type.all() + crisis_type = [] + for _ in crisis_type_queryset: + crisis_type.append(str(_)) + crisis_type = ", ".join(crisis_type) + # create assistance type + assistance_type_queryset = this_crisis.crisis_assistance.all() + assistance_type = [] + for _ in assistance_type_queryset: + assistance_type.append(str(_)) + assistance_type = ", ".join(assistance_type) + # handle the rest + crisis_description = this_crisis.crisis_description + assistance_description = this_crisis.crisis_assistance_description + + message = "\nWe have received the following crisis report, need your immediate attention:\n\n" + message += "Reported Time: " + reported_time + "\n" + message += "Location: " + location1 + "\n" + message += "Location2: " + location2 + "\n" + message += "Crisis Type: " + crisis_type + "\n" + message += "Crisis Description: " + crisis_description + "\n" + message += "Requested Assistance: " + assistance_type + "\n" + message += "Assistance Description: " + assistance_description + "\n" + + payload['text'] = message + + for i in recent_resolved_crisis: + payload['recent_resolved_crisis'].append( + { + "crisis_time": i.crisis_time.strftime("%Y-%m-%d %H:%M:%S"), + "resolved_by": i.updated_at.strftime("%Y-%m-%d %H:%M:%S") if i.crisis_status == "RS" else "None", + "location": i.crisis_location1, + "location2": i.crisis_location2, + "type": ", ".join([j.name for j in i.crisis_type.all()]), + "status": i.crisis_status, + "crisis_description": i.crisis_description, + "crisis_assistance": ", ".join([j.name for j in i.crisis_assistance.all()]), + "assistance_description": i.crisis_assistance_description + } + ) + for i in active_crisis: + payload['active_crisis'].append( + { + "crisis_time": i.crisis_time.strftime("%Y-%m-%d %H:%M:%S"), + "resolved_by": i.updated_at.strftime("%Y-%m-%d %H:%M:%S") if i.crisis_status == "RS" else "None", + "location": i.crisis_location1, + "location2": i.crisis_location2, + "type": ", ".join([j.name for j in i.crisis_type.all()]), + "status": i.crisis_status, + "crisis_description": i.crisis_description, + "crisis_assistance": ", ".join([j.name for j in i.crisis_assistance.all()]), + "assistance_description": i.crisis_assistance_description + } + ) + return payload + +''' + notification subsystem - social media api caller trigger + dispatch action trigger + when crisis model is saved, this trigger function is called. + Social media api will be called to send announcement. + dispatch function will only be called when there is a dispatch signal. +''' +def trigger(sender, instance, created, **kwargs): + + #Social media Trigger + print("Doing Social Media Publishing...") + url = "http://notification:8000/socialmessages/" + this_crisis = Crisis.objects.get(pk=instance.pk) + fb_payload = construct_social_media_data(this_crisis) + tw_payload = "A Crisis is happening at time: {}!\n".format(fb_payload['postTime']) + tw_payload += "For your safety. Shelter Information: " + fb_payload['shelterURL'] + tw_payload += "\nFor Crisis detail information: " + fb_payload['deansURL'] + + print("payload: ", tw_payload) + print("payload: ", fb_payload) + print("Before sending") + # Post to the notification system api, to send facebook and twitter announcement + response = requests.post("http://notification:8000/socialmessages/", + json={"message": {"twitterShare":tw_payload, "facebookShare":fb_payload}}, + headers={ + 'content-type': "application/json", + } + ) + print("Sent request") + logger.info(response.status_code) + logger.info('Have published to Facebook and Twitter.') + + # Dispatch + if this_crisis.crisis_status == "DP": + try: + if sender.dispatch_trigger: + phone_number_to_notify = json.loads(this_crisis.phone_number_to_notify) + # start creating message + reported_time = str(this_crisis.crisis_time) + name = this_crisis.your_name + mobile_number = this_crisis.mobile_number + location1 = this_crisis.crisis_location1 + location2 = this_crisis.crisis_location2 + # create crisis type + crisis_type_queryset = this_crisis.crisis_type.all() + crisis_type = [] + for _ in crisis_type_queryset: + crisis_type.append(str(_)) + crisis_type = ", ".join(crisis_type) + # create assistance type + assistance_type_queryset = this_crisis.crisis_assistance.all() + assistance_type = [] + for _ in assistance_type_queryset: + assistance_type.append(str(_)) + assistance_type = ", ".join(assistance_type) + # handle the rest + crisis_description = this_crisis.crisis_description + assistance_description = this_crisis.crisis_assistance_description + # construct message content + message = "We have received the following crisis report, need your immediate attention:\n\n" + message += "Reported Time: " + reported_time + "\n" + message += "Reporter Name: " + name + "\n" + message += "Mobile Number: " + mobile_number + "\n" + message += "Location: " + location1 + "\n" + message += "Location2: " + location2 + "\n" + message += "Crisis Type: " + crisis_type + "\n" + message += "Crisis Description: " + crisis_description + "\n" + message += "Requested Assistance: " + assistance_type + "\n" + message += "Assistance Description: " + assistance_description + "\n" + message += "\nThank you for keeping our people safe!" + + print(message) + + for phone_number in phone_number_to_notify: + prefixed_phone_number = "+65" + str(phone_number) + requests.post("http://notification:8000/dispatchnotices/", + json={"number" : prefixed_phone_number, "message" : message}, + headers={ + 'content-type': "application/json", + 'cache-control': "no-cache" + } + ) + except Exception as e: + print("It is ok.", e) + + ''' + Crisis Info, WebSocket cache service + ''' + + try: + # send to redis + queryset = Crisis.objects.all() + from ..serializer import CrisisSerializer + serializer = CrisisSerializer(queryset, many=True) + response = Response(serializer.data) # response is an array of crises + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("crises", { + "type": "crises_update", + "payload": json.dumps(list(response.data)) + }) + except Exception as e: + print("It is not ok. Human lives at risk!", e) + +signals.post_save.connect(receiver=trigger, sender=Crisis) + diff --git a/deans-api/deans_api/api/models/CrisisAssistance.py b/deans-api/deans_api/api/models/CrisisAssistance.py new file mode 100644 index 0000000..a554b55 --- /dev/null +++ b/deans-api/deans_api/api/models/CrisisAssistance.py @@ -0,0 +1,14 @@ +from django.db.models import Model, CharField +''' + Crisis Assistance Model, records the name of the crisis only. +''' +class CrisisAssistance (Model): + name=CharField( + default=None, + max_length=(255)) + + def __str__(self): + return str(self.name) + + class Meta: + pass \ No newline at end of file diff --git a/deans-api/deans_api/api/models/CrisisType.py b/deans-api/deans_api/api/models/CrisisType.py new file mode 100644 index 0000000..2e00bf6 --- /dev/null +++ b/deans-api/deans_api/api/models/CrisisType.py @@ -0,0 +1,14 @@ +from django.db.models import Model, CharField +''' + CrisisType model, carries the name of the crisisType only +''' +class CrisisType (Model): + name=CharField( + default=None, + max_length=(255)) + + def __str__(self): + return self.name + + class Meta: + pass \ No newline at end of file diff --git a/deans-api/deans_api/api/models/EmergencyAgencies.py b/deans-api/deans_api/api/models/EmergencyAgencies.py new file mode 100644 index 0000000..5972694 --- /dev/null +++ b/deans-api/deans_api/api/models/EmergencyAgencies.py @@ -0,0 +1,13 @@ +from django.db import models +''' + EmergencyAgencies model consists the agency id and the agency name, phone number of each emergency agency object. +''' +class EmergencyAgencies(models.Model): + agency_id = models.AutoField(primary_key=True) + agency = models.CharField(default=None, max_length=255) + phone_number = models.CharField(default=None, max_length=255) + def __str__(self): + return self.agency + + class Meta: + pass \ No newline at end of file diff --git a/deans-api/deans_api/api/models/Operator.py b/deans-api/deans_api/api/models/Operator.py new file mode 100644 index 0000000..7938fe8 --- /dev/null +++ b/deans-api/deans_api/api/models/Operator.py @@ -0,0 +1,18 @@ +from django.contrib.auth.models import User +from django.db import models +''' + Operator implements a user model of django default model. +''' +class Operator(models.Model): + # operator_id = models.IntegerField() + # operator_password = models.CharField(max_length=20) + # operator_name = models.CharField(max_length=30) + # is_admin = models.BooleanField() + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') + + + def __str__(self): + return self.operator_id + + class Meta: + pass \ No newline at end of file diff --git a/deans-api/deans_api/api/models/SiteSettings.py b/deans-api/deans_api/api/models/SiteSettings.py new file mode 100644 index 0000000..54681cc --- /dev/null +++ b/deans-api/deans_api/api/models/SiteSettings.py @@ -0,0 +1,42 @@ +from django.db import models +from .CrisisType import CrisisType +from .CrisisAssistance import CrisisAssistance +#from .EmergencyAgencies import EmergencyAgencies +#from .SocialMediaAccount import SocialMediaAccount + +''' + SiteSetting model implements the design pattern of singleton. + only one unique instance of the model will be created, loaded and deleted in the database. +''' +class SingletonModel(models.Model): + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + self.pk = 1 + super(SingletonModel, self).save(*args, **kwargs) + + def delete(self, *args, **kwargs): + pass + + @classmethod + def load(cls): + obj, created = cls.objects.get_or_create(pk=1) + return obj + +''' + facebook & twitter information together with the summary_report_email will be in the settings. +''' + +class SiteSettings(SingletonModel): + #setting_type = models.ForeignKey('CrisisType',default = None, on_delete=models.CASCADE) + #setting_assistance = models.ForeignKey('CrisisAssistance',default = None, on_delete=models.CASCADE) + # social_media_account = models.CharField(default=None, max_length=255) + # social_media = models.CharField(default=None, max_length=255) + #emergency_agencies = models.ForeignKey('EmergencyAgencies', default = None, on_delete=models.CASCADE) + facebook_account = models.CharField(default=None, max_length=255) + facebook_password = models.CharField(default=None, max_length=255) + twitter_account = models.CharField(default=None, max_length=255) + twitter_password = models.CharField(default=None, max_length=255) + summary_reporting_email = models.EmailField(default='prime-minister@gmail.com') \ No newline at end of file diff --git a/deans-api/deans_api/api/models/SocialMediaAccount.py b/deans-api/deans_api/api/models/SocialMediaAccount.py new file mode 100644 index 0000000..ef7f38d --- /dev/null +++ b/deans-api/deans_api/api/models/SocialMediaAccount.py @@ -0,0 +1,14 @@ +from django.db import models + +''' + This model is deprecated +''' + +class SocialMediaAccount(models.Model): + social_media = models.CharField(default=None, max_length=255) + social_account = models.CharField(default=None, max_length=255) + def __str__(self): + return self.social_account + + class Meta: + pass \ No newline at end of file diff --git a/deans-api/deans_api/api/models/__init__.py b/deans-api/deans_api/api/models/__init__.py new file mode 100644 index 0000000..73801a0 --- /dev/null +++ b/deans-api/deans_api/api/models/__init__.py @@ -0,0 +1,8 @@ +from .Crisis import Crisis +from .CrisisType import CrisisType +from .Operator import Operator +from .CrisisAssistance import CrisisAssistance +from .SiteSettings import SiteSettings +from .EmergencyAgencies import EmergencyAgencies +from .SocialMediaAccount import SocialMediaAccount +from .SiteSettings import SiteSettings \ No newline at end of file diff --git a/deans-api/deans_api/api/permissions.py b/deans-api/deans_api/api/permissions.py new file mode 100644 index 0000000..5dffa11 --- /dev/null +++ b/deans-api/deans_api/api/permissions.py @@ -0,0 +1,21 @@ +from rest_framework import permissions + +class IsAuthorOrReadOnly(permissions.BasePermission): + """ + Allow author to modify and everyone to read + """ + def has_object_permission(self, request, view, obj): + # Every user is allowed to read, safe HTTP will bypass directly + # SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS') + if request.method in permissions.SAFE_METHODS: + return True + # Only author can write permission + return obj.author == request.user + +class NotAllowed(permissions.BasePermission): + """ + Not allow anyony to access + """ + message = 'No access' + def has_permission(self, request, view): + return False \ No newline at end of file diff --git a/deans-api/deans_api/api/routing.py b/deans-api/deans_api/api/routing.py new file mode 100644 index 0000000..96abc02 --- /dev/null +++ b/deans-api/deans_api/api/routing.py @@ -0,0 +1,10 @@ +# api/routing.py +from django.conf.urls import url + +from . import consumers + + +'''web_socket url''' +websocket_urlpatterns = [ + url(r'^api/ws/crises/?', consumers.CrisesConsumer), +] \ No newline at end of file diff --git a/deans-api/deans_api/api/serializer.py b/deans-api/deans_api/api/serializer.py new file mode 100644 index 0000000..e642ec5 --- /dev/null +++ b/deans-api/deans_api/api/serializer.py @@ -0,0 +1,168 @@ +from .models import ( + Crisis, + CrisisAssistance, + CrisisType, + SiteSettings, + EmergencyAgencies + ) +from rest_framework import serializers +from django.utils.timezone import now +from .models.Crisis import STATUS_CHOICES +from django.contrib.auth.models import User + +'''This file contains all the serializers the api is using. + Each model will be serialized in a way that can be processed and inside a json format. +''' + +class CrisisAssistanceSerializer(serializers.ModelSerializer): + class Meta: + model = CrisisAssistance + fields = ('id','name',) + +class CrisisTypeSerializer(serializers.ModelSerializer): + class Meta: + model = CrisisType + fields = ('id','name',) + +class CrisisSerializer(serializers.ModelSerializer): + crisis_type = serializers.PrimaryKeyRelatedField(many=True, queryset=CrisisType.objects.all()) + crisis_assistance = serializers.PrimaryKeyRelatedField(many=True, queryset=CrisisAssistance.objects.all()) + class Meta: + model = Crisis + fields = ( + 'crisis_id', + 'your_name', + 'mobile_number', + 'crisis_type', + 'crisis_description', + 'crisis_assistance', + 'crisis_assistance_description', + 'crisis_status', + 'crisis_time', + 'crisis_location1', + 'crisis_location2', + 'phone_number_to_notify' + ) + +class CrisisBasicSerializer(serializers.ModelSerializer): + crisis_type = serializers.PrimaryKeyRelatedField(many=True, queryset=CrisisType.objects.all()) + crisis_assistance = serializers.PrimaryKeyRelatedField(many=True, queryset=CrisisAssistance.objects.all()) + class Meta: + model = Crisis + fields = ( + 'crisis_id', + 'your_name', + 'mobile_number', + 'crisis_type', + 'crisis_description', + 'crisis_assistance', + 'crisis_assistance_description', + 'crisis_status', + 'crisis_time', + 'crisis_location1', + 'crisis_location2' + ) + +class CrisisUpdateSerializer(serializers.ModelSerializer): + # content = serializers.CharField(required=True) + # thread = serializers.HyperlinkedRelatedField( + # read_only=True, + # view_name='thread-detail' + # ) + # creator = serializers.HyperlinkedRelatedField( + # read_only=True, + # view_name='user-detail', + # lookup_field='username' + # ) + class Meta: + model = Crisis + fields = ( + 'crisis_type', + 'your_name', + 'mobile_number', + 'crisis_description', + 'crisis_assistance', + 'crisis_assistance_description', + 'crisis_status', + 'crisis_location1', + 'crisis_location2' + ) + + def update(self, instance, validated_data): + # Update fields if there is any change + for field, value in validated_data.items(): + setattr(instance, field, value) + # Update 'updated_at' field to now + setattr(instance, 'updated_at', now()) + + # Note: If user update post, it won't change the last_activity + instance.save() + return instance + +class UserSerializer(serializers.ModelSerializer): + password = serializers.CharField(write_only=True) + + def create(self, validated_data): + user = User.objects.create_user( + username=validated_data['username'] + ) + user.is_staff = validated_data['is_staff'] + user.set_password(validated_data['password']) + user.save() + return user + + class Meta: + model = User + fields = ('username', 'password', 'is_staff') + +class UserAdminSerializer(UserSerializer): + def update(self, instance, validated_data): + if "is_staff" in validated_data: + instance.is_staff = validated_data['is_staff'] + if "password" in validated_data: + instance.set_password(validated_data['password']) + instance.save() + return instance + class Meta: + model = User + fields = ('id', 'username', 'password', 'is_staff') + +class SiteSettingsSerializer(serializers.ModelSerializer): + class Meta: + model = SiteSettings + fields = ( + 'facebook_account', + 'facebook_password', + 'twitter_account', + 'twitter_password', + 'summary_reporting_email', + ) + +class EmergencyAgenciesSerializer(serializers.ModelSerializer): + class Meta: + model = EmergencyAgencies + fields = ( + 'agency_id', + 'agency', + 'phone_number' + ) + +class EmergencyAgenciesUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = EmergencyAgencies + fields = ( + 'agency_id', + 'agency', + 'phone_number' + ) + + # def update(self, instance, validated_data): + # # Update fields if there is any change + # for field, value in validated_data.items(): + # setattr(instance, field, value) + # # Update 'updated_at' field to now + # setattr(instance, 'updated_at', now()) + # + # # Note: If user update post, it won't change the last_activity + # instance.save() + # return instance \ No newline at end of file diff --git a/deans-api/deans_api/api/tests.py b/deans-api/deans_api/api/tests.py new file mode 100644 index 0000000..039d89c --- /dev/null +++ b/deans-api/deans_api/api/tests.py @@ -0,0 +1,21 @@ +from django.test import TestCase +from django.contrib.auth.models import User +from .models import ( + Crisis, + CrisisAssistance, + CrisisType, + SiteSettings, + EmergencyAgencies + ) +# Create your tests here. + +class YourTestClass(TestCase): + @classmethod + def setUpTestData(self): + Crisis.objects.create(your_name="yuance", + mobile_number="83496888", + crisis_description="HELP!") + def test_model_crsis_1(self): + yuance=Crisis.objects.get(your_name="yuance") + max_length = yuance._meta.get_field('your_name').max_length + self.assertEquals(max_length, 255) diff --git a/deans-api/deans_api/api/urls.py b/deans-api/deans_api/api/urls.py new file mode 100644 index 0000000..19ed32b --- /dev/null +++ b/deans-api/deans_api/api/urls.py @@ -0,0 +1,53 @@ +from django.conf.urls import url +from django.urls import include, path +from django.contrib import admin +from rest_framework import routers + +from .views import ( + CrisisViewSet, + CrisisAssistanceViewSet, + CrisisTypeViewSet, + CrisisUpdateView, + CrisisPartialUpdateView, + UserViewSet, + UserPartialUpdateView, + EmergencyAgenciesView, + EmergencyAgenciesPartialUpdateView, + SiteSettingViewSet +) +''' + The Url Router here has dispatched all views in views.py to corresponding url. + Api urls: + /crises/ + /crises/update/pk + /crises/update-partial/pk + /crisisassistance/ + /crisistype/ + /users/ + /users/ + /emergencyagencies/ + /emergencyagencies/update-partial/pk + /sitesettings/ +''' +router = routers.DefaultRouter() +router.register(r'^crises', CrisisViewSet) +router.register(r'^crisisassistance', CrisisAssistanceViewSet) +router.register(r'^crisistype', CrisisTypeViewSet) +router.register(r'^users', UserViewSet) +router.register(r'^emergencyagencies', EmergencyAgenciesView) +router.register(r'^sitesettings', SiteSettingViewSet) + + +urlpatterns = [ + path('api-auth/', include('rest_framework.urls')), + path('rest-auth/', include('rest_auth.urls')), + url(r'^', include(router.urls)), + # url(r'^crises/update//edit/$', CrisisUpdateAPIView.as_view(), name='crisis-update') + url(r'^crises/update/(?P\d+)/$', CrisisUpdateView.as_view(), name='crisis_update'), + url(r'^crises/update-partial/(?P\d+)/$', CrisisPartialUpdateView.as_view(), name='crisis_partial_update'), + url(r'^users/update-partial/(?P\d+)/$', UserPartialUpdateView.as_view(), name='user_partial_update'), + url(r'^emergencyagencies/update-partial/(?P\d+)/$', EmergencyAgenciesPartialUpdateView.as_view(), name='emergencyagency_partial_update'), +] +# Registration with rest auth: +# url(r'^rest-auth/', include('rest_auth.urls')), +# url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), \ No newline at end of file diff --git a/deans-api/deans_api/api/views.py b/deans-api/deans_api/api/views.py new file mode 100644 index 0000000..f9e3107 --- /dev/null +++ b/deans-api/deans_api/api/views.py @@ -0,0 +1,211 @@ +from django.shortcuts import render + +# Create your views here. +from rest_framework import viewsets, permissions, mixins, generics +from django.contrib.auth.models import User +from .permissions import NotAllowed +from .models import Crisis, CrisisAssistance, CrisisType, SiteSettings, EmergencyAgencies +from .serializer import ( + CrisisSerializer, + CrisisAssistanceSerializer, + CrisisTypeSerializer, + CrisisUpdateSerializer, + CrisisBasicSerializer, + UserSerializer, + UserAdminSerializer, + SiteSettingsSerializer, + EmergencyAgenciesSerializer, + EmergencyAgenciesUpdateSerializer + ) + +from rest_framework.permissions import ( + AllowAny, + IsAuthenticated, + IsAdminUser, + IsAuthenticatedOrReadOnly, +) + +# import channels.layers +# from asgiref.sync import async_to_sync + +''' + The View Classes here implements the V-view in the MVC architecture. + CrisisView, CrisisUpdateView, CrisisPartialUpdateView, + CrisisAssistanceView, CrisisTypeView, + UserView, UserPartialUpdateView, + SiteSettingView, + EmergencyView, EmergencyPartialUpdateView + + will all be handled by an api url in urls.py +''' + +class CrisisViewSet(viewsets.ModelViewSet): + """ + Return a list of all the existing crisis. + """ + queryset = Crisis.objects.all() + serializer_class = CrisisSerializer + # def get_serializer_class(self): + # if self.request.user.is_staff: + # return CrisisSerializer + # return CrisisBasicSerializer + + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + if self.action == 'list': + permission_classes = [AllowAny] + elif self.action == 'retrieve': + permission_classes = [AllowAny] + elif self.action == 'create': + permission_classes = [AllowAny] + else: + permission_classes = [IsAdminUser] + + return [permission() for permission in permission_classes] + +class CrisisUpdateView(generics.GenericAPIView, mixins.UpdateModelMixin): + ''' + Book update API, need to submit both `name` and `author_name` fields + At the same time, or django will prevent to do update for field missing + ''' + queryset = Crisis.objects.all() + serializer_class = CrisisSerializer + + def put(self, request, *args, **kwargs): + return self.update(request, *args, **kwargs) + +class CrisisPartialUpdateView(generics.GenericAPIView, mixins.UpdateModelMixin): + ''' + You just need to provide the field which is to be modified. + ''' + queryset = Crisis.objects.all() + serializer_class = CrisisSerializer + + def put(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) + +class CrisisAssistanceViewSet(viewsets.ModelViewSet): + queryset = CrisisAssistance.objects.all() + serializer_class = CrisisAssistanceSerializer + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + if self.action == 'list': + permission_classes = [AllowAny] + elif self.action == 'retrieve': + permission_classes = [AllowAny] + elif self.action == 'create': + permission_classes = [AllowAny] + else: + permission_classes = [IsAdminUser] + return [permission() for permission in permission_classes] + +class CrisisTypeViewSet(viewsets.ModelViewSet): + queryset = CrisisType.objects.all() + serializer_class = CrisisTypeSerializer + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + if self.action == 'list': + permission_classes = [AllowAny] + elif self.action == 'retrieve': + permission_classes = [AllowAny] + elif self.action == 'create': + permission_classes = [AllowAny] + else: + permission_classes = [IsAdminUser] + return [permission() for permission in permission_classes] + +class UserViewSet(viewsets.ModelViewSet): + """ + A viewset for viewing and editing user instances. + """ + serializer_class = UserSerializer + queryset = User.objects.all() + + # def get_serializer_class(self): + # if self.request.user.is_staff: + # return UserAdminSerializer + # return UserSerializer + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + if self.action == 'list': + permission_classes = [IsAdminUser] + elif self.action == 'create': + permission_classes = [IsAdminUser] + else: + permission_classes = [NotAllowed] + return [permission() for permission in permission_classes] + +class UserPartialUpdateView(generics.GenericAPIView, mixins.UpdateModelMixin): + ''' + You just need to provide the field which is to be modified. + ''' + queryset = User.objects.all() + serializer_class = UserAdminSerializer + permission_classes = (IsAdminUser,) + + def put(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) + +class SiteSettingViewSet(viewsets.ModelViewSet): + + serializer_class = SiteSettingsSerializer + queryset = SiteSettings.objects.all() + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + if self.action == 'list': + permission_classes = [AllowAny] + elif self.action == 'retrieve': + permission_classes = [AllowAny] + elif self.action == 'create': + permission_classes = [AllowAny] + else: + permission_classes = [IsAdminUser] + return [permission() for permission in permission_classes] + + +class EmergencyAgenciesView(viewsets.ModelViewSet): + + serializer_class = EmergencyAgenciesSerializer + queryset = EmergencyAgencies.objects.all() + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + if self.action == 'list': + permission_classes = [AllowAny] + elif self.action == 'retrieve': + permission_classes = [AllowAny] + elif self.action == 'create': + permission_classes = [AllowAny] + else: + permission_classes = [IsAdminUser] + return [permission() for permission in permission_classes] + +class EmergencyAgenciesPartialUpdateView(generics.GenericAPIView, mixins.UpdateModelMixin): + + serializer_class = EmergencyAgenciesUpdateSerializer + queryset = EmergencyAgencies.objects.all() + + def put(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) + + def delete(self, request, pk, format=None): + event = self.get_object(pk) + event.delete() + return Response(status=status.HTTP_204_NO_CONTENT) \ No newline at end of file diff --git a/deans-api/deans_api/deans_api/__init__.py b/deans-api/deans_api/deans_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deans-api/deans_api/deans_api/routing.py b/deans-api/deans_api/deans_api/routing.py new file mode 100644 index 0000000..0d9b0cc --- /dev/null +++ b/deans-api/deans_api/deans_api/routing.py @@ -0,0 +1,12 @@ +from channels.auth import AuthMiddlewareStack +from channels.routing import ProtocolTypeRouter, URLRouter +from api import routing + +application = ProtocolTypeRouter({ + # (http->django views is added by default) + 'websocket': AuthMiddlewareStack( + URLRouter( + routing.websocket_urlpatterns + ) + ), +}) \ No newline at end of file diff --git a/deans-api/deans_api/deans_api/settings.py b/deans-api/deans_api/deans_api/settings.py new file mode 100644 index 0000000..9610bbe --- /dev/null +++ b/deans-api/deans_api/deans_api/settings.py @@ -0,0 +1,198 @@ +""" +Django settings for deans_api project. + +Generated by 'django-admin startproject' using Django 2.1.1. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.1/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ + +# --- REENGINEERING CHANGE 1: DECOUPLE SECRET KEY --- +# SECURITY WARNING: keep the secret key used in production secret! +# Read from environment variable DJANGO_SECRET_KEY, falling back to a dummy value +# only if running locally and the variable is missing (SHOULD NOT HAPPEN with .env). +SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'insecure-fallback-for-tests') + +# SECURITY WARNING: don't run with debug turned on in production! +if('PRODUCTION' in os.environ and os.environ['PRODUCTION']=='1'): + DEBUG = False +else: + DEBUG = True + + +ALLOWED_HOSTS = ['*'] # for Cross-Origin Access + + +# Application definition + +INSTALLED_APPS = [ + 'channels', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', + 'rest_framework.authtoken', + "django_extensions", + 'rest_auth', + 'django_cron', + 'api', + 'corsheaders', + 'django.contrib.admindocs', +] + +MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.contrib.admindocs.middleware.XViewMiddleware' +] + +CRON_CLASSES = [ + "api.cron.CronEmail", + # "api.cron.CronSocialMedia" +] + +ROOT_URLCONF = 'deans_api.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR,"templates")], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'deans_api.wsgi.application' +ASGI_APPLICATION = 'deans_api.routing.application' # for using channels +CHANNEL_LAYERS = { + 'default': { + 'BACKEND': 'channels_redis.core.RedisChannelLayer', + 'CONFIG': { + "hosts": [('redis', 6379)], + }, + }, +} + +# Database +# https://docs.djangoproject.com/en/2.1/ref/settings/#databases +if('IN_DOCKER' in os.environ and os.environ['IN_DOCKER']=='1'): + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + # --- REENGINEERING CHANGE 2: DECOUPLE DATABASE CREDENTIALS --- + 'NAME': os.environ.get('POSTGRES_DB'), + 'USER': os.environ.get('POSTGRES_USER'), + 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), + # ------------------------------------------------------------- + 'HOST': 'db', + 'PORT': 5432, + 'OPTIONS': { + 'options': '-c timezone=UTC', + } + }, +} +else: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } + } + +# Password validation +# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.AllowAny' + ], + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework.authentication.TokenAuthentication', + 'rest_framework.authentication.SessionAuthentication', + ), +} + +REST_AUTH_SERIALIZERS = { + 'USER_DETAILS_SERIALIZER': 'api.serializer.UserSerializer', +} +if('PRODUCTION' in os.environ and os.environ['PRODUCTION']=='1'): + REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'] = ( + 'rest_framework.renderers.JSONRenderer', + ) + +CORS_ALLOW_CREDENTIALS = True +CORS_ORIGIN_WHITELIST = ( + "localhost:3000", + "127.0.0.1:3000" +) + +# Internationalization +# https://docs.djangoproject.com/en/2.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.1/howto/static-files/ + +STATIC_URL = '/static-django/' +STATIC_ROOT = '/static-django/' + +# --- REENGINEERING CHANGE 3: DECOUPLE NOTIFICATION SERVICE URL --- +# The Core API uses this setting to communicate with the decoupled Notification Service. +# Reads from environment variable NOTIFICATION_SERVICE_URL. +NOTIFICATION_SERVICE_URL = os.environ.get('NOTIFICATION_SERVICE_URL') +# ----------------------------------------------------------------- diff --git a/deans-api/deans_api/deans_api/urls.py b/deans-api/deans_api/deans_api/urls.py new file mode 100644 index 0000000..9afc7a0 --- /dev/null +++ b/deans-api/deans_api/deans_api/urls.py @@ -0,0 +1,49 @@ +"""deans_api URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path +from django.conf.urls import url, include +from django.contrib.auth.models import User +from rest_framework import routers, serializers, viewsets +from rest_framework.documentation import include_docs_urls + + + +# Serializers define the API representation. +class UserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = User + fields = ('url', 'username', 'email', 'is_staff') + +# ViewSets define the view behavior. +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer + +# Routers provide an easy way of automatically determining the URL conf. +router = routers.DefaultRouter() +router.register(r'users', UserViewSet) + + +# Wire up our API using automatic URL routing. +# Additionally, we include login URLs for the browsable API. +urlpatterns = [ + url(r'^api/admin/doc/', include('django.contrib.admindocs.urls')), + url(r'^api/admin/docs/', include_docs_urls(title='CoreAPI System')), + path('api/admin/', admin.site.urls), + # url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), + url(r'^api/', include('api.urls')), +] diff --git a/deans-api/deans_api/deans_api/wsgi.py b/deans-api/deans_api/deans_api/wsgi.py new file mode 100644 index 0000000..185b2f1 --- /dev/null +++ b/deans-api/deans_api/deans_api/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for deans_api project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'deans_api.settings') + +application = get_wsgi_application() diff --git a/deans-api/deans_api/manage.py b/deans-api/deans_api/manage.py new file mode 100755 index 0000000..922b90c --- /dev/null +++ b/deans-api/deans_api/manage.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == '__main__': + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'deans_api.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) diff --git a/deans-api/deans_api/templates/president_email.html b/deans-api/deans_api/templates/president_email.html new file mode 100644 index 0000000..e69de29 diff --git a/deans-api/debs/cron_3.0pl1-128ubuntu5_amd64.deb b/deans-api/debs/cron_3.0pl1-128ubuntu5_amd64.deb new file mode 100644 index 0000000..bbad80e Binary files /dev/null and b/deans-api/debs/cron_3.0pl1-128ubuntu5_amd64.deb differ diff --git a/deans-api/debs/postgresql-client-9.6_9.6.5-1_amd64.deb b/deans-api/debs/postgresql-client-9.6_9.6.5-1_amd64.deb new file mode 100644 index 0000000..9b527a4 Binary files /dev/null and b/deans-api/debs/postgresql-client-9.6_9.6.5-1_amd64.deb differ diff --git a/deans-api/debs/postgresql-client-common_184ubuntu1_all.deb b/deans-api/debs/postgresql-client-common_184ubuntu1_all.deb new file mode 100644 index 0000000..6453425 Binary files /dev/null and b/deans-api/debs/postgresql-client-common_184ubuntu1_all.deb differ diff --git a/deans-api/debs/postgresql-client_9.6+184ubuntu1.1_all.deb b/deans-api/debs/postgresql-client_9.6+184ubuntu1.1_all.deb new file mode 100644 index 0000000..1d13a16 Binary files /dev/null and b/deans-api/debs/postgresql-client_9.6+184ubuntu1.1_all.deb differ diff --git a/deans-api/default.env b/deans-api/default.env new file mode 100644 index 0000000..5517d4c --- /dev/null +++ b/deans-api/default.env @@ -0,0 +1 @@ +PRODUCTION=0 \ No newline at end of file diff --git a/deans-api/docker-compose.yaml b/deans-api/docker-compose.yaml new file mode 100644 index 0000000..fc682e2 --- /dev/null +++ b/deans-api/docker-compose.yaml @@ -0,0 +1,26 @@ +version: '3' + +services: + db: + image: postgres + ports: + - "5432:5432" + redis: + image: redis:2.8 + command: redis-server + ports: + - "6379:6379" + web: + build: . + # command: "python -c \"while True: pass\"" + entrypoint: "start_django.sh" + env_file: + - default.env + volumes: + - ./data:/data + - ./deans_api:/work/deans-api/deans_api + ports: + - "8000:8000" + depends_on: + - db + - redis diff --git a/deans-api/makefile b/deans-api/makefile new file mode 100644 index 0000000..1899fae --- /dev/null +++ b/deans-api/makefile @@ -0,0 +1,7 @@ +default: run + +run-local: deans_cms + python mamager.py + +build-docker: + docker build diff --git a/deans-api/requirements.txt b/deans-api/requirements.txt new file mode 100644 index 0000000..bc46b5b --- /dev/null +++ b/deans-api/requirements.txt @@ -0,0 +1,20 @@ +Django==2.1.1 +django-filter==2.0.0 +djangorestframework==3.8.2 +lazy-object-proxy==1.3.1 +Markdown==2.6.11 +pytz==2018.5 +psycopg2-binary>=2.8,<2.9 +gunicorn==19.9.0 +django-cron==0.5.1 +django-cors-headers==2.4.0 +gevent==1.3.7 +django-rest-auth==0.9.3 +django-extensions==2.1.3 +requests==2.20.0 +channels==2.1.5 +channels_redis==2.3.1 +Pygments==2.2.0 +Markdown==2.6.11 +coreapi==2.3.3 +docutils==0.14 diff --git a/deans-api/setup.sh b/deans-api/setup.sh new file mode 100644 index 0000000..6ed4ccc --- /dev/null +++ b/deans-api/setup.sh @@ -0,0 +1,3 @@ +virtualenv -p python3 env && +source env/bin/activate +pip install -r requirments.txt \ No newline at end of file diff --git a/deans-api/start_django.sh b/deans-api/start_django.sh new file mode 100644 index 0000000..41b691c --- /dev/null +++ b/deans-api/start_django.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd $DJANGO_ROOT +python3 manage.py collectstatic --no-input; +python3 manage.py makemigrations; +python3 manage.py migrate auth; +python3 manage.py migrate; +python3 manage.py makemigrations api; +python3 manage.py migrate api; +python3 manage.py loaddata $DATA_ROOT/users.json +if [ "$PRODUCTION" -eq "1" ]; +then + gunicorn --log-level=debug --bind :8000 deans_api.wsgi:application; +else + python3 manage.py runserver 0.0.0.0:8000; +fi + diff --git a/deans-frontend b/deans-frontend deleted file mode 160000 index ed6cad5..0000000 --- a/deans-frontend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ed6cad5cd8fcc2ad1bd74b4a7202d495977cc4ae diff --git a/deans-frontend/.circleci/config.yml b/deans-frontend/.circleci/config.yml new file mode 100644 index 0000000..842efab --- /dev/null +++ b/deans-frontend/.circleci/config.yml @@ -0,0 +1,39 @@ +# Javascript Node CircleCI 2.0 configuration file +# +# Check https://circleci.com/docs/2.0/language-javascript/ for more details +# +version: 2 +jobs: + build: + docker: + # specify the version you desire here + - image: circleci/node:8.11.1 + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/mongo:3.4.4 + + working_directory: ~/repo + + steps: + - checkout + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + - run: yarn install + + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + + # run tests! + - run: yarn test + + diff --git a/deans-frontend/.dockerignore b/deans-frontend/.dockerignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/deans-frontend/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/deans-frontend/.eslintignore b/deans-frontend/.eslintignore new file mode 100644 index 0000000..2501924 --- /dev/null +++ b/deans-frontend/.eslintignore @@ -0,0 +1,2 @@ +node_modules/ +./jest.config.js \ No newline at end of file diff --git a/deans-frontend/.eslintrc.js b/deans-frontend/.eslintrc.js new file mode 100644 index 0000000..ba29477 --- /dev/null +++ b/deans-frontend/.eslintrc.js @@ -0,0 +1,37 @@ +module.exports = { + env: { + browser: true, + es6: true, + node: true, + jest: true + }, + parser: "babel-eslint", + extends: ["eslint:recommended", "plugin:react/recommended", "prettier", "prettier/react",], + parserOptions: { + ecmaFeatures: { + jsx: true, + experimentalObjectRestSpread: true + }, + ecmaVersion: 7, + sourceType: "module" + }, + plugins: ["react", "prettier", "json"], + rules: { + // indent: ["error", 2], + "linebreak-style": ["error", "unix"], + quotes: ["error", "double"], + semi: ["error", "always"], + eqeqeq: 'error', + "no-console": 0, + "react/display-name": 0, + + // Prettier + "prettier/prettier": "error", + "no-tabs": "error", + "max-depth": ["error", { max: 3 }], + "max-statements": ["error", { max: 20 }], + complexity: "error", + "max-params": ["error", { max: 4 }], + "max-nested-callbacks": ["error", { max: 3 }] + } +}; diff --git a/deans-frontend/.firebaserc b/deans-frontend/.firebaserc new file mode 100644 index 0000000..aeec705 --- /dev/null +++ b/deans-frontend/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "deans-cms-1536556584678" + } +} diff --git a/deans-frontend/.gitignore b/deans-frontend/.gitignore new file mode 100644 index 0000000..7e5675c --- /dev/null +++ b/deans-frontend/.gitignore @@ -0,0 +1,5 @@ +# dependency +node_modules + +# build +dist \ No newline at end of file diff --git a/deans-frontend/Dockerfile b/deans-frontend/Dockerfile new file mode 100644 index 0000000..54547af --- /dev/null +++ b/deans-frontend/Dockerfile @@ -0,0 +1,16 @@ +# FROM nginx:1.15.2-alpine +# # you have to build before copy +# COPY ./dist /var/www +# COPY nginx.conf /etc/nginx/nginx.conf +# EXPOSE 80 +# ENTRYPOINT ["nginx","-g","daemon off;"] + +FROM node:8.11.1 +# you have to build before copy +COPY . /var/www +WORKDIR /var/www +RUN yarn install +RUN yarn build +# RUN yarn start +# EXPOSE 80 +# ENTRYPOINT ["yarn","start"] \ No newline at end of file diff --git a/deans-frontend/README.md b/deans-frontend/README.md new file mode 100644 index 0000000..b3a2747 --- /dev/null +++ b/deans-frontend/README.md @@ -0,0 +1,15 @@ +# Dean's Crisis Management System (Web Client UI) + +[![CircleCI](https://circleci.com/gh/Deans-CMS/deans-frontend.svg?style=svg)](https://circleci.com/gh/Deans-CMS/deans-frontend) + +## How to start + +1. Install dependencies + +`$ yarn install` + +2. Run on a development server + +`$ yarn start` + +3. The development server runs on `localhost:3000` \ No newline at end of file diff --git a/deans-frontend/firebase.json b/deans-frontend/firebase.json new file mode 100644 index 0000000..2c33c29 --- /dev/null +++ b/deans-frontend/firebase.json @@ -0,0 +1,16 @@ +{ + "hosting": { + "public": "dist", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + } +} diff --git a/deans-frontend/index.html b/deans-frontend/index.html new file mode 100644 index 0000000..d444f05 --- /dev/null +++ b/deans-frontend/index.html @@ -0,0 +1,17 @@ + + + + + + + Dean's CMS + + +
+ +
+ + + + + \ No newline at end of file diff --git a/deans-frontend/jest.config.js b/deans-frontend/jest.config.js new file mode 100644 index 0000000..6b280d3 --- /dev/null +++ b/deans-frontend/jest.config.js @@ -0,0 +1,180 @@ +// For a detailed explanation regarding each configuration property, visit: +// https://jestjs.io/docs/en/configuration.html + +module.exports = { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after the first failure + // bail: false, + + // Respect "browser" field in package.json when resolving modules + // browser: false, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/var/folders/yp/ctj4phd5647_f050v1rf0c2m0000gn/T/jest_dx", + + // Automatically clear mock calls and instances between every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: null, + + // The directory where Jest should output its coverage files + coverageDirectory: "coverage", + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: null, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // Force coverage collection from ignored files usin a array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: null, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: null, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "json", + // "jsx", + // "node" + // ], + + // A map from regular expressions to module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "always", + + // A preset that is used as a base for Jest's configuration + // preset: null, + + // Run tests from one or more projects + // projects: null, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state between every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: null, + + // Automatically restore mock state between every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: null, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // The path to a module that runs some code to configure or set up the testing framework before each test + // setupTestFrameworkScriptFile: null, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + testEnvironment: "node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + // testMatch: [ + // "**/__tests__/**/*.js?(x)", + // "**/?(*.)+(spec|test).js?(x)" + // ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "/node_modules/" + // ], + + // The regexp pattern Jest uses to detect test files + // testRegex: "", + + // This option allows the use of a custom results processor + // testResultsProcessor: null, + + // This option allows use of a custom test runner + // testRunner: "jasmine2", + + // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href + // testURL: "http://localhost", + + // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" + // timers: "real", + + // A map from regular expressions to paths to transformers + // transform: null, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: null, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/deans-frontend/nginx.conf b/deans-frontend/nginx.conf new file mode 100644 index 0000000..a0894eb --- /dev/null +++ b/deans-frontend/nginx.conf @@ -0,0 +1,61 @@ +# auto detects a good number of processes to run +worker_processes auto; + +#Provides the configuration file context in which the directives that affect connection processing are specified. +events { + # Sets the maximum number of simultaneous connections that can be opened by a worker process. + worker_connections 8000; + # Tells the worker to accept multiple connections at a time + multi_accept on; +} + + +http { + # what times to include + include /etc/nginx/mime.types; + # what is the default one + default_type application/octet-stream; + + # Sets the path, format, and configuration for a buffered log write + log_format compression '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $upstream_addr ' + '"$http_referer" "$http_user_agent"'; + + server { + # listen on port 80 + listen 80; + # save logs here + access_log /var/log/nginx/access.log compression; + + # where the root here + root /var/www; + # what file to server as index + index index.html index.htm; + + location / { + # First attempt to serve request as file, then + # as directory, then fall back to redirecting to index.html + try_files $uri $uri/ /index.html; + } + + # Media: images, icons, video, audio, HTC + location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ { + expires 1M; + access_log off; + add_header Cache-Control "public"; + } + + # Javascript and CSS files + location ~* \.(?:css|js)$ { + try_files $uri =404; + expires 1y; + access_log off; + add_header Cache-Control "public"; + } + + # Any route containing a file extension (e.g. /devicesfile.js) + location ~ ^.+\..+$ { + try_files $uri =404; + } + } +} \ No newline at end of file diff --git a/deans-frontend/package.json b/deans-frontend/package.json new file mode 100644 index 0000000..83abda2 --- /dev/null +++ b/deans-frontend/package.json @@ -0,0 +1,91 @@ +{ + "name": "project-name", + "version": "1.0.0", + "description": "Change this to your project description.", + "directories": { + "test": "test" + }, + "author": "Ming", + "license": "MIT", + "private": true, + "scripts": { + "start": "webpack-dev-server --watch --config webpack/webpack.dev.js", + "build": "NODE_ENV=production webpack --config webpack/webpack.prod.js", + "lint": "eslint --fix src", + "test": "jest" + }, + "dependencies": { + "antd": "^3.9.2", + "axios": "^0.18.0", + "google-map-react": "^1.0.9", + "jest": "^23.6.0", + "less": "^3.8.1", + "react": "^16.4.1", + "react-dom": "^16.4.1", + "react-places-autocomplete": "^7.2.0", + "react-redux": "^5.0.7", + "react-router": "^4.3.1", + "react-router-dom": "^4.3.1", + "react-social-icons": "^3.0.0", + "redux": "^4.0.1", + "redux-thunk": "^2.3.0", + "webpack-merge": "^4.1.3" + }, + "devDependencies": { + "autoprefixer": "^9.0.2", + "babel-cli": "^6.26.0", + "babel-core": "^6.26.3", + "babel-eslint": "^8.2.6", + "babel-jest": "^23.6.0", + "babel-loader": "^7.1.5", + "babel-plugin-dynamic-import-node": "^2.0.0", + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-preset-env": "^1.7.0", + "babel-preset-es2015": "^6.24.1", + "babel-preset-flow": "^6.23.0", + "babel-preset-react": "^6.24.1", + "babel-preset-stage-2": "^6.24.1", + "clean-webpack-plugin": "^0.1.19", + "css-loader": "^1.0.0", + "eslint": "^5.5.0", + "eslint-config-airbnb": "^17.1.0", + "eslint-config-prettier": "^2.9.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-json": "^1.2.0", + "eslint-plugin-jsx-a11y": "^6.1.1", + "eslint-plugin-prettier": "^2.6.2", + "eslint-plugin-react": "^7.11.1", + "file-loader": "^1.1.11", + "flow-bin": "^0.77.0", + "html-webpack-plugin": "^3.2.0", + "less-loader": "^4.1.0", + "mini-css-extract-plugin": "^0.4.1", + "node-sass": "^4.9.2", + "postcss-cssnext": "^3.1.0", + "postcss-flexbugs-fixes": "^4.1.0", + "postcss-loader": "^2.1.6", + "prettier": "^1.13.7", + "prettier-eslint": "^8.8.2", + "resolve-url-loader": "^2.3.0", + "sass-loader": "^7.0.3", + "style-loader": "^0.21.0", + "uglifyjs-webpack-plugin": "^1.2.7", + "webpack": "^4.16.0", + "webpack-cli": "^3.0.8", + "webpack-dev-server": "^3.1.4" + }, + "babel": { + "plugins": [ + "dynamic-import-node", + "syntax-dynamic-import" + ], + "presets": [ + "env", + "es2015", + "react", + "stage-2", + "flow" + ] + } +} diff --git a/deans-frontend/postcss.config.js b/deans-frontend/postcss.config.js new file mode 100644 index 0000000..36e6e57 --- /dev/null +++ b/deans-frontend/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + "postcss-cssnext": {} + } +}; diff --git a/deans-frontend/src/__dummy__/styleMock.js b/deans-frontend/src/__dummy__/styleMock.js new file mode 100644 index 0000000..6445bf7 --- /dev/null +++ b/deans-frontend/src/__dummy__/styleMock.js @@ -0,0 +1,2 @@ +// This directory is used to suppress flow warning only. +module.exports = {}; diff --git a/deans-frontend/src/api/__mockData__/assistanceType.json b/deans-frontend/src/api/__mockData__/assistanceType.json new file mode 100644 index 0000000..2066fad --- /dev/null +++ b/deans-frontend/src/api/__mockData__/assistanceType.json @@ -0,0 +1,6 @@ +[ + { + "id": 1, + "name": "Fire Fighting" + } +] \ No newline at end of file diff --git a/deans-frontend/src/api/__mockData__/crises.json b/deans-frontend/src/api/__mockData__/crises.json new file mode 100644 index 0000000..4d4229b --- /dev/null +++ b/deans-frontend/src/api/__mockData__/crises.json @@ -0,0 +1,19 @@ +[ + { + "crisis_id": 1, + "your_name": "Mingyu Liu", + "mobile_number": "83762385", + "crisis_type": [ + 1 + ], + "crisis_description": "Fire broke out", + "crisis_assistance": [ + 1 + ], + "crisis_assistance_description": "Fire broke out", + "crisis_status": "DP", + "crisis_time": "2018-11-08T17:47:48.090992Z", + "crisis_location1": "\"Nanyang Crescent, NTU Tamarind Hall Of Residence, Singapore\"", + "crisis_location2": "Block 23" + } +] \ No newline at end of file diff --git a/deans-frontend/src/api/__mockData__/crisisType.json b/deans-frontend/src/api/__mockData__/crisisType.json new file mode 100644 index 0000000..80e77f0 --- /dev/null +++ b/deans-frontend/src/api/__mockData__/crisisType.json @@ -0,0 +1,6 @@ +[ + { + "id": 1, + "name": "Fire" + } +] \ No newline at end of file diff --git a/deans-frontend/src/api/__mockData__/emergencyAgencies.json b/deans-frontend/src/api/__mockData__/emergencyAgencies.json new file mode 100644 index 0000000..7cfe803 --- /dev/null +++ b/deans-frontend/src/api/__mockData__/emergencyAgencies.json @@ -0,0 +1,10 @@ +[ + { + "agency": "Singapore Civil Defence Force", + "phone_number": "123123123" + }, + { + "agency": "Singapore Power", + "phone_number": "456456456" + } +] \ No newline at end of file diff --git a/deans-frontend/src/api/__mockData__/humidity.json b/deans-frontend/src/api/__mockData__/humidity.json new file mode 100644 index 0000000..87dad6f --- /dev/null +++ b/deans-frontend/src/api/__mockData__/humidity.json @@ -0,0 +1,174 @@ +{ + "metadata": { + "stations": [ + { + "id": "S109", + "device_id": "S109", + "name": "Ang Mo Kio Avenue 5", + "location": { + "latitude": 1.3764, + "longitude": 103.8492 + } + }, + { + "id": "S117", + "device_id": "S117", + "name": "Banyan Road", + "location": { + "latitude": 1.256, + "longitude": 103.679 + } + }, + { + "id": "S50", + "device_id": "S50", + "name": "Clementi Road", + "location": { + "latitude": 1.3337, + "longitude": 103.7768 + } + }, + { + "id": "S107", + "device_id": "S107", + "name": "East Coast Parkway", + "location": { + "latitude": 1.3135, + "longitude": 103.9625 + } + }, + { + "id": "S108", + "device_id": "S108", + "name": "Marina Gardens Drive", + "location": { + "latitude": 1.2799, + "longitude": 103.8703 + } + }, + { + "id": "S44", + "device_id": "S44", + "name": "Nanyang Avenue", + "location": { + "latitude": 1.34583, + "longitude": 103.68166 + } + }, + { + "id": "S121", + "device_id": "S121", + "name": "Old Choa Chu Kang Road", + "location": { + "latitude": 1.37288, + "longitude": 103.72244 + } + }, + { + "id": "S111", + "device_id": "S111", + "name": "Scotts Road", + "location": { + "latitude": 1.31055, + "longitude": 103.8365 + } + }, + { + "id": "S60", + "device_id": "S60", + "name": "Sentosa", + "location": { + "latitude": 1.25, + "longitude": 103.8279 + } + }, + { + "id": "S24", + "device_id": "S24", + "name": "Upper Changi Road North", + "location": { + "latitude": 1.3678, + "longitude": 103.9826 + } + }, + { + "id": "S116", + "device_id": "S116", + "name": "West Coast Highway", + "location": { + "latitude": 1.281, + "longitude": 103.754 + } + }, + { + "id": "S100", + "device_id": "S100", + "name": "Woodlands Road", + "location": { + "latitude": 1.4172, + "longitude": 103.74855 + } + } + ], + "reading_type": "RH 1M F", + "reading_unit": "percentage" + }, + "items": [ + { + "timestamp": "2018-11-09T02:40:00+08:00", + "readings": [ + { + "station_id": "S109", + "value": 99.7 + }, + { + "station_id": "S117", + "value": 82.3 + }, + { + "station_id": "S50", + "value": 89.1 + }, + { + "station_id": "S107", + "value": 88.8 + }, + { + "station_id": "S108", + "value": 80.7 + }, + { + "station_id": "S44", + "value": 88.1 + }, + { + "station_id": "S121", + "value": 90.4 + }, + { + "station_id": "S111", + "value": 81.3 + }, + { + "station_id": "S60", + "value": 79 + }, + { + "station_id": "S24", + "value": 89.2 + }, + { + "station_id": "S116", + "value": 90.7 + }, + { + "station_id": "S100", + "value": 88.6 + } + ] + } + ], + "api_info": { + "status": "healthy" + } +} \ No newline at end of file diff --git a/deans-frontend/src/api/__mockData__/psi.json b/deans-frontend/src/api/__mockData__/psi.json new file mode 100644 index 0000000..c46ad53 --- /dev/null +++ b/deans-frontend/src/api/__mockData__/psi.json @@ -0,0 +1,153 @@ +{ + "region_metadata": [ + { + "name": "west", + "label_location": { + "latitude": 1.35735, + "longitude": 103.7 + } + }, + { + "name": "national", + "label_location": { + "latitude": 0, + "longitude": 0 + } + }, + { + "name": "east", + "label_location": { + "latitude": 1.35735, + "longitude": 103.94 + } + }, + { + "name": "central", + "label_location": { + "latitude": 1.35735, + "longitude": 103.82 + } + }, + { + "name": "south", + "label_location": { + "latitude": 1.29587, + "longitude": 103.82 + } + }, + { + "name": "north", + "label_location": { + "latitude": 1.41803, + "longitude": 103.82 + } + } + ], + "items": [ + { + "timestamp": "2018-11-09T02:00:00+08:00", + "update_timestamp": "2018-11-09T02:03:53+08:00", + "readings": { + "o3_sub_index": { + "west": 3, + "national": 12, + "east": 6, + "central": 6, + "south": 9, + "north": 12 + }, + "pm10_twenty_four_hourly": { + "west": 16, + "national": 31, + "east": 21, + "central": 31, + "south": 20, + "north": 18 + }, + "pm10_sub_index": { + "west": 16, + "national": 31, + "east": 21, + "central": 31, + "south": 20, + "north": 18 + }, + "co_sub_index": { + "west": 6, + "national": 6, + "east": 4, + "central": 5, + "south": 5, + "north": 6 + }, + "pm25_twenty_four_hourly": { + "west": 5, + "national": 14, + "east": 9, + "central": 14, + "south": 9, + "north": 10 + }, + "so2_sub_index": { + "west": 3, + "national": 5, + "east": 5, + "central": 4, + "south": 4, + "north": 1 + }, + "co_eight_hour_max": { + "west": 0.57, + "national": 0.62, + "east": 0.39, + "central": 0.47, + "south": 0.54, + "north": 0.62 + }, + "no2_one_hour_max": { + "west": 15, + "national": 48, + "east": 17, + "central": 48, + "south": 16, + "north": 7 + }, + "so2_twenty_four_hourly": { + "west": 4, + "national": 8, + "east": 8, + "central": 7, + "south": 7, + "north": 2 + }, + "pm25_sub_index": { + "west": 21, + "national": 53, + "east": 37, + "central": 53, + "south": 37, + "north": 40 + }, + "psi_twenty_four_hourly": { + "west": 21, + "national": 53, + "east": 37, + "central": 53, + "south": 37, + "north": 40 + }, + "o3_eight_hour_max": { + "west": 7, + "national": 28, + "east": 15, + "central": 14, + "south": 21, + "north": 28 + } + } + } + ], + "api_info": { + "status": "healthy" + } +} \ No newline at end of file diff --git a/deans-frontend/src/api/__mockData__/rainfall.json b/deans-frontend/src/api/__mockData__/rainfall.json new file mode 100644 index 0000000..ff531f1 --- /dev/null +++ b/deans-frontend/src/api/__mockData__/rainfall.json @@ -0,0 +1,655 @@ +{ + "metadata": { + "stations": [ + { + "id": "S77", + "device_id": "S77", + "name": "Alexandra Road", + "location": { + "latitude": 1.2937, + "longitude": 103.8125 + } + }, + { + "id": "S109", + "device_id": "S109", + "name": "Ang Mo Kio Avenue 5", + "location": { + "latitude": 1.3764, + "longitude": 103.8492 + } + }, + { + "id": "S117", + "device_id": "S117", + "name": "Banyan Road", + "location": { + "latitude": 1.256, + "longitude": 103.679 + } + }, + { + "id": "S55", + "device_id": "S55", + "name": "Buangkok Green", + "location": { + "latitude": 1.3837, + "longitude": 103.886 + } + }, + { + "id": "S64", + "device_id": "S64", + "name": "Bukit Panjang Road", + "location": { + "latitude": 1.3824, + "longitude": 103.7603 + } + }, + { + "id": "S90", + "device_id": "S90", + "name": "Bukit Timah Road", + "location": { + "latitude": 1.3191, + "longitude": 103.8191 + } + }, + { + "id": "S61", + "device_id": "S61", + "name": "Chai Chee Street", + "location": { + "latitude": 1.323, + "longitude": 103.9217 + } + }, + { + "id": "S114", + "device_id": "S114", + "name": "Choa Chu Kang Avenue 4", + "location": { + "latitude": 1.38, + "longitude": 103.73 + } + }, + { + "id": "S11", + "device_id": "S11", + "name": "Choa Chu Kang Road", + "location": { + "latitude": 1.3746, + "longitude": 103.6938 + } + }, + { + "id": "S50", + "device_id": "S50", + "name": "Clementi Road", + "location": { + "latitude": 1.3337, + "longitude": 103.7768 + } + }, + { + "id": "S101", + "device_id": "S101", + "name": "Corporation Road", + "location": { + "latitude": 1.35053, + "longitude": 103.7134 + } + }, + { + "id": "S107", + "device_id": "S107", + "name": "East Coast Parkway", + "location": { + "latitude": 1.3135, + "longitude": 103.9625 + } + }, + { + "id": "S118", + "device_id": "S118", + "name": "Handy Road", + "location": { + "latitude": 1.2994, + "longitude": 103.8461 + } + }, + { + "id": "S120", + "device_id": "S120", + "name": "Holland Road", + "location": { + "latitude": 1.30874, + "longitude": 103.818 + } + }, + { + "id": "S33", + "device_id": "S33", + "name": "Jurong Pier Road", + "location": { + "latitude": 1.3081, + "longitude": 103.71 + } + }, + { + "id": "S71", + "device_id": "S71", + "name": "Kent Ridge Road", + "location": { + "latitude": 1.2923, + "longitude": 103.7815 + } + }, + { + "id": "S43", + "device_id": "S43", + "name": "Kim Chuan Road", + "location": { + "latitude": 1.3399, + "longitude": 103.8878 + } + }, + { + "id": "S66", + "device_id": "S66", + "name": "Kranji Way", + "location": { + "latitude": 1.4387, + "longitude": 103.7363 + } + }, + { + "id": "S112", + "device_id": "S112", + "name": "Lim Chu Kang Road", + "location": { + "latitude": 1.43854, + "longitude": 103.70131 + } + }, + { + "id": "S07", + "device_id": "S07", + "name": "Lornie Road", + "location": { + "latitude": 1.3415, + "longitude": 103.8334 + } + }, + { + "id": "S40", + "device_id": "S40", + "name": "Mandai Lake Road", + "location": { + "latitude": 1.4044, + "longitude": 103.78962 + } + }, + { + "id": "S108", + "device_id": "S108", + "name": "Marina Gardens Drive", + "location": { + "latitude": 1.2799, + "longitude": 103.8703 + } + }, + { + "id": "S113", + "device_id": "S113", + "name": "Marine Parade Road", + "location": { + "latitude": 1.30648, + "longitude": 103.9104 + } + }, + { + "id": "S44", + "device_id": "S44", + "name": "Nanyang Avenue", + "location": { + "latitude": 1.34583, + "longitude": 103.68166 + } + }, + { + "id": "S119", + "device_id": "S119", + "name": "Nicoll Highway", + "location": { + "latitude": 1.30105, + "longitude": 103.8666 + } + }, + { + "id": "S121", + "device_id": "S121", + "name": "Old Choa Chu Kang Road", + "location": { + "latitude": 1.37288, + "longitude": 103.72244 + } + }, + { + "id": "S35", + "device_id": "S35", + "name": "Old Toh Tuck Road", + "location": { + "latitude": 1.3329, + "longitude": 103.7556 + } + }, + { + "id": "S29", + "device_id": "S29", + "name": "Pasir Ris Drive 12", + "location": { + "latitude": 1.387, + "longitude": 103.935 + } + }, + { + "id": "S94", + "device_id": "S94", + "name": "Pasir Ris Street 51", + "location": { + "latitude": 1.3662, + "longitude": 103.9528 + } + }, + { + "id": "S78", + "device_id": "S78", + "name": "Poole Road", + "location": { + "latitude": 1.30703, + "longitude": 103.89067 + } + }, + { + "id": "S81", + "device_id": "S81", + "name": "Punggol Central", + "location": { + "latitude": 1.4029, + "longitude": 103.9092 + } + }, + { + "id": "S111", + "device_id": "S111", + "name": "Scotts Road", + "location": { + "latitude": 1.31055, + "longitude": 103.8365 + } + }, + { + "id": "S900", + "device_id": "S900", + "name": "Seletar Aerospace View", + "location": { + "latitude": 1.41284, + "longitude": 103.86922 + } + }, + { + "id": "S60", + "device_id": "S60", + "name": "Sentosa", + "location": { + "latitude": 1.25, + "longitude": 103.8279 + } + }, + { + "id": "S46", + "device_id": "S46", + "name": "Sime Road", + "location": { + "latitude": 1.3416, + "longitude": 103.8106 + } + }, + { + "id": "S84", + "device_id": "S84", + "name": "Simei Avenue", + "location": { + "latitude": 1.3437, + "longitude": 103.9444 + } + }, + { + "id": "S79", + "device_id": "S79", + "name": "Somerset Road", + "location": { + "latitude": 1.3004, + "longitude": 103.8372 + } + }, + { + "id": "S92", + "device_id": "S92", + "name": "South Buona Vista Road", + "location": { + "latitude": 1.2841, + "longitude": 103.7886 + } + }, + { + "id": "S88", + "device_id": "S88", + "name": "Toa Payoh North", + "location": { + "latitude": 1.3427, + "longitude": 103.8482 + } + }, + { + "id": "S123", + "device_id": "S123", + "name": "Towner Road", + "location": { + "latitude": 1.3214, + "longitude": 103.8577 + } + }, + { + "id": "S89", + "device_id": "S89", + "name": "Tuas Road", + "location": { + "latitude": 1.31985, + "longitude": 103.66162 + } + }, + { + "id": "S115", + "device_id": "S115", + "name": "Tuas South Avenue 3", + "location": { + "latitude": 1.29377, + "longitude": 103.61843 + } + }, + { + "id": "S82", + "device_id": "S82", + "name": "Tuas West Road", + "location": { + "latitude": 1.3247, + "longitude": 103.6351 + } + }, + { + "id": "S24", + "device_id": "S24", + "name": "Upper Changi Road North", + "location": { + "latitude": 1.3678, + "longitude": 103.9826 + } + }, + { + "id": "S69", + "device_id": "S69", + "name": "Upper Peirce Reservoir Park", + "location": { + "latitude": 1.37, + "longitude": 103.805 + } + }, + { + "id": "S08", + "device_id": "S08", + "name": "Upper Thomson Road", + "location": { + "latitude": 1.3701, + "longitude": 103.8271 + } + }, + { + "id": "S116", + "device_id": "S116", + "name": "West Coast Highway", + "location": { + "latitude": 1.281, + "longitude": 103.754 + } + }, + { + "id": "S100", + "device_id": "S100", + "name": "Woodlands Road", + "location": { + "latitude": 1.4172, + "longitude": 103.74855 + } + }, + { + "id": "S91", + "device_id": "S91", + "name": "Yishun Avenue 5", + "location": { + "latitude": 1.4301, + "longitude": 103.8308 + } + } + ], + "reading_type": "TB1 Rainfall 5 Minute Total F", + "reading_unit": "mm" + }, + "items": [ + { + "timestamp": "2018-11-09T02:35:00+08:00", + "readings": [ + { + "station_id": "S77", + "value": 0 + }, + { + "station_id": "S109", + "value": 0 + }, + { + "station_id": "S117", + "value": 0 + }, + { + "station_id": "S55", + "value": 0 + }, + { + "station_id": "S64", + "value": 0 + }, + { + "station_id": "S90", + "value": 0 + }, + { + "station_id": "S61", + "value": 0 + }, + { + "station_id": "S114", + "value": 0 + }, + { + "station_id": "S11", + "value": 0 + }, + { + "station_id": "S50", + "value": 0 + }, + { + "station_id": "S101", + "value": 0 + }, + { + "station_id": "S107", + "value": 0 + }, + { + "station_id": "S118", + "value": 0 + }, + { + "station_id": "S120", + "value": 0 + }, + { + "station_id": "S33", + "value": 0 + }, + { + "station_id": "S71", + "value": 0 + }, + { + "station_id": "S43", + "value": 0 + }, + { + "station_id": "S66", + "value": 0 + }, + { + "station_id": "S112", + "value": 0 + }, + { + "station_id": "S07", + "value": 0 + }, + { + "station_id": "S40", + "value": 0 + }, + { + "station_id": "S108", + "value": 0 + }, + { + "station_id": "S113", + "value": 0 + }, + { + "station_id": "S44", + "value": 0 + }, + { + "station_id": "S119", + "value": 0 + }, + { + "station_id": "S121", + "value": 0 + }, + { + "station_id": "S35", + "value": 0 + }, + { + "station_id": "S29", + "value": 0 + }, + { + "station_id": "S94", + "value": 0 + }, + { + "station_id": "S78", + "value": 0 + }, + { + "station_id": "S81", + "value": 0 + }, + { + "station_id": "S111", + "value": 0 + }, + { + "station_id": "S900", + "value": 0 + }, + { + "station_id": "S60", + "value": 0 + }, + { + "station_id": "S46", + "value": 0 + }, + { + "station_id": "S84", + "value": 0 + }, + { + "station_id": "S79", + "value": 0 + }, + { + "station_id": "S92", + "value": 0 + }, + { + "station_id": "S88", + "value": 0 + }, + { + "station_id": "S123", + "value": 0 + }, + { + "station_id": "S89", + "value": 0 + }, + { + "station_id": "S115", + "value": 0 + }, + { + "station_id": "S82", + "value": 0 + }, + { + "station_id": "S24", + "value": 0 + }, + { + "station_id": "S69", + "value": 0 + }, + { + "station_id": "S08", + "value": 0 + }, + { + "station_id": "S116", + "value": 0 + }, + { + "station_id": "S100", + "value": 0 + }, + { + "station_id": "S91", + "value": 0 + } + ] + } + ], + "api_info": { + "status": "healthy" + } +} \ No newline at end of file diff --git a/deans-frontend/src/api/__mockData__/temperature.json b/deans-frontend/src/api/__mockData__/temperature.json new file mode 100644 index 0000000..62292d6 --- /dev/null +++ b/deans-frontend/src/api/__mockData__/temperature.json @@ -0,0 +1,174 @@ +{ + "metadata": { + "stations": [ + { + "id": "S109", + "device_id": "S109", + "name": "Ang Mo Kio Avenue 5", + "location": { + "latitude": 1.3764, + "longitude": 103.8492 + } + }, + { + "id": "S117", + "device_id": "S117", + "name": "Banyan Road", + "location": { + "latitude": 1.256, + "longitude": 103.679 + } + }, + { + "id": "S50", + "device_id": "S50", + "name": "Clementi Road", + "location": { + "latitude": 1.3337, + "longitude": 103.7768 + } + }, + { + "id": "S107", + "device_id": "S107", + "name": "East Coast Parkway", + "location": { + "latitude": 1.3135, + "longitude": 103.9625 + } + }, + { + "id": "S108", + "device_id": "S108", + "name": "Marina Gardens Drive", + "location": { + "latitude": 1.2799, + "longitude": 103.8703 + } + }, + { + "id": "S44", + "device_id": "S44", + "name": "Nanyang Avenue", + "location": { + "latitude": 1.34583, + "longitude": 103.68166 + } + }, + { + "id": "S121", + "device_id": "S121", + "name": "Old Choa Chu Kang Road", + "location": { + "latitude": 1.37288, + "longitude": 103.72244 + } + }, + { + "id": "S111", + "device_id": "S111", + "name": "Scotts Road", + "location": { + "latitude": 1.31055, + "longitude": 103.8365 + } + }, + { + "id": "S60", + "device_id": "S60", + "name": "Sentosa", + "location": { + "latitude": 1.25, + "longitude": 103.8279 + } + }, + { + "id": "S24", + "device_id": "S24", + "name": "Upper Changi Road North", + "location": { + "latitude": 1.3678, + "longitude": 103.9826 + } + }, + { + "id": "S116", + "device_id": "S116", + "name": "West Coast Highway", + "location": { + "latitude": 1.281, + "longitude": 103.754 + } + }, + { + "id": "S100", + "device_id": "S100", + "name": "Woodlands Road", + "location": { + "latitude": 1.4172, + "longitude": 103.74855 + } + } + ], + "reading_type": "DBT 1M F", + "reading_unit": "deg C" + }, + "items": [ + { + "timestamp": "2018-11-09T02:40:00+08:00", + "readings": [ + { + "station_id": "S109", + "value": 26 + }, + { + "station_id": "S117", + "value": 28.1 + }, + { + "station_id": "S50", + "value": 26.2 + }, + { + "station_id": "S107", + "value": 27.4 + }, + { + "station_id": "S108", + "value": 27.6 + }, + { + "station_id": "S44", + "value": 26.3 + }, + { + "station_id": "S121", + "value": 26.7 + }, + { + "station_id": "S111", + "value": 26.9 + }, + { + "station_id": "S60", + "value": 27.8 + }, + { + "station_id": "S24", + "value": 26.4 + }, + { + "station_id": "S116", + "value": 27.4 + }, + { + "station_id": "S100", + "value": 26.6 + } + ] + } + ], + "api_info": { + "status": "healthy" + } +} \ No newline at end of file diff --git a/deans-frontend/src/api/__mocks__/index.js b/deans-frontend/src/api/__mocks__/index.js new file mode 100644 index 0000000..155884f --- /dev/null +++ b/deans-frontend/src/api/__mocks__/index.js @@ -0,0 +1,11 @@ +const fs = require("fs"); + +// test fetch crises +export const getCrises = () => + new Promise((resolve, reject) => { + // load mockedData + fs.readFile("src/api/__mockData__/crises.json", "utf8", (err, data) => { + if (err) reject(err); + resolve(JSON.parse(data)); + }); + }); diff --git a/deans-frontend/src/api/__tests__/index.test.js b/deans-frontend/src/api/__tests__/index.test.js new file mode 100644 index 0000000..ca342e1 --- /dev/null +++ b/deans-frontend/src/api/__tests__/index.test.js @@ -0,0 +1,53 @@ +jest.mock("../index.js"); // this will search for index.js at __mocks__ folder + +const api = require("../index.js"); // this will search for index.js at api folder + +describe("getCrises()", () => { + it("should load crises", () => { + return api.getCrises().then(data => { + expect(data).toBeDefined(); + }); + }); +}); + +describe("getCrisisType()", () => { + it("should load crisis type", () => { + return new Promise(resolve => resolve(true)); // TODO + }); +}); + +describe("getAssistanceType()", () => { + it("should load assistance type", () => { + return new Promise(resolve => resolve(true)); // TODO + }); +}); + +describe("getEmergencyAgencies()", () => { + it("should load emergency agencies", () => { + return new Promise(resolve => resolve(true)); // TODO + }); +}); + +describe("getHumidity()", () => { + it("should load humidity", () => { + return new Promise(resolve => resolve(true)); // TODO + }); +}); + +describe("getPSI()", () => { + it("should load PSI", () => { + return new Promise(resolve => resolve(true)); // TODO + }); +}); + +describe("getRainfall()", () => { + it("should load rainfall", () => { + return new Promise(resolve => resolve(true)); // TODO + }); +}); + +describe("getTemperature()", () => { + it("should load temperature", () => { + return new Promise(resolve => resolve(true)); // TODO + }); +}); diff --git a/deans-frontend/src/api/index.js b/deans-frontend/src/api/index.js new file mode 100644 index 0000000..2a00314 --- /dev/null +++ b/deans-frontend/src/api/index.js @@ -0,0 +1,176 @@ +import axios from "axios"; + +axios.defaults.baseURL = "http://localhost:8000/api"; +axios.defaults.timeout = 5000; + +const _getCSRFToken = () => { + const cookies = document.cookie ? document.cookie.split("; ") : []; + let csrftoken = ""; + cookies.forEach(cookie => { + if (cookie.slice(0, 9) === "csrftoken") { + csrftoken = cookie.slice(10); + } + }); + return csrftoken; +}; + +const _getAuthToken = () => { + return localStorage.getItem("token"); +}; + +export const getCrises = () => { + return axios.get("/crises/"); +}; + +export const reportCrises = form => { + if (form) form.append("csrfmiddlewaretoken", _getCSRFToken()); + return axios.post("/crises/", form); +}; + +export const userLogin = form => { + if (form) form.append("csrfmiddlewaretoken", _getCSRFToken()); + return axios.post("/rest-auth/login/", form); // it is important to keep the ending slash +}; + +export const userLogout = () => { + const form = new FormData(); + form.append("csrfmiddlewaretoken", _getCSRFToken()); + return axios.post("/rest-auth/logout/", form); // it is important to keep the ending slash +}; + +export const getUserList = () => { + return axios.get("/users/", { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const getCrisisType = () => { + return axios.get("/crisistype/"); +}; + +export const getAssistanceType = () => { + return axios.get("/crisisassistance/"); +}; + +export const dispatchCrisis = (id, phoneNumberToNotify) => { + return axios.put( + "/crises/update-partial/" + id + "/", + { + crisis_status: "DP", + phone_number_to_notify: phoneNumberToNotify + }, + { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + } + ); +}; + +export const resolveCrisis = (id, undo) => { + return axios.put( + "/crises/update-partial/" + id + "/", + { + crisis_status: undo ? "PD" : "RS" + }, + { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + } + ); +}; + +export const addUser = form => { + return axios.post("/users/", form, { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const editUser = (id, form) => { + return axios.put("/users/update-partial/" + id + "/", form, { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const addCrisisType = form => { + return axios.post("/crisistype/", form, { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const addAssistanceType = form => { + return axios.post("/crisisassistance/", form, { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const getEmergencyAgencies = () => { + return axios.get("/emergencyagencies/"); +}; + +export const addEmergencyAgencies = form => { + return axios.post("/emergencyagencies/", form, { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const editEmergencyAgencies = (id, form) => { + return axios.put("/emergencyagencies/update-partial/" + id + "/", form, { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const editSiteSettings = form => { + return axios.post("/sitesettings/", form, { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const getCurrentUser = () => { + return axios.get("/rest-auth/user/", { + headers: { + Authorization: `Token ${_getAuthToken()}` + } + }); +}; + +export const createWebSocket = () => { + return new WebSocket("ws://localhost:8000/api/ws/crises/"); +}; + +// from data.gov.sg +export const getHumidity = () => { + return axios.get("https://api.data.gov.sg/v1/environment/relative-humidity"); +}; + +// from data.gov.sg +export const getPSI = () => { + return axios.get("https://api.data.gov.sg/v1/environment/psi"); +}; + +// from data.gov.sg +export const getRainfall = () => { + return axios.get("https://api.data.gov.sg/v1/environment/rainfall"); +}; + +// from data.gov.sg +export const getTemperature = () => { + return axios.get("https://api.data.gov.sg/v1/environment/air-temperature"); +}; diff --git a/deans-frontend/src/assets/logo.png b/deans-frontend/src/assets/logo.png new file mode 100644 index 0000000..3107d8f Binary files /dev/null and b/deans-frontend/src/assets/logo.png differ diff --git a/deans-frontend/src/assets/pin.png b/deans-frontend/src/assets/pin.png new file mode 100644 index 0000000..43a35fd Binary files /dev/null and b/deans-frontend/src/assets/pin.png differ diff --git a/deans-frontend/src/components/Footer/index.js b/deans-frontend/src/components/Footer/index.js new file mode 100644 index 0000000..ee8e80d --- /dev/null +++ b/deans-frontend/src/components/Footer/index.js @@ -0,0 +1,13 @@ +import React from "react"; +import * as styles from "./style.scss"; + +export default () => ( +
+
Dean © 2018. Made with ❤️.
+
+ Follow us on Facebook{" "} + and Twitter to receive latest + crisis updates! +
+
+); diff --git a/deans-frontend/src/components/Footer/style.scss b/deans-frontend/src/components/Footer/style.scss new file mode 100644 index 0000000..d3e1cb4 --- /dev/null +++ b/deans-frontend/src/components/Footer/style.scss @@ -0,0 +1,10 @@ +:local { + .container { + margin-top: 3rem; + padding: 1.5rem 3rem; + background-color: rgba(250, 250, 250, .7); + width: 100%; + display: flex; + justify-content: space-between; + } +} \ No newline at end of file diff --git a/deans-frontend/src/components/GMap/index.js b/deans-frontend/src/components/GMap/index.js new file mode 100644 index 0000000..f639856 --- /dev/null +++ b/deans-frontend/src/components/GMap/index.js @@ -0,0 +1,104 @@ +import React, { Component } from "react"; +import { connect } from "react-redux"; +import Marker from "@components/Marker"; +import PropTypes from "prop-types"; +import GoogleMapReact from "google-map-react"; +import { geocodeByAddress, getLatLng } from "react-places-autocomplete"; + +class GMap extends Component { + state = { + crises: {} + }; + + componentDidMount = () => { + this.loadCrisesIntoState(); + }; + + componentDidUpdate = prevProps => { + if (prevProps.crises !== this.props.crises) { + this.loadCrisesIntoState(); + } + }; + + createMarker = () => { + const { crises } = this.state; + const { crisisType } = this.props; + if (Object.keys(crises).length === 0) return null; + return Object.keys(crises).map(index => { + const crisis = crises[index]; + const lat = crisis.lat; + const lng = crisis.lng; + const type = crisis.type; + const location = crisis.location; + const description = crisis.description; + return ( + + ); + }); + }; + + loadCrisesIntoState = () => { + // this.setState({ crises: {} }); // clear cached crisis + this.props.crises.forEach(crisis => { + const id = crisis.crisis_id; + const type = crisis.crisis_type; + const description = crisis.crisis_description; + geocodeByAddress(crisis.crisis_location1) + .then(geoCode => getLatLng(geoCode[0])) + .then(location => { + this.setState({ + crises: { + ...this.state.crises, + [id]: { + lat: location && location["lat"], + lng: location && location["lng"], + location: crisis.crisis_location1, + type: type, + description: description + } + } + }); + }); + }); + }; + + render() { + return ( + // Important! Always set the container height explicitly +
+ + {this.createMarker()} + +
+ ); + } +} + +GMap.propTypes = { + crises: PropTypes.array.isRequired, + crisisType: PropTypes.array +}; + +const mapStateToProps = state => { + const { system } = state; + return { + crisisType: system && system.crisisType + }; +}; + +export default connect(mapStateToProps)(GMap); diff --git a/deans-frontend/src/components/Marker/index.js b/deans-frontend/src/components/Marker/index.js new file mode 100644 index 0000000..fbda3c1 --- /dev/null +++ b/deans-frontend/src/components/Marker/index.js @@ -0,0 +1,33 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Popover } from "antd"; +import pin from "@assets/pin.png"; + +import * as styles from "./style.scss"; + +const Marker = props => { + const { crisisType, location } = props; + return ( +
+ crisisType[type]).join(", ")} + content={location.replace(/"/g, "")} + > + {/* */} + + +
+ ); +}; + +Marker.propTypes = { + lat: PropTypes.number.isRequired, + lng: PropTypes.number.isRequired, + location: PropTypes.string.isRequired, + crisisType: PropTypes.array, + type: PropTypes.array.isRequired, + description: PropTypes.string +}; + +export default Marker; diff --git a/deans-frontend/src/components/Marker/style.scss b/deans-frontend/src/components/Marker/style.scss new file mode 100644 index 0000000..457847f --- /dev/null +++ b/deans-frontend/src/components/Marker/style.scss @@ -0,0 +1,24 @@ +:local { + @keyframes jump { + from { transform: translate3d(0, 0, 0); } + to { transform: translate3d(0, 20%, 0); } + // 100% { transform: translate3d(0,100%,0); } + } + + .container { + font-size: 1.2rem; + color: crimson; + cursor: pointer; + padding: 0.5rem; + border-radius: 5rem; + display: flex; + align-items: center; + // transform-origin: 25% 25%; + animation: jump 0.8s alternate infinite; + animation-timing-function: cubic-bezier(.5,.5,.5,.5); + + &:hover { + background-color: rgba(250,250,250,.7) + } + } +} \ No newline at end of file diff --git a/deans-frontend/src/components/NavBar/index.js b/deans-frontend/src/components/NavBar/index.js new file mode 100644 index 0000000..b7e07eb --- /dev/null +++ b/deans-frontend/src/components/NavBar/index.js @@ -0,0 +1,87 @@ +import React from "react"; +import { Popover, Button, message } from "antd"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +import { getCurrentUser, userLogout } from "@redux/actions"; +import { Link } from "react-router-dom"; +import logo from "@assets/logo.png"; + +import * as styles from "./style.scss"; + +class NavBar extends React.Component { + componentDidMount() { + this.props.getCurrentUser(); + } + + render() { + const { currentUser } = this.props; + return ( +
+
+
+ + + +
+
+ Dean's Crisis Management System +
+
+ Home +
+
+ Report +
+
+
+
+ {currentUser ? ( + { + this.props.userLogout().then(() => { + message.success("You are logged out"); + location.assign("/"); + }); + }} + > + Logout + + } + > + {currentUser} + + ) : ( + Login + )} +
+
+
+ ); + } +} + +NavBar.propTypes = { + getCurrentUser: PropTypes.func.isRequired, + userLogout: PropTypes.func.isRequired, + currentUser: PropTypes.string +}; + +const mapStateToProps = state => { + const { staff } = state; + return { + currentUser: staff && staff.currentUser + }; +}; + +const mapDispatchToProps = dispatch => ({ + getCurrentUser: () => dispatch(getCurrentUser()), + userLogout: () => dispatch(userLogout()) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(NavBar); diff --git a/deans-frontend/src/components/NavBar/style.scss b/deans-frontend/src/components/NavBar/style.scss new file mode 100644 index 0000000..d6697a5 --- /dev/null +++ b/deans-frontend/src/components/NavBar/style.scss @@ -0,0 +1,43 @@ +:local { + .container { + display: flex; + width: 100%; + height: 4rem; + background-color: rgba(250,250,250,.7); + align-items: center; + box-shadow: 0 2px 10px rgba(0,0,0,.15); + padding: 0 3rem; + justify-content: space-between; + z-index: 9999999; + } + + .left, .right { + display: flex; + flex-direction: row; + align-items: center; + } + + .logo { + height: 2rem; + width: 2rem; + } + + .brand { + color: black; + font-variant: small-caps; + cursor: default; + font-size: 1.2rem !important; + a { + color: black !important; + text-decoration: none !important; + } + } + + .item { + a { + color: rgba(17,17,17,.5); + } + margin-right: 2rem; + font-size: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/components/RealTimeCrisisStatus/index.js b/deans-frontend/src/components/RealTimeCrisisStatus/index.js new file mode 100644 index 0000000..26f3bea --- /dev/null +++ b/deans-frontend/src/components/RealTimeCrisisStatus/index.js @@ -0,0 +1,44 @@ +import React from "react"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import { Icon } from "antd"; +import * as styles from "./style.scss"; + +const RealTimeCrisisStatus = props => { + const { crises } = props || []; + const num = + crises && crises.filter(crisis => crisis.crisis_status === "DP").length; + return ( +
+
+ Crisis Overview +
+
+ Active crisis: {num} +
+
+ Internet Status: + {" "} + Online +
+
+ ); +}; + +RealTimeCrisisStatus.propTypes = { + crises: PropTypes.array +}; + +const mapStateToProps = state => { + const { common } = state; + return { + crises: common && common.crises + }; +}; + +export default connect(mapStateToProps)(RealTimeCrisisStatus); diff --git a/deans-frontend/src/components/RealTimeCrisisStatus/style.scss b/deans-frontend/src/components/RealTimeCrisisStatus/style.scss new file mode 100644 index 0000000..a669e6e --- /dev/null +++ b/deans-frontend/src/components/RealTimeCrisisStatus/style.scss @@ -0,0 +1,10 @@ +:local { + .container { + display: flex; + width: 100%; + flex-direction: column; + box-shadow: 0 2px 10px rgba(0,0,0,.15); + position: sticky; + padding: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/components/RealTimePSI/index.js b/deans-frontend/src/components/RealTimePSI/index.js new file mode 100644 index 0000000..91ba9d4 --- /dev/null +++ b/deans-frontend/src/components/RealTimePSI/index.js @@ -0,0 +1,69 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +// import { Icon } from "antd"; +import * as styles from "./style.scss"; + +const RealTimePSI = props => { + const { psi } = props; + const status = psi && psi.status; + const hourly = psi && psi.hourly; + const { national, west, east, central, south, north } = hourly || {}; + return ( +
+
+ Pollution Overview +
+
+ Current Status:{" "} + + {status} + +
+
+ Max PSI of Past Hour +
+
+ National: {national} +
+
+ East: {east} +
+
+ South: {south} +
+
+ West: {west} +
+
+ North: {north} +
+
+ Central: {central} +
+ {/*
+ Internet Status: + {" "} + Online +
*/} +
+ ); +}; + +RealTimePSI.propTypes = { + psi: PropTypes.object +}; + +const mapStateToProps = state => { + const { common } = state; + return { + psi: common && common.psi + }; +}; + +export default connect(mapStateToProps)(RealTimePSI); diff --git a/deans-frontend/src/components/RealTimePSI/style.scss b/deans-frontend/src/components/RealTimePSI/style.scss new file mode 100644 index 0000000..a669e6e --- /dev/null +++ b/deans-frontend/src/components/RealTimePSI/style.scss @@ -0,0 +1,10 @@ +:local { + .container { + display: flex; + width: 100%; + flex-direction: column; + box-shadow: 0 2px 10px rgba(0,0,0,.15); + position: sticky; + padding: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/components/RealTimeWeather/index.js b/deans-frontend/src/components/RealTimeWeather/index.js new file mode 100644 index 0000000..dc071b2 --- /dev/null +++ b/deans-frontend/src/components/RealTimeWeather/index.js @@ -0,0 +1,42 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +// import { Icon } from "antd"; +import * as styles from "./style.scss"; + +const RealTimeWeather = props => { + const { temperature, humidity, rainfall } = props; + return ( +
+
+ Weather Overview +
+
+ Temperature: {temperature + "°C"} +
+
+ Humidity: {humidity + "%"} +
+
+ Rainfall: {rainfall + "mm"} +
+
+ ); +}; + +RealTimeWeather.propTypes = { + temperature: PropTypes.number, + humidity: PropTypes.number, + rainfall: PropTypes.number +}; + +const mapStateToProps = state => { + const { common } = state; + return { + temperature: common && common.temperature, + humidity: common && common.humidity, + rainfall: common && common.rainfall + }; +}; + +export default connect(mapStateToProps)(RealTimeWeather); diff --git a/deans-frontend/src/components/RealTimeWeather/style.scss b/deans-frontend/src/components/RealTimeWeather/style.scss new file mode 100644 index 0000000..a669e6e --- /dev/null +++ b/deans-frontend/src/components/RealTimeWeather/style.scss @@ -0,0 +1,10 @@ +:local { + .container { + display: flex; + width: 100%; + flex-direction: column; + box-shadow: 0 2px 10px rgba(0,0,0,.15); + position: sticky; + padding: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/ModalContainer/AddUser/index.js b/deans-frontend/src/containers/ModalContainer/AddUser/index.js new file mode 100644 index 0000000..d600523 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/AddUser/index.js @@ -0,0 +1,109 @@ +import React from "react"; +import { connect } from "react-redux"; +import { addUser } from "@redux/actions"; +import PropTypes from "prop-types"; +import Modal from "antd/lib/modal"; +import { Form, Input, Icon, Checkbox, Button, message } from "antd"; +import * as styles from "./style.scss"; + +const FormItem = Form.Item; + +class _AddUserForm extends React.Component { + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (!err) { + const { username, password, isAdmin } = values; + const form = new FormData(); + form.append("username", username); + form.append("password", password); + form.append("is_staff", isAdmin); + this.props.addUser(form).then(() => { + message.success("A new user has been created!"); + location.reload(); + }); + } + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + return ( +
+ + {getFieldDecorator("username", { + rules: [{ required: true, message: "Please input username!" }] + })( + } + placeholder="Username" + /> + )} + + + {getFieldDecorator("password", { + rules: [{ required: true, message: "Please input password!" }] + })( + } + type="password" + placeholder="Password" + /> + )} + + + {getFieldDecorator("isAdmin", { + valuePropName: "checked", + initialValue: false + })( + + This user is an admin user + + )} + + +
+ ); + } +} + +_AddUserForm.propTypes = { + form: PropTypes.object.isRequired, + addUser: PropTypes.func.isRequired +}; + +const AddUser = props => { + const AddUserForm = Form.create()(_AddUserForm); + const { addUser } = props; + return ( + + + + ); +}; + +AddUser.propTypes = { + hideModal: PropTypes.func.isRequired, + addUser: PropTypes.func.isRequired +}; + +const mapDispatchToProps = dispatch => ({ + addUser: form => dispatch(addUser(form)) +}); + +export default connect( + null, + mapDispatchToProps +)(AddUser); diff --git a/deans-frontend/src/containers/ModalContainer/AddUser/style.scss b/deans-frontend/src/containers/ModalContainer/AddUser/style.scss new file mode 100644 index 0000000..7c17cfc --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/AddUser/style.scss @@ -0,0 +1,10 @@ +:local { + .check { + width: 100%; + } + + .createButton { + margin-top: 1rem; + width: 100%; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/CrisisReportForm/index.js b/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/CrisisReportForm/index.js new file mode 100644 index 0000000..d94a218 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/CrisisReportForm/index.js @@ -0,0 +1,281 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Form, Input, Tooltip, Icon, Select, Button, message } from "antd"; +import PlacesAutocomplete, { + geocodeByAddress, + getLatLng +} from "react-places-autocomplete"; + +const FormItem = Form.Item; +const Option = Select.Option; + +const createSelectionList = obj => + Object.keys(obj).map((val, index) => ( + + )); + +class CrisisReportForm extends React.Component { + state = { + confirmDirty: false, + address: "", + gps: null + }; + + handleChange = () => null; // dummy + + handleSelect = address => { + geocodeByAddress(address) + .then(results => { + return getLatLng(results[0]); + }) + .then(gps => { + this.setState({ gps, address }); + this.props.form.setFieldsValue({ + location: address + }); + }) + .catch(error => console.error("Error", error)); + }; + + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + const { + name, + phone, + location_2, + crisisType, + crisisDescription, + assistanceType, + assistanceDescription + } = values; + const form = new FormData(); + form.append("your_name", name); + form.append("mobile_number", phone); + if (crisisType && crisisType.length > 0) { + for (const type of crisisType) { + form.append("crisis_type", type); + } + } + if (assistanceType && assistanceType.length > 0) { + for (const type of assistanceType) { + form.append("crisis_assistance", type); + } + } + form.append("crisis_status", "PD"); + form.append("crisis_location1", JSON.stringify(this.state.address)); // important because object makes no sense in REST + form.append( + "crisis_location2", + typeof location_2 === "undefined" ? "" : location_2 + ); + form.append( + "crisis_description", + typeof crisisDescription === "undefined" ? "" : crisisDescription + ); + form.append( + "crisis_assistance_description", + typeof assistanceDescription === "undefined" ? "" : crisisDescription + ); + this.props + .reportCrises(form) + .then(() => { + message.success("Success!"); + this.props.getCrises(); + this.props.hideModal(); + }) + .catch(error => console.log(error)); + } + }); + }; + + handleConfirmBlur = e => { + const value = e.target.value; + this.setState({ confirmDirty: this.state.confirmDirty || !!value }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + + const formItemLayout = { + labelCol: { + sm: { span: 8 } + }, + wrapperCol: { + sm: { span: 15 } + } + }; + const prefixSelector = getFieldDecorator("prefix", { + initialValue: "65" + })( + + ); + + return ( +
+ + Your Name  + + + + + } + > + {getFieldDecorator("name", { + rules: [ + { + required: true, + message: "Please input your name!", + whitespace: true + } + ] + })()} + + + {getFieldDecorator("phone", { + rules: [ + { required: true, message: "Please input your mobile number!" } + ] + })()} + + Location}> + {getFieldDecorator("location", { + rules: [ + { + required: true, + message: "Please input the location!", + whitespace: true + } + ] + })( + + {({ + getInputProps, + suggestions, + getSuggestionItemProps, + loading + }) => { + return ( + + +
+ {loading &&
Loading...
} + {suggestions.map((suggestion, index) => { + const className = suggestion.active + ? "suggestion-item--active" + : "suggestion-item"; + // inline style for demonstration purpose + const style = suggestion.active + ? { backgroundColor: "#fafafa", cursor: "pointer" } + : { backgroundColor: "#ffffff", cursor: "pointer" }; + return ( +
+ {suggestion.description} +
+ ); + })} +
+
+ ); + }} +
+ )} +
+ Location 2}> + {getFieldDecorator("location_2", { + rules: [ + { + required: false, + whitespace: true + } + ] + })()} + + + {getFieldDecorator("crisisType", { + rules: [ + { + type: "array", + required: true, + message: "Please select crisis type!" + } + ] + })( + + )} + + + {getFieldDecorator("crisisDescription", { + rules: [{ required: false }] + })( + + )} + + + {getFieldDecorator("assistanceType", { + rules: [ + { + type: "array", + required: false + } + ] + })( + + )} + + + {getFieldDecorator("assistanceDescription", { + rules: [{ required: false }] + })( + + )} + + + + +
+ ); + } +} + +CrisisReportForm.propTypes = { + crisisType: PropTypes.array.isRequired, + assistanceType: PropTypes.array.isRequired, + reportCrises: PropTypes.func.isRequired, + getCrises: PropTypes.func.isRequired, + hideModal: PropTypes.func.isRequired +}; + +export default Form.create()(CrisisReportForm); diff --git a/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/index.js b/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/index.js new file mode 100644 index 0000000..bc31ec7 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/index.js @@ -0,0 +1,28 @@ +import React from "react"; +import PropTypes from "prop-types"; +import Modal from "antd/lib/modal"; +import CrisisReportForm from "./CrisisReportForm"; + +const CreateNewCrisis = props => { + return ( + + + + ); +}; + +CreateNewCrisis.propTypes = { + hideModal: PropTypes.func.isRequired, + crisisType: PropTypes.object.isRequired, + assistanceType: PropTypes.object.isRequired, + reportCrises: PropTypes.func.isRequired, + getCrises: PropTypes.func.isRequired +}; + +export default CreateNewCrisis; diff --git a/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/style.scss b/deans-frontend/src/containers/ModalContainer/CreateNewCrisis/style.scss new file mode 100644 index 0000000..e69de29 diff --git a/deans-frontend/src/containers/ModalContainer/DispatchCrisis/CrisisDispatchForm/index.js b/deans-frontend/src/containers/ModalContainer/DispatchCrisis/CrisisDispatchForm/index.js new file mode 100644 index 0000000..20c3575 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/DispatchCrisis/CrisisDispatchForm/index.js @@ -0,0 +1,93 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Form, Select, Button, message } from "antd"; + +const FormItem = Form.Item; +const Option = Select.Option; + +class CrisisDispatchForm extends React.Component { + state = { + confirmDirty: false, + autoCompleteResult: [] + }; + + createEmergencyAgenciesList = arr => + arr.map((val, index) => ( + + )); + + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + console.log("Received values of form: ", values); + const { agencies } = values; + const phoneNumbers = "[" + agencies.join(", ") + "]"; + this.props + .dispatchCrisis(this.props.crisisId, phoneNumbers) + .then(() => { + message.success("Dispatched!"); + this.props.hideModal(); + }) + .catch(() => null); + } + }); + }; + + handleConfirmBlur = e => { + const value = e.target.value; + this.setState({ confirmDirty: this.state.confirmDirty || !!value }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + + const formItemLayout = { + labelCol: { + sm: { span: 8 } + }, + wrapperCol: { + sm: { span: 15 } + } + }; + + return ( +
+ + {getFieldDecorator("agencies", { + rules: [ + { + type: "array", + required: true, + message: "Please select emergency agencies!" + } + ] + })( + + )} + + + + +
+ ); + } +} + +CrisisDispatchForm.propTypes = { + hideModal: PropTypes.func.isRequired, + crisisId: PropTypes.number.isRequired, + emergencyAgencies: PropTypes.array, + dispatchCrisis: PropTypes.func.isRequired +}; + +export default Form.create()(CrisisDispatchForm); diff --git a/deans-frontend/src/containers/ModalContainer/DispatchCrisis/CrisisDispatchForm/style.scss b/deans-frontend/src/containers/ModalContainer/DispatchCrisis/CrisisDispatchForm/style.scss new file mode 100644 index 0000000..e69de29 diff --git a/deans-frontend/src/containers/ModalContainer/DispatchCrisis/index.js b/deans-frontend/src/containers/ModalContainer/DispatchCrisis/index.js new file mode 100644 index 0000000..b50d110 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/DispatchCrisis/index.js @@ -0,0 +1,111 @@ +import React from "react"; +import { connect } from "react-redux"; +import { dispatchCrisis } from "@redux/actions"; +import PropTypes from "prop-types"; +import Modal from "antd/lib/modal"; +import CrisisDispatchForm from "./CrisisDispatchForm"; +import * as styles from "./style.scss"; + +const DispatchCrisis = props => { + const { + your_name, + mobile_number, + crisis_id, + crisis_location1, + crisis_location2, + crisis_time, + crisis_type, + crisis_description, + crisis_assistance, + crisis_assistance_description + } = props.crisis; + return ( + +
+
SUMMARY
+
+ The following information will be submitted to emergency agencies. +
+
+
Reported Time:
+
+ {(() => { + const date = new Date(crisis_time); + return date.toLocaleString("en", { + year: "numeric", + month: "short", + day: "numeric", + hour: "numeric", + minute: "numeric" + }); + })()} +
+
Reporter Name:
+
{your_name}
+
Mobile Number:
+
+65 {mobile_number}
+
Location:
+
+ {crisis_location1.replace(/"/g, "")} +
+
Location 2:
+
{crisis_location2}
+
Crisis Type:
+
+ {crisis_type.map(val => props.crisisType[val]).join(", ")} +
+
Crisis Description:
+
{crisis_description}
+
Assistance Type:
+
+ {crisis_assistance.map(val => props.assistanceType[val]).join(", ")} +
+
Assistance Description:
+
{crisis_assistance_description}
+
+
+
+ +
+
+ ); +}; + +DispatchCrisis.propTypes = { + hideModal: PropTypes.func.isRequired, + dispatchCrisis: PropTypes.func.isRequired, + crisis: PropTypes.object, + crisisType: PropTypes.object, + assistanceType: PropTypes.object, + emergencyAgencies: PropTypes.array +}; + +const mapStateToProps = state => { + const { system } = state; + return { + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType, + emergencyAgencies: system && system.emergencyAgencies + }; +}; + +const mapDispatchToProps = dispatch => ({ + dispatchCrisis: (id, phoneNumberToNotify) => + dispatch(dispatchCrisis(id, phoneNumberToNotify)) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(DispatchCrisis); diff --git a/deans-frontend/src/containers/ModalContainer/DispatchCrisis/style.scss b/deans-frontend/src/containers/ModalContainer/DispatchCrisis/style.scss new file mode 100644 index 0000000..d0aef81 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/DispatchCrisis/style.scss @@ -0,0 +1,30 @@ +:local { + .summaryHeader { + font-size: 1.2rem; + } + + .summaryHint { + font-size: 0.85rem; + margin-top: 0.5rem; + } + + .summaryContainer { + display: grid; + grid-template-rows: repeat(9, auto); + grid-template-columns: repeat(2, auto); + grid-row-gap: 0.5rem; + grid-column-gap: 2rem; + margin-top: 1rem; + padding: 0.5rem 0; + border-top: 1.5px solid #7f7f7f; + border-bottom: 1.5px solid #7f7f7f; + + .value { + color: #7f7f7f; + } + } + + .crisisDispatchForm { + margin-top: 1.5rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/ModalContainer/DoubleInput/index.js b/deans-frontend/src/containers/ModalContainer/DoubleInput/index.js new file mode 100644 index 0000000..74e3924 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/DoubleInput/index.js @@ -0,0 +1,99 @@ +import React from "react"; +import PropTypes from "prop-types"; +import Modal from "antd/lib/modal"; +import { Form, Input, Icon, Button } from "antd"; +import * as styles from "./style.scss"; + +const FormItem = Form.Item; + +class _Form extends React.Component { + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (!err) { + const { valueA, valueB } = values; + this.props.handler(valueA, valueB); + this.props.hideModal(); + } + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + const { labelA, labelB } = this.props; + return ( +
+ + {getFieldDecorator("valueA", { + rules: [{ required: true, message: `Please input ${labelA}!` }] + })( + } + type="text" + placeholder={`Enter ${labelA}...`} + /> + )} + + + {getFieldDecorator("valueB", { + rules: [{ required: true, message: `Please input ${labelB}!` }] + })( + } + type="text" + placeholder={`Enter ${labelB}...`} + /> + )} + + + + +
+ ); + } +} + +_Form.propTypes = { + form: PropTypes.object.isRequired, + labelA: PropTypes.string.isRequired, + labelB: PropTypes.string.isRequired, + handler: PropTypes.func.isRequired, + hideModal: PropTypes.func.isRequired +}; + +const DoubleInput = props => { + const EmbedForm = Form.create()(_Form); + const { handler, hideModal, labelA, labelB } = props; + return ( + + + + ); +}; + +DoubleInput.propTypes = { + hideModal: PropTypes.func.isRequired, + title: PropTypes.string.isRequired, + labelA: PropTypes.string.isRequired, + labelB: PropTypes.string.isRequired, + handler: PropTypes.func.isRequired +}; + +export default DoubleInput; diff --git a/deans-frontend/src/containers/ModalContainer/DoubleInput/style.scss b/deans-frontend/src/containers/ModalContainer/DoubleInput/style.scss new file mode 100644 index 0000000..7c17cfc --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/DoubleInput/style.scss @@ -0,0 +1,10 @@ +:local { + .check { + width: 100%; + } + + .createButton { + margin-top: 1rem; + width: 100%; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/ModalContainer/EditCrisis/CrisisEditForm/index.js b/deans-frontend/src/containers/ModalContainer/EditCrisis/CrisisEditForm/index.js new file mode 100644 index 0000000..a400e40 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/EditCrisis/CrisisEditForm/index.js @@ -0,0 +1,207 @@ +import React from "react"; +import { Form, Input, Tooltip, Icon, Select, Button } from "antd"; + +const FormItem = Form.Item; +const Option = Select.Option; + +const crisisType = [ + "Emergency Ambulance", + "Rescue and Evacuation", + "Fire Fighting", + "Gas Leak Control", + "Others (please specify in description)" +]; + +const assistanceType = [ + "Emergency Ambulance", + "Rescue and Evacuation", + "Fire Fighting", + "Gas Leak Control", + "Others (please specify in description)" +]; + +const createSelectionList = arr => + arr.map((value, index) => ( + + )); + +class CrisisEditForm extends React.Component { + state = { + confirmDirty: false + }; + + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + console.log("Received values of form: ", values); + } + }); + }; + + handleConfirmBlur = e => { + const value = e.target.value; + this.setState({ confirmDirty: this.state.confirmDirty || !!value }); + }; + + compareToFirstPassword = (rule, value, callback) => { + const form = this.props.form; + if (value && value !== form.getFieldValue("password")) { + callback("Two passwords that you enter is inconsistent!"); + } else { + callback(); + } + }; + + validateToNextPassword = (rule, value, callback) => { + const form = this.props.form; + if (value && this.state.confirmDirty) { + form.validateFields(["confirm"], { force: true }); + } + callback(); + }; + + handleWebsiteChange = value => { + let autoCompleteResult; + if (!value) { + autoCompleteResult = []; + } else { + autoCompleteResult = [".com", ".org", ".net"].map( + domain => `${value}${domain}` + ); + } + this.setState({ autoCompleteResult }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + + const formItemLayout = { + labelCol: { + sm: { span: 8 } + }, + wrapperCol: { + sm: { span: 15 } + } + }; + const prefixSelector = getFieldDecorator("prefix", { + initialValue: "65" + })( + + ); + + return ( +
+ + Your Name  + + + + + } + > + {getFieldDecorator("nickname", { + rules: [ + { + required: true, + message: "Please input your name!", + whitespace: true + } + ] + })()} + + + {getFieldDecorator("phone", { + rules: [ + { required: true, message: "Please input your mobile number!" } + ] + })()} + + Location}> + {getFieldDecorator("location", { + rules: [ + { + required: true, + message: "Please input the location!", + whitespace: true + } + ] + })()} + + Location 2}> + {getFieldDecorator("location_2", { + rules: [ + { + required: false, + whitespace: true + } + ] + })()} + + + {getFieldDecorator("crisisType", { + rules: [ + { + type: "array", + required: true, + message: "Please select crisis type!" + } + ] + })( + + )} + + + {getFieldDecorator("others", { + rules: [{ required: false }] + })( + + )} + + + {getFieldDecorator("assistanceType", { + rules: [ + { + type: "array", + required: false + } + ] + })( + + )} + + + {getFieldDecorator("others", { + rules: [{ required: false }] + })( + + )} + + + + +
+ ); + } +} + +export default Form.create()(CrisisEditForm); diff --git a/deans-frontend/src/containers/ModalContainer/EditCrisis/index.js b/deans-frontend/src/containers/ModalContainer/EditCrisis/index.js new file mode 100644 index 0000000..2782331 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/EditCrisis/index.js @@ -0,0 +1,24 @@ +import React from "react"; +import PropTypes from "prop-types"; +import Modal from "antd/lib/modal"; +import CrisisEditForm from "./CrisisEditForm"; + +const EditCrisis = props => { + return ( + + + + ); +}; + +EditCrisis.propTypes = { + hideModal: PropTypes.func.isRequired +}; + +export default EditCrisis; diff --git a/deans-frontend/src/containers/ModalContainer/EditCrisis/style.scss b/deans-frontend/src/containers/ModalContainer/EditCrisis/style.scss new file mode 100644 index 0000000..e69de29 diff --git a/deans-frontend/src/containers/ModalContainer/EditUser/index.js b/deans-frontend/src/containers/ModalContainer/EditUser/index.js new file mode 100644 index 0000000..c56876d --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/EditUser/index.js @@ -0,0 +1,87 @@ +import React from "react"; +import PropTypes from "prop-types"; +import Modal from "antd/lib/modal"; +import { Form, Input, Icon, Button, message } from "antd"; +import * as styles from "./style.scss"; + +const FormItem = Form.Item; + +class _EditUserForm extends React.Component { + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (!err) { + const { password } = values; + const { userId } = this.props; + const form = new FormData(); + form.append("password", password); + this.props + .editUser(userId, form) + .then(() => { + message.success("Success!"); + this.props.hideModal(); + }) + .catch(() => null); + } + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + return ( +
+ + {getFieldDecorator("password", { + rules: [{ required: true, message: "Please input password!" }] + })( + } + type="password" + placeholder="New Password" + /> + )} + + + + +
+ ); + } +} + +_EditUserForm.propTypes = { + form: PropTypes.object.isRequired, + editUser: PropTypes.func.isRequired, + userId: PropTypes.number.isRequired, + hideModal: PropTypes.func.isRequired +}; + +const EditUser = props => { + const EditUserForm = Form.create()(_EditUserForm); + const { editUser, userId, hideModal } = props; + return ( + + + + ); +}; + +EditUser.propTypes = { + hideModal: PropTypes.func.isRequired, + editUser: PropTypes.func.isRequired, + userId: PropTypes.number.isRequired +}; + +export default EditUser; diff --git a/deans-frontend/src/containers/ModalContainer/EditUser/style.scss b/deans-frontend/src/containers/ModalContainer/EditUser/style.scss new file mode 100644 index 0000000..7c17cfc --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/EditUser/style.scss @@ -0,0 +1,10 @@ +:local { + .check { + width: 100%; + } + + .createButton { + margin-top: 1rem; + width: 100%; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/ModalContainer/SingleInput/index.js b/deans-frontend/src/containers/ModalContainer/SingleInput/index.js new file mode 100644 index 0000000..00b0783 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/SingleInput/index.js @@ -0,0 +1,85 @@ +import React from "react"; +import PropTypes from "prop-types"; +import Modal from "antd/lib/modal"; +import { Form, Input, Icon, Button } from "antd"; +import * as styles from "./style.scss"; + +const FormItem = Form.Item; + +class _Form extends React.Component { + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (!err) { + const { value } = values; + this.props.handler(value); + this.props.hideModal(); + } + }); + }; + + render() { + const { getFieldDecorator, defaultValue } = this.props.form; + return ( +
+ + {getFieldDecorator("value", { + rules: [{ required: true, message: "Please input values!" }] + })( + } + type="text" + value={defaultValue} + placeholder="Input values..." + /> + )} + + + + +
+ ); + } +} + +_Form.propTypes = { + form: PropTypes.object.isRequired, + defaultValue: PropTypes.string, + handler: PropTypes.func.isRequired, + hideModal: PropTypes.func.isRequired +}; + +const SingleInput = props => { + const EmbedForm = Form.create()(_Form); + const { handler, hideModal, defaultValue } = props; + return ( + + + + ); +}; + +SingleInput.propTypes = { + hideModal: PropTypes.func.isRequired, + title: PropTypes.string.isRequired, + defaultValue: PropTypes.string, + handler: PropTypes.func.isRequired +}; + +export default SingleInput; diff --git a/deans-frontend/src/containers/ModalContainer/SingleInput/style.scss b/deans-frontend/src/containers/ModalContainer/SingleInput/style.scss new file mode 100644 index 0000000..7c17cfc --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/SingleInput/style.scss @@ -0,0 +1,10 @@ +:local { + .check { + width: 100%; + } + + .createButton { + margin-top: 1rem; + width: 100%; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/ModalContainer/index.js b/deans-frontend/src/containers/ModalContainer/index.js new file mode 100644 index 0000000..eb22282 --- /dev/null +++ b/deans-frontend/src/containers/ModalContainer/index.js @@ -0,0 +1,56 @@ +import React from "react"; +import { connect } from "react-redux"; +import { showModal, hideModal } from "@redux/actions"; +import CreateNewCrisis from "./CreateNewCrisis"; +import EditCrisis from "./EditCrisis"; +import DispatchCrisis from "./DispatchCrisis"; +import AddUser from "./AddUser"; +import EditUser from "./EditUser"; +import SingleInput from "./SingleInput"; +import DoubleInput from "./DoubleInput"; + +const ModalContainer = props => { + switch (props.modalType) { + case "CREATE_NEW_CRISIS": + return ( + + ); + case "EDIT_CRISIS": + return ; + case "DISPATCH_CRISIS": + return ( + + ); + case "ADD_USER": + return ; + case "EDIT_USER": + return ; + case "SINGLE_INPUT": + return ; + case "DOUBLE_INPUT": + return ; + default: + return null; + } +}; + +const mapStateToProps = state => { + const { modal } = state; + return { + modalType: modal && modal.modalType, + modalProps: modal && modal.modalProps // for future use if need to pass props + }; +}; + +const mapDispatchToProps = dispatch => { + return { + showModal: (modalType, modalProps) => + dispatch(showModal(modalType, modalProps)), + hideModal: () => dispatch(hideModal()) + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ModalContainer); diff --git a/deans-frontend/src/containers/PageHome/ActiveCrisisListTable/index.js b/deans-frontend/src/containers/PageHome/ActiveCrisisListTable/index.js new file mode 100644 index 0000000..99954c1 --- /dev/null +++ b/deans-frontend/src/containers/PageHome/ActiveCrisisListTable/index.js @@ -0,0 +1,87 @@ +import React from "react"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import { Table, Tag } from "antd"; +// import * as styles from "./style.scss"; + +const createDataSource = (crisisList, crisisType) => + crisisList.filter(crisis => crisis.crisis_status !== "RS").map(crisis => { + const key = crisis.crisis_id; + const type = crisis.crisis_type + .map(val => crisisType && crisisType[val]) + // eslint-disable-next-line react/jsx-key + .map((type, index) => ( + + {type} + + )); + const location = crisis.crisis_location1.replace(/"/g, ""); + const time = (() => { + const date = new Date(crisis.crisis_time); + return date.toLocaleString("en", { + year: "numeric", + month: "short", + day: "numeric", + hour: "numeric", + minute: "numeric" + }); + })(); + const description = crisis.crisis_description; + return { + key: key, + crisisType: type, + location: location, + description: description, + reportTime: time + }; + }); + +const ActiveCrisisListTable = props => { + const { crises, crisisType } = props; + const COLUMNS = [ + { + title: "Crisis Type", + dataIndex: "crisisType", + key: "crisisType", + width: 100 + }, + { + title: "Location", + dataIndex: "location", + key: "location", + width: 300 + }, + { + title: "Description", + key: "description", + dataIndex: "description", + width: 200 + }, + { + title: "Report Time", + key: "reportTime", + dataIndex: "reportTime", + width: 150 + } + ]; + return ( + + ); +}; + +ActiveCrisisListTable.propTypes = { + crisisType: PropTypes.object, + assistanceType: PropTypes.object, + crises: PropTypes.array +}; + +export default connect(state => { + const { system } = state; + return { + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType + }; +})(ActiveCrisisListTable); diff --git a/deans-frontend/src/containers/PageHome/ActiveCrisisListTable/style.scss b/deans-frontend/src/containers/PageHome/ActiveCrisisListTable/style.scss new file mode 100644 index 0000000..ac88db1 --- /dev/null +++ b/deans-frontend/src/containers/PageHome/ActiveCrisisListTable/style.scss @@ -0,0 +1,7 @@ +:local { + .actions { + button { + margin-right: 0.5rem; + } + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageHome/index.js b/deans-frontend/src/containers/PageHome/index.js new file mode 100644 index 0000000..78b13e7 --- /dev/null +++ b/deans-frontend/src/containers/PageHome/index.js @@ -0,0 +1,89 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +import { getCrises, fetchTypes } from "@redux/actions"; +import GMap from "@components/GMap"; +import NavBar from "@components/NavBar"; +import Footer from "@components/Footer"; +import RealTimePSI from "@components/RealTimePSI"; +import RealTimeWeather from "@components/RealTimeWeather"; +import RealTimeCrisisStatus from "@components/RealTimeCrisisStatus"; +import ActiveCrisisListTable from "./ActiveCrisisListTable"; + +import * as styles from "./style.scss"; + +class PageHome extends React.Component { + componentDidMount() { + this.props.fetchTypes(); + this.fetchData(); + } + + fetchData = () => { + this.props.getCrises(); + }; + + filterCrises = crises => { + // display only dispatched crises + return crises.filter(crisis => crisis.crisis_status === "DP"); + }; + + render() { + return ( + + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
Active Crisis
+
+ +
+
+
+
+
+ + ); + } +} + +PageHome.propTypes = { + crises: PropTypes.array, + fetchTypes: PropTypes.func.isRequired, + getCrises: PropTypes.func.isRequired +}; + +const mapStateToProps = state => { + const { system, common } = state; + return { + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType, + crises: common && common.crises + }; +}; + +const mapDispatchToProps = dispatch => ({ + fetchTypes: () => dispatch(fetchTypes()), + getCrises: () => dispatch(getCrises()) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PageHome); diff --git a/deans-frontend/src/containers/PageHome/style.scss b/deans-frontend/src/containers/PageHome/style.scss new file mode 100644 index 0000000..fad0b07 --- /dev/null +++ b/deans-frontend/src/containers/PageHome/style.scss @@ -0,0 +1,59 @@ +:local { + .container { + display: flex; + flex-direction: row; + padding: 1rem; + position: relative; + } + + .status { + position: sticky; + top: 1rem; + margin-top: 2rem; + background-color: white; + } + + .header { + color: black; + font-size: 2rem; + } + + .left { + flex: 1; + margin-right: 2rem; + margin-top: -1rem; + position: relative; + } + + .right { + flex: 4; + padding-right: 2rem; + padding-top: 0.5rem; + } + + .map { + margin-top: 0.5rem; + height: 25rem; + width: 100%; + // z-index: -1; + } + + // .buttonGroup { + // margin-top: 1rem; + // } + + .activeCrisisListTableContainer { + margin-top: 2rem; + width: 100%; + } + + .subHeader { + color: black; + font-size: 1.2rem; + font-weight: bold; + } + + .activeCrisisListTable { + margin-top: 1.5rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageLogin/LoginForm/index.js b/deans-frontend/src/containers/PageLogin/LoginForm/index.js new file mode 100644 index 0000000..dc2b324 --- /dev/null +++ b/deans-frontend/src/containers/PageLogin/LoginForm/index.js @@ -0,0 +1,84 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Form, Input, Icon, Checkbox, Button, message } from "antd"; +import * as styles from "./style.scss"; + +const FormItem = Form.Item; + +class LoginForm extends React.Component { + handleSubmit = e => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (!err) { + const { username, password } = values; + const form = new FormData(); + form.append("username", username); + form.append("password", password); + this.props + .userLogin(form) + .then(() => { + if (this.props.flag) { + message.success("Login successful!", 2); + this.props.setRedirect(); + } else { + message.error("Login failed, please try again.", 2); + } + }) + .catch(() => { + /* do nothing */ + }); + } + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + return ( +
+ + {getFieldDecorator("username", { + rules: [{ required: true, message: "Please input your username!" }] + })( + } + placeholder="Username" + /> + )} + + + {getFieldDecorator("password", { + rules: [{ required: true, message: "Please input your Password!" }] + })( + } + type="password" + placeholder="Password" + /> + )} + + + {getFieldDecorator("remember", { + valuePropName: "checked", + initialValue: true + })(Remember me)} + + + + ); + } +} + +LoginForm.propTypes = { + flag: PropTypes.bool.isRequired, + userLogin: PropTypes.func.isRequired, + setRedirect: PropTypes.func.isRequired, + form: PropTypes.object.isRequired +}; + +export default Form.create()(LoginForm); diff --git a/deans-frontend/src/containers/PageLogin/LoginForm/style.scss b/deans-frontend/src/containers/PageLogin/LoginForm/style.scss new file mode 100644 index 0000000..2c609f2 --- /dev/null +++ b/deans-frontend/src/containers/PageLogin/LoginForm/style.scss @@ -0,0 +1,22 @@ +:global { + .login-form { + max-width: 300px; + margin: auto !important; // override + text-align: left; + } + + .login-form-forgot { + float: right; + } + + .login-form-button { + width: 100%; + } +} + +:local { + .loginButton { + width: 100%; + margin-top: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageLogin/index.js b/deans-frontend/src/containers/PageLogin/index.js new file mode 100644 index 0000000..157c1bc --- /dev/null +++ b/deans-frontend/src/containers/PageLogin/index.js @@ -0,0 +1,59 @@ +import React from "react"; +import { connect } from "react-redux"; +import { userLogin } from "@redux/actions"; +import PropTypes from "prop-types"; +import { Redirect } from "react-router-dom"; +import LoginForm from "./LoginForm"; +import NavBar from "@components/NavBar"; +import Footer from "@components/Footer"; +import * as styles from "./style.scss"; + +// eslint-ignore-next-line +class PageLogin extends React.Component { + state = { + redirect: false + }; + + setRedirect = () => { + this.setState({ redirect: true }); + }; + + render() { + if (this.state.redirect) return ; + return ( + + +
+
+
Staff Login
+
+ +
+
+
+
+ + ); + } +} + +PageLogin.propTypes = { + flag: PropTypes.bool.isRequired, + userLogin: PropTypes.func.isRequired +}; + +export default connect( + state => { + const { staff } = state; + return { + flag: staff.flag || false + }; + }, + dispatch => ({ + userLogin: form => dispatch(userLogin(form)) + }) +)(PageLogin); diff --git a/deans-frontend/src/containers/PageLogin/style.scss b/deans-frontend/src/containers/PageLogin/style.scss new file mode 100644 index 0000000..86e860c --- /dev/null +++ b/deans-frontend/src/containers/PageLogin/style.scss @@ -0,0 +1,22 @@ +:local { + .container { + display: flex; + flex-direction: row; + padding: 0 3rem; + justify-content: center; + } + + .innerContainer { + width: 40%; + } + + .header { + font-size: 1.2rem; + color: black; + margin-top: 2rem; + } + + .form { + margin-top: 2rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageReport/CrisisReportForm/index.js b/deans-frontend/src/containers/PageReport/CrisisReportForm/index.js new file mode 100644 index 0000000..038dbb8 --- /dev/null +++ b/deans-frontend/src/containers/PageReport/CrisisReportForm/index.js @@ -0,0 +1,284 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Form, Input, Tooltip, Icon, Select, Button } from "antd"; +import PlacesAutocomplete, { + geocodeByAddress, + getLatLng +} from "react-places-autocomplete"; + +const FormItem = Form.Item; +const Option = Select.Option; + +const createSelectionList = obj => + Object.keys(obj).map((val, index) => ( + + )); + +class CrisisReportForm extends React.Component { + state = { + confirmDirty: false, + address: "", + gps: null + }; + + handleChange = () => null; // dummy + + handleSelect = address => { + geocodeByAddress(address) + .then(results => { + return getLatLng(results[0]); + }) + .then(gps => { + this.setState({ gps, address }); + this.props.form.setFieldsValue({ + location: address + }); + }) + .catch(error => console.error("Error", error)); + }; + + handleSubmit = e => { + e.preventDefault(); + e.disabled = true; + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + const { + name, + phone, + location_2, + crisisType, + crisisDescription, + assistanceType, + assistanceDescription + } = values; + const form = new FormData(); + form.append("your_name", name); + form.append("mobile_number", phone); + if (crisisType && crisisType.length > 0) { + for (const type of crisisType) { + form.append("crisis_type", type); + } + } + if (assistanceType && assistanceType.length > 0) { + for (const type of assistanceType) { + form.append("crisis_assistance", type); + } + } + form.append("crisis_status", "PD"); + form.append("crisis_location1", JSON.stringify(this.state.address)); // important because object makes no sense in REST + form.append( + "crisis_location2", + typeof location_2 === "undefined" ? "" : location_2 + ); + form.append( + "crisis_description", + typeof crisisDescription === "undefined" ? "" : crisisDescription + ); + form.append( + "crisis_assistance_description", + typeof assistanceDescription === "undefined" ? "" : crisisDescription + ); + this.props + .reportCrises(form) + .then(() => { + this.props.setComplete(); + }) + .catch(error => console.log(error)); + } + }); + }; + + handleConfirmBlur = e => { + const value = e.target.value; + this.setState({ confirmDirty: this.state.confirmDirty || !!value }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + + const formItemLayout = { + labelCol: { + sm: { span: 5 } + }, + wrapperCol: { + sm: { span: 18 } + } + }; + const prefixSelector = getFieldDecorator("prefix", { + initialValue: "65" + })( + + ); + + return ( +
+ + Your Name  + + + + + } + > + {getFieldDecorator("name", { + rules: [ + { + required: true, + message: "Please input your name!", + whitespace: true + } + ] + })()} + + + {getFieldDecorator("phone", { + rules: [ + { required: true, message: "Please input your mobile number!" } + ] + })()} + + Location}> + {getFieldDecorator("location", { + rules: [ + { + required: true, + message: "Please input the location!", + whitespace: true + } + ] + })( + + {({ + getInputProps, + suggestions, + getSuggestionItemProps, + loading + }) => { + return ( + + +
+ {loading &&
Loading...
} + {suggestions.map((suggestion, index) => { + const className = suggestion.active + ? "suggestion-item--active" + : "suggestion-item"; + // inline style for demonstration purpose + const style = suggestion.active + ? { backgroundColor: "#fafafa", cursor: "pointer" } + : { backgroundColor: "#ffffff", cursor: "pointer" }; + return ( +
+ {suggestion.description} +
+ ); + })} +
+
+ ); + }} +
+ )} +
+ Location 2}> + {getFieldDecorator("location_2", { + rules: [ + { + required: false, + whitespace: true + } + ] + })()} + + + {getFieldDecorator("crisisType", { + rules: [ + { + type: "array", + required: true, + message: "Please select crisis type!" + } + ] + })( + + )} + + + {getFieldDecorator("crisisDescription", { + rules: [{ required: false }] + })( + + )} + + + {getFieldDecorator("assistanceType", { + rules: [ + { + type: "array", + required: false + } + ] + })( + + )} + + + {getFieldDecorator("assistanceDescription", { + rules: [{ required: false }] + })( + + )} + + + + + + ); + } +} + +CrisisReportForm.propTypes = { + crisisType: PropTypes.array.isRequired, + assistanceType: PropTypes.array.isRequired, + flag: PropTypes.bool.isRequired, + reportCrises: PropTypes.func.isRequired, + setComplete: PropTypes.func.isRequired +}; + +export default Form.create()(CrisisReportForm); diff --git a/deans-frontend/src/containers/PageReport/index.js b/deans-frontend/src/containers/PageReport/index.js new file mode 100644 index 0000000..8ddf078 --- /dev/null +++ b/deans-frontend/src/containers/PageReport/index.js @@ -0,0 +1,93 @@ +import React from "react"; +import PropTypes from "prop-types"; +import NavBar from "@components/NavBar"; +import Footer from "@components/Footer"; +import CrisisReportForm from "./CrisisReportForm"; +import { connect } from "react-redux"; +import { getCrises, fetchTypes, reportCrises } from "@redux/actions"; + +import * as styles from "./style.scss"; + +class PageReport extends React.Component { + state = { + completed: false + }; + + componentDidMount() { + this.props.fetchTypes(); + this.fetchData(); + } + + setComplete = () => { + this.setState({ completed: true }); + }; + + fetchData = () => { + this.props.getCrises(); + }; + + render() { + const { completed } = this.state; + return ( + + +
+
Report Crisis
+ {completed ? ( +
+ Thank you for reporting the crisis! +
+ ) : ( + +
+ If you prefer to report over the phone, please call us directly + at 12345678. +
+
+ +
+
+ )} +
+
+ + ); + } +} + +PageReport.propTypes = { + crisisType: PropTypes.array.isRequired, + assistanceType: PropTypes.array.isRequired, + crises: PropTypes.array.isRequired, + fetchTypes: PropTypes.func.isRequired, + getCrises: PropTypes.func.isRequired, + reportCrises: PropTypes.func.isRequired, + flag: PropTypes.bool.isRequired +}; + +const mapStateToProps = state => { + const { system, common } = state; + return { + flag: common && common.flag, + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType, + crises: common && common.crises + }; +}; + +const mapDispatchToProps = dispatch => ({ + fetchTypes: () => dispatch(fetchTypes()), + getCrises: () => dispatch(getCrises()), + reportCrises: form => dispatch(reportCrises(form)) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PageReport); diff --git a/deans-frontend/src/containers/PageReport/style.scss b/deans-frontend/src/containers/PageReport/style.scss new file mode 100644 index 0000000..b23c1bd --- /dev/null +++ b/deans-frontend/src/containers/PageReport/style.scss @@ -0,0 +1,17 @@ +:local { + .container { + display: flex; + flex-direction: column; + padding: 0 3rem; + } + + .header { + font-size: 2rem; + margin-top: 2rem; + color: black; + } + + .form { + margin-top: 2rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/Menu/index.js b/deans-frontend/src/containers/PageStaff/Menu/index.js new file mode 100644 index 0000000..02a043e --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/Menu/index.js @@ -0,0 +1,28 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Link } from "react-router-dom"; +import * as styles from "./style.scss"; + +const Menu = props => ( +
+ +
Dashboard
+ + {props.isAdmin && ( + + +
User Center
+ + +
Setting
+ +
+ )} +
+); + +Menu.propTypes = { + isAdmin: PropTypes.bool.isRequired +}; + +export default Menu; diff --git a/deans-frontend/src/containers/PageStaff/Menu/style.scss b/deans-frontend/src/containers/PageStaff/Menu/style.scss new file mode 100644 index 0000000..a13a6ab --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/Menu/style.scss @@ -0,0 +1,18 @@ +:local { + .container { + display: flex; + flex-direction: column; + box-shadow: 0 2px 10px rgba(0,0,0,.15); + } + + .item { + padding: 1rem; + cursor: pointer; + color: black; + + &:hover { + background-color: rgba(250,250,250,.9); + + } + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/PageCallCenter/CrisisListTable/index.js b/deans-frontend/src/containers/PageStaff/PageCallCenter/CrisisListTable/index.js new file mode 100644 index 0000000..482741e --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageCallCenter/CrisisListTable/index.js @@ -0,0 +1,195 @@ +import React from "react"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import { showModal, resolveCrisis, getCrises } from "@redux/actions"; +import { Modal, Button, Table, message, Tag } from "antd"; +import * as styles from "./style.scss"; + +const statusMap = { + PD: "Pending", + DP: "Dispatched", + RS: "Resolved" +}; + +const statusOrder = { + PD: 0, + DP: 1, + RS: 2 +}; + +// eslint-disable-next-line max-params +const resolve = (id, flag, resolveCrisis, getCrises, undo) => { + Modal.confirm({ + title: undo ? "Activate crisis?" : "Resolve crisis?", + content: `The crisis will be marked as ${undo ? "pending" : "resolved"}.`, + onOk() { + resolveCrisis(id, undo) + .then(() => { + message.success( + `Crisis has been ${undo ? "activated" : "resolved"}.`, + 2 + ); + getCrises(); + }) + .catch(error => console.log(error)); + }, + onCancel() { + console.log("Cancel"); + } + }); +}; + +const COLUMNS = [ + { + title: "Crisis Type", + dataIndex: "crisisType", + key: "crisisType", + width: 100 + }, + { + title: "Location", + dataIndex: "location", + key: "location", + width: 300 + }, + { + title: "Action", + dataIndex: "action", + key: "action", + width: 150 + }, + { + title: "Status", + key: "status", + dataIndex: "status", + width: 100 + } +]; + +const createDataSource = ( + flag, + crisisList, + crisisType, + dispatchCrisis, + editCrisis, + resolveCrisis, + getCrises + // eslint-disable-next-line +) => + crisisList + .sort((a, b) => statusOrder[a.crisis_status] - statusOrder[b.crisis_status]) + .map(crisis => { + const id = crisis.crisis_id; + const type = crisis.crisis_type + .map(val => crisisType && crisisType[val]) + .map((type, index) => ( + // eslint-disable-next-line react/jsx-key + + {type} + + )); + const location = crisis.crisis_location1.replace(/"/g, ""); + const status = crisis.crisis_status; + return { + key: id, + crisisType: type, + location: location, + status: ( + { + switch (status) { + case "RS": + return "#ccc"; + case "PD": + return "crimson"; + default: + return "black"; + } + })() + }} + > + {statusMap[status]} + + ), + action: ( +
+ {/* */} + + +
+ ), + detail: crisis + }; + }); + +const CrisisListTable = props => { + const { crises, crisisType, resolveCrisis, flag, getCrises } = props; + const dispatchCrisis = crisis => { + props.showModal("DISPATCH_CRISIS", { crisis }); + }; + + const editCrisis = crisis => { + props.showModal("EDIT_CRISIS", { crisis }); + }; + return ( +
+ ); +}; + +CrisisListTable.propTypes = { + flag: PropTypes.bool.isRequired, + crises: PropTypes.array, + // from redux + crisisType: PropTypes.object, + assistanceType: PropTypes.object, + getCrises: PropTypes.func.isRequired, + resolveCrisis: PropTypes.func.isRequired, + showModal: PropTypes.func.isRequired +}; + +export default connect( + state => { + const { system, staff } = state; + return { + flag: staff.flag || false, + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType + }; + }, + dispatch => ({ + resolveCrisis: (id, undo) => dispatch(resolveCrisis(id, undo)), + getCrises: () => dispatch(getCrises()), + showModal: (modalType, modalProps) => + dispatch(showModal(modalType, modalProps)) + }) +)(CrisisListTable); diff --git a/deans-frontend/src/containers/PageStaff/PageCallCenter/CrisisListTable/style.scss b/deans-frontend/src/containers/PageStaff/PageCallCenter/CrisisListTable/style.scss new file mode 100644 index 0000000..dd769fa --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageCallCenter/CrisisListTable/style.scss @@ -0,0 +1,7 @@ +:local { + .actions { + display: grid; + grid-template-columns: auto auto auto; + grid-column-gap: 0.5rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/PageCallCenter/index.js b/deans-frontend/src/containers/PageStaff/PageCallCenter/index.js new file mode 100644 index 0000000..0fc8c2f --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageCallCenter/index.js @@ -0,0 +1,87 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +import { Button } from "antd"; +import GMap from "@components/GMap"; +import CrisisListTable from "./CrisisListTable"; +import { showModal, fetchTypes, getCrises, reportCrises } from "@redux/actions"; +import * as styles from "./style.scss"; + +class PageDashboard extends React.Component { + componentDidMount() { + this.props.fetchTypes(); + this.fetchData(); + } + + fetchData = () => { + this.props.getCrises(); + }; + + filterCrises = crises => { + return crises.filter(crisis => crisis.crisis_status !== "RS"); + }; + + render() { + return ( +
+

Call Center Dashboard

+
+ +
+
+
Crisis List
+
+ +
+
+
+ +
+
+ ); + } +} + +PageDashboard.propTypes = { + crises: PropTypes.array, + fetchTypes: PropTypes.func.isRequired, + getCrises: PropTypes.func.isRequired, + reportCrises: PropTypes.func.isRequired, + crisisType: PropTypes.object, + assistanceType: PropTypes.object, + showModal: PropTypes.func.isRequired +}; + +const mapStateToProps = state => { + const { system, common } = state; + return { + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType, + crises: common && common.crises + }; +}; + +const mapDispatchToProps = dispatch => ({ + fetchTypes: () => dispatch(fetchTypes()), + getCrises: () => dispatch(getCrises()), + reportCrises: form => dispatch(reportCrises(form)), + showModal: (modalType, modalProps) => + dispatch(showModal(modalType, modalProps)) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PageDashboard); diff --git a/deans-frontend/src/containers/PageStaff/PageCallCenter/style.scss b/deans-frontend/src/containers/PageStaff/PageCallCenter/style.scss new file mode 100644 index 0000000..740911c --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageCallCenter/style.scss @@ -0,0 +1,20 @@ +:local { + .map { + margin-top: 1.5rem; + height: 25rem; + } + + .subHeader { + margin-top: 2rem; + display: flex; + justify-content: space-between; + font-size: 1.2rem; + font-weight: bold; + color: black; + } + + .crisisListTable { + width: 100%; + margin-top: 1.5rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/PageSetting/EmergencyAgenciesTable/index.js b/deans-frontend/src/containers/PageStaff/PageSetting/EmergencyAgenciesTable/index.js new file mode 100644 index 0000000..41e7e00 --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageSetting/EmergencyAgenciesTable/index.js @@ -0,0 +1,70 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Table, Button } from "antd"; +import * as styles from "./style.scss"; + +const EmergencyAgenciesTable = props => { + const COLUMNS = [ + { + title: "Agency", + dataIndex: "agency", + key: "agency" + }, + { + title: "Phone Number", + dataIndex: "phoneNumber", + key: "phoneNumber" + }, + { + title: "Actions", + key: "actions", + dataIndex: "actions" + } + ]; + + const createDataSource = () => { + const { emergencyAgencies, editPhoneNumber } = props; + return emergencyAgencies.map(agency => { + const id = agency.agency_id; + const name = agency.agency; + const phoneNumber = agency.phone_number; + return { + agency: name, + phoneNumber: phoneNumber, + actions: ( +
+ + +
+ ) + }; + }); + }; + + return ( +
+ ); +}; + +EmergencyAgenciesTable.propTypes = { + emergencyAgencies: PropTypes.array, + showModal: PropTypes.func.isRequired, + editPhoneNumber: PropTypes.func.isRequired +}; + +export default EmergencyAgenciesTable; diff --git a/deans-frontend/src/containers/PageStaff/PageSetting/EmergencyAgenciesTable/style.scss b/deans-frontend/src/containers/PageStaff/PageSetting/EmergencyAgenciesTable/style.scss new file mode 100644 index 0000000..db26e8f --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageSetting/EmergencyAgenciesTable/style.scss @@ -0,0 +1,7 @@ +:local { + .actions { + display: grid; + grid-template-columns: auto auto; + grid-column-gap: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/PageSetting/index.js b/deans-frontend/src/containers/PageStaff/PageSetting/index.js new file mode 100644 index 0000000..9b34ddc --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageSetting/index.js @@ -0,0 +1,247 @@ +import React from "react"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; + +import { + addCrisisType, + addAssistanceType, + fetchTypes, + getEmergencyAgencies, + addEmergencyAgencies, + editSiteSettings, + editEmergencyAgencies, + showModal +} from "@redux/actions"; +import { Button, Tag, message } from "antd"; +import EmergencyAgenciesTable from "./EmergencyAgenciesTable"; +import * as styles from "./style.scss"; + +class PageSetting extends React.Component { + state = { + reportingEmail: { + edited: false, + content: null + } + }; + + componentDidMount() { + this.props.fetchTypes(); + this.props.getEmergencyAgencies(); + } + + componentDidUpdate = prevProps => { + if (prevProps.crisisType !== this.props.crisisType) this.createCrisisTags(); + }; + + createCrisisTags = () => { + const { crisisType } = this.props; + if (!crisisType) return []; + return Object.keys(crisisType).map((val, index) => ( + + {crisisType[val]} + + )); + }; + + createAssistanceTags = () => { + const { assistanceType } = this.props; + if (!assistanceType) return []; + return Object.keys(assistanceType).map((val, index) => ( + + {assistanceType[val]} + + )); + }; + + handleEmailChange = e => { + this.setState({ + ...this.state, + reportingEmail: { + edited: true, + content: e.target.value + } + }); + }; + + editSiteSettings = () => { + const email = this.state.reportingEmail.content; + if (!email.match(/.+@.+\..+/g)) { + console.log(email); + message.error("Email is invalid"); + } else { + const form = new FormData(); + form.append("summary_reporting_email", email); + this.props.editSiteSettings(form).then(() => { + message.success("Success!"); + this.setState({ edited: false }); + }); + } + }; + + addCrisisType = name => { + // const name = prompt("Enter the name of new crisis"); + const form = new FormData(); + form.append("name", name); + this.props + .addCrisisType(form) + .then(() => { + message.success("Success!"); + this.props.fetchTypes(); + }) + .catch(() => message.error("Error!")); + }; + + addAssistanceType = name => { + // const name = prompt("Enter the name of new crisis"); + const form = new FormData(); + form.append("name", name); + this.props + .addAssistanceType(form) + .then(() => { + message.success("Success!"); + this.props.fetchTypes(); + }) + .catch(() => message.error("Error!")); + }; + + addEmergencyAgencies = (agency, phoneNumber) => { + const form = new FormData(); + form.append("agency", agency); + form.append("phone_number", phoneNumber); + this.props + .addEmergencyAgencies(form) + .then(() => { + message.success("Success!"); + this.props.getEmergencyAgencies(); + }) + .catch(() => message.error("Error!")); + }; + + editEmergencyAgencies = (id, phoneNumber) => { + const form = new FormData(); + form.append("agency_id", id); + form.append("phone_number", phoneNumber); + this.props + .editEmergencyAgencies(id, form) + .then(() => { + message.success("Success!"); + this.props.getEmergencyAgencies(); + }) + .catch(() => message.error("Error!")); + }; + + render() { + return ( +
+

Setting

+
+
Crisis Type
+ +
+
{this.createCrisisTags()}
+
+
Assistance Type
+ +
+
{this.createAssistanceTags()}
+
+
Emergency Agencies
+ +
+
+ +
+ {/*
+
Summary Reporting Email
+ +
+
+ +
*/} +
+ ); + } +} + +const mapStateToProps = state => { + const { system } = state; + return { + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType, + emergencyAgencies: system && system.emergencyAgencies + }; +}; + +PageSetting.propTypes = { + addCrisisType: PropTypes.func.isRequired, + addAssistanceType: PropTypes.func.isRequired, + fetchTypes: PropTypes.func.isRequired, + crisisType: PropTypes.object, + assistanceType: PropTypes.object, + getEmergencyAgencies: PropTypes.func.isRequired, + addEmergencyAgencies: PropTypes.func.isRequired, + editEmergencyAgencies: PropTypes.func.isRequired, + emergencyAgencies: PropTypes.array, + editSiteSettings: PropTypes.func.isRequired, + showModal: PropTypes.func.isRequired +}; + +const mapDispatchToProps = dispatch => ({ + addCrisisType: form => dispatch(addCrisisType(form)), + addAssistanceType: form => dispatch(addAssistanceType(form)), + fetchTypes: () => dispatch(fetchTypes()), + getEmergencyAgencies: () => dispatch(getEmergencyAgencies()), + addEmergencyAgencies: form => dispatch(addEmergencyAgencies(form)), + editEmergencyAgencies: (id, form) => + dispatch(editEmergencyAgencies(id, form)), + editSiteSettings: form => dispatch(editSiteSettings(form)), + showModal: (modalType, modalProps) => + dispatch(showModal(modalType, modalProps)) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PageSetting); diff --git a/deans-frontend/src/containers/PageStaff/PageSetting/style.scss b/deans-frontend/src/containers/PageStaff/PageSetting/style.scss new file mode 100644 index 0000000..136c574 --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageSetting/style.scss @@ -0,0 +1,44 @@ +:local { + .tagContainer { + margin: 1rem 0; + } + + .subHeader { + margin-top: 2rem; + display: flex; + justify-content: space-between; + font-size: 1.2rem; + font-weight: lighter; + color: black; + } + + .socialMediaAccountContainer { + display: grid; + margin-top: 1rem; + grid-template-columns: auto auto auto auto; + grid-template-rows: repeat(4, auto); + grid-gap: 0.5rem; + justify-content: space-between; + + .label { + font-weight: bold; + margin-bottom: 0.5rem; + } + + .actions { + button { + margin-right: 0.5rem; + } + } + } + + .emergencyAgenciesContainer { + // display: grid; + margin-top: 1rem; + width: 100%; + } + + .summaryReportingEmailContainer { + margin-top: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/PageUserCenter/UserTable/index.js b/deans-frontend/src/containers/PageStaff/PageUserCenter/UserTable/index.js new file mode 100644 index 0000000..67beeb0 --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageUserCenter/UserTable/index.js @@ -0,0 +1,71 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Button, Table, Switch } from "antd"; +import * as styles from "./style.scss"; + +const COLUMNS = [ + { + title: "Username", + dataIndex: "username", + key: "username" + }, + { + title: "Is Admin", + dataIndex: "adminStatus", + key: "adminStatus" + }, + { + title: "Action", + dataIndex: "action", + key: "action" + } +]; + +const UserTable = props => { + const { editUser, showEditUserModal, currentUser } = props; + + const toggleAdmin = (id, isAdmin) => { + const form = new FormData(); + form.append("is_staff", isAdmin); + editUser(id, form); + }; + + const createDataSource = arr => { + return arr.map(val => ({ + key: val.id, + username: val.username, + adminStatus: ( + toggleAdmin(val.id, checked)} + /> + ), + action: ( +
+ +
+ ) + })); + }; + + return ( +
+ ); +}; + +UserTable.propTypes = { + userList: PropTypes.array.isRequired, + editUser: PropTypes.func.isRequired, + showEditUserModal: PropTypes.func.isRequired, + currentUser: PropTypes.string.isRequired +}; + +export default UserTable; diff --git a/deans-frontend/src/containers/PageStaff/PageUserCenter/UserTable/style.scss b/deans-frontend/src/containers/PageStaff/PageUserCenter/UserTable/style.scss new file mode 100644 index 0000000..ac88db1 --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageUserCenter/UserTable/style.scss @@ -0,0 +1,7 @@ +:local { + .actions { + button { + margin-right: 0.5rem; + } + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/PageUserCenter/index.js b/deans-frontend/src/containers/PageStaff/PageUserCenter/index.js new file mode 100644 index 0000000..9dbad90 --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageUserCenter/index.js @@ -0,0 +1,71 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +import { getUserList, showModal, editUser } from "@redux/actions"; +import { Button } from "antd"; +import UserTable from "./UserTable"; +import * as styles from "./style.scss"; + +class PageUserCenter extends React.Component { + componentDidMount() { + this.props.getUserList(); + } + + render() { + const { + userList, + addUser, + showEditUserModal, + editUser, + currentUser + } = this.props; + return ( +
+

User Center

+
+
User List
+
+ +
+
+
+ +
+
+ ); + } +} + +PageUserCenter.propTypes = { + addUser: PropTypes.func.isRequired, + editUser: PropTypes.func.isRequired, + showEditUserModal: PropTypes.func.isRequired, + userList: PropTypes.array, + currentUser: PropTypes.string, + getUserList: PropTypes.func.isRequired +}; + +const mapStateToProps = state => { + const { staff } = state; + return { + currentUser: staff && staff.currentUser, + userList: staff && staff.userList + }; +}; + +const mapDispatchToProps = dispatch => ({ + getUserList: () => dispatch(getUserList()), + addUser: modalProps => dispatch(showModal("ADD_USER", modalProps)), + showEditUserModal: modalProps => dispatch(showModal("EDIT_USER", modalProps)), + editUser: (id, form) => dispatch(editUser(id, form)) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PageUserCenter); diff --git a/deans-frontend/src/containers/PageStaff/PageUserCenter/style.scss b/deans-frontend/src/containers/PageStaff/PageUserCenter/style.scss new file mode 100644 index 0000000..4f58ded --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/PageUserCenter/style.scss @@ -0,0 +1,15 @@ +:local { + .subHeader { + margin-top: 2rem; + display: flex; + justify-content: space-between; + font-size: 1.2rem; + font-weight: bold; + color: black; + } + + .userTable { + width: 100%; + margin-top: 1.5rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/RealTimeStatus/index.js b/deans-frontend/src/containers/PageStaff/RealTimeStatus/index.js new file mode 100644 index 0000000..710faec --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/RealTimeStatus/index.js @@ -0,0 +1,38 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Icon } from "antd"; +import * as styles from "./style.scss"; + +const RealTimeStatus = props => ( +
+
+ Crisis Overview +
+
+ + {props.numOfPending} + {" "} + Pending +
+
+ {props.numOfDispatched} Dispatched +
+
+ Internet Status: + {" "} + Online +
+
+); + +RealTimeStatus.propTypes = { + numOfPending: PropTypes.number.isRequired, + numOfDispatched: PropTypes.number.isRequired +}; + +export default RealTimeStatus; diff --git a/deans-frontend/src/containers/PageStaff/RealTimeStatus/style.scss b/deans-frontend/src/containers/PageStaff/RealTimeStatus/style.scss new file mode 100644 index 0000000..a669e6e --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/RealTimeStatus/style.scss @@ -0,0 +1,10 @@ +:local { + .container { + display: flex; + width: 100%; + flex-direction: column; + box-shadow: 0 2px 10px rgba(0,0,0,.15); + position: sticky; + padding: 1rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/PageStaff/index.js b/deans-frontend/src/containers/PageStaff/index.js new file mode 100644 index 0000000..82c00bd --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/index.js @@ -0,0 +1,105 @@ +import React from "react"; +import { Route, Switch } from "react-router-dom"; +import { connect } from "react-redux"; +import PropTypes from "prop-types"; +import * as ROUTES from "src/routes"; +import NavBar from "@components/NavBar"; +import Footer from "@components/Footer"; +import RealTimePSI from "@components/RealTimePSI"; +import RealTimeWeather from "@components/RealTimeWeather"; +import Menu from "./Menu"; +import RealTimeStatus from "./RealTimeStatus"; +import PageCallCenter from "./PageCallCenter"; +import PageUserCenter from "./PageUserCenter"; +import PageSetting from "./PageSetting"; +import { fetchTypes, getCrises } from "@redux/actions"; + +import * as styles from "./style.scss"; + +class PageStaff extends React.Component { + componentDidMount() { + this.props.fetchTypes(); + this.props.getCrises(); + } + + render() { + const { crises } = this.props; + const numOfPending = + crises && crises.filter(crisis => crisis.crisis_status === "PD").length; + const numOfDispatched = + crises && crises.filter(crisis => crisis.crisis_status === "DP").length; + return ( + + +
+
+ +
+ +
+
+ +
+
+ +
+
+
+ + + + + {/* fallback */} + + +
+
+
+ + ); + } +} + +PageStaff.propTypes = { + crises: PropTypes.array, + fetchTypes: PropTypes.func.isRequired, + getCrises: PropTypes.func.isRequired, + crisisType: PropTypes.object, + isAdmin: PropTypes.bool.isRequired, + assistanceType: PropTypes.object +}; + +const mapStateToProps = state => { + const { staff, system, common } = state; + return { + isAdmin: staff && staff.isAdmin, + crisisType: system && system.crisisType, + assistanceType: system && system.assistanceType, + crises: common && common.crises + }; +}; + +const mapDispatchToProps = dispatch => ({ + fetchTypes: () => dispatch(fetchTypes()), + getCrises: () => dispatch(getCrises()) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PageStaff); diff --git a/deans-frontend/src/containers/PageStaff/style.scss b/deans-frontend/src/containers/PageStaff/style.scss new file mode 100644 index 0000000..adadd8e --- /dev/null +++ b/deans-frontend/src/containers/PageStaff/style.scss @@ -0,0 +1,40 @@ +:local { + .container { + display: flex; + flex-direction: row; + padding: 1rem; + position: relative; + } + + .status { + position: sticky; + top: 1rem; + margin-top: 2rem; + background-color: white; + } + + .left { + flex: 1; + margin-right: 2rem; + margin-top: 0.5rem; + position: relative; + } + + .right { + flex: 4; + padding-right: 2rem; + padding-top: 0.5rem; + } + + .header { + font-size: 2rem; + } + + .map { + margin-top: 1.5rem; + } + + .table { + margin-top: 1.5rem; + } +} \ No newline at end of file diff --git a/deans-frontend/src/containers/RealTimeConditionTracker/index.js b/deans-frontend/src/containers/RealTimeConditionTracker/index.js new file mode 100644 index 0000000..705f3fd --- /dev/null +++ b/deans-frontend/src/containers/RealTimeConditionTracker/index.js @@ -0,0 +1,26 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +import { startRealTimeConditionTracking } from "@redux/actions"; + +class RealTimeCrisisTracker extends React.Component { + componentDidMount = () => this.props.startRealTimeConditionTracking(600000); // 10 min + render() { + return this.props.children; + } +} + +RealTimeCrisisTracker.propTypes = { + startRealTimeConditionTracking: PropTypes.func.isRequired, + children: PropTypes.object.isRequired +}; + +const mapDispatchToProps = dispatch => ({ + startRealTimeConditionTracking: time => + dispatch(startRealTimeConditionTracking(time)) +}); + +export default connect( + null, + mapDispatchToProps +)(RealTimeCrisisTracker); diff --git a/deans-frontend/src/containers/RealTimeCrisisTracker/index.js b/deans-frontend/src/containers/RealTimeCrisisTracker/index.js new file mode 100644 index 0000000..7be08bd --- /dev/null +++ b/deans-frontend/src/containers/RealTimeCrisisTracker/index.js @@ -0,0 +1,25 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { connect } from "react-redux"; +import { startRealTimeCrisisTracking } from "@redux/actions"; + +class RealTimeCrisisTracker extends React.Component { + componentDidMount = () => this.props.startRealTimeCrisisTracking(); // 10 min + render() { + return this.props.children; + } +} + +RealTimeCrisisTracker.propTypes = { + startRealTimeCrisisTracking: PropTypes.func.isRequired, + children: PropTypes.object.isRequired +}; + +const mapDispatchToProps = dispatch => ({ + startRealTimeCrisisTracking: () => dispatch(startRealTimeCrisisTracking()) +}); + +export default connect( + null, + mapDispatchToProps +)(RealTimeCrisisTracker); diff --git a/deans-frontend/src/index.js b/deans-frontend/src/index.js new file mode 100644 index 0000000..e76e169 --- /dev/null +++ b/deans-frontend/src/index.js @@ -0,0 +1,41 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import { Provider } from "react-redux"; +import store from "@redux/store"; +import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; + +import * as ROUTES from "src/routes"; +import PageHome from "@containers/PageHome"; +import PageReport from "@containers/PageReport"; +import PageLogin from "@containers/PageLogin"; +import PageStaff from "@containers/PageStaff"; +import ModalContainer from "@containers/ModalContainer"; +import RealTimeConditionTracker from "@containers/RealTimeConditionTracker"; +import RealTimeCrisisTracker from "@containers/RealTimeCrisisTracker"; + +import "src/styles/app.scss"; +import "antd/dist/antd.less"; + +const App = () => ( + + + + + + + + + + + + {/* fall back main page */} + + + + + + + +); + +ReactDOM.render(, document.getElementById("app")); diff --git a/deans-frontend/src/redux/actionTypes.js b/deans-frontend/src/redux/actionTypes.js new file mode 100644 index 0000000..d632176 --- /dev/null +++ b/deans-frontend/src/redux/actionTypes.js @@ -0,0 +1,83 @@ +// ======================================================== SYSTEM INIT +export const FETCH_CRISIS_TYPE_REQUESTED = "FETCH_CRISIS_TYPE_REQUESTED"; +export const FETCH_CRISIS_TYPE_SUCCESS = "FETCH_CRISIS_TYPE_SUCCESS"; +export const FETCH_CRISIS_TYPE_FAILURE = "FETCH_CRISIS_TYPE_FAILURE"; +export const FETCH_ASSISTANCE_TYPE_REQUESTED = + "FETCH_ASSISTANCE_TYPE_REQUESTED"; +export const FETCH_ASSISTANCE_TYPE_SUCCESS = "FETCH_ASSISTANCE_TYPE_SUCCESS"; +export const FETCH_ASSISTANCE_TYPE_FAILURE = "FETCH_ASSISTANCE_TYPE_FAILURE"; +export const FETCH_EMERGENCY_AGENCIES_REQUESTED = + "FETCH_EMERGENCY_AGENCIES_REQUESTED"; +export const FETCH_EMERGENCY_AGENCIES_SUCCESS = + "FETCH_EMERGENCY_AGENCIES_SUCCESS"; +export const FETCH_EMERGENCY_AGENCIES_FAILURE = + "FETCH_EMERGENCY_AGENCIES_FAILURE"; + +// ======================================================== COMMON USER +export const FETCH_CRISIS_REQUESTED = "FETCH_CRISIS_REQUESTED"; +export const FETCH_CRISIS_SUCCESS = "FETCH_CRISIS_SUCCESS"; +export const FETCH_CRISIS_FAILURE = "FETCH_CRISIS_FAILURE"; +export const REPORT_CRISIS_REQUESTED = "REPORT_CRISIS_REQUESTED"; +export const REPORT_CRISIS_SUCCESS = "REPORT_CRISIS_SUCCESS"; +export const REPORT_CRISIS_FAILURE = "REPORT_CRISIS_FAILURE"; +export const FETCH_PSI_REQUESTED = "FETCH_PSI_REQUESTED"; +export const FETCH_PSI_SUCCESS = "FETCH_PSI_SUCCESS"; +export const FETCH_PSI_FAILURE = "FETCH_PSI_FAILURE"; +export const FETCH_HUMIDITY_REQUESTED = "FETCH_HUMIDITY_REQUESTED"; +export const FETCH_HUMIDITY_SUCCESS = "FETCH_HUMIDITY_SUCCESS"; +export const FETCH_HUMIDITY_FAILURE = "FETCH_HUMIDITY_FAILURE"; +export const FETCH_RAINFALL_REQUESTED = "FETCH_RAINFALL_REQUESTED"; +export const FETCH_RAINFALL_SUCCESS = "FETCH_RAINFALL_SUCCESS"; +export const FETCH_RAINFALL_FAILURE = "FETCH_RAINFALL_FAILURE"; +export const FETCH_TEMPERATURE_REQUESTED = "FETCH_TEMPERATURE_REQUESTED"; +export const FETCH_TEMPERATURE_SUCCESS = "FETCH_TEMPERATURE_SUCCESS"; +export const FETCH_TEMPERATURE_FAILURE = "FETCH_TEMPERATURE_FAILURE"; + +// ======================================================== STAFF +export const USER_LOGIN_REQUESTED = "USER_LOGIN_REQUESTED"; +export const USER_LOGIN_SUCCESS = "USER_LOGIN_SUCCESS"; +export const USER_LOGIN_FAILURE = "USER_LOGIN_FAILURE"; +export const USER_LOGOUT_REQUESTED = "USER_LOGOUT_REQUESTED"; +export const USER_LOGOUT_SUCCESS = "USER_LOGOUT_SUCCESS"; +export const USER_LOGOUT_FAILURE = "USER_LOGOUT_FAILURE"; +export const FETCH_CURRENT_USER_REQUESTED = "FETCH_CURRENT_USER_REQUESTED"; +export const FETCH_CURRENT_USER_SUCCESS = "FETCH_CURRENT_USER_SUCCESS"; +export const FETCH_CURRENT_USER_FAILURE = "FETCH_CURRENT_USER_FAILURE"; +export const FETCH_USER_LIST_REQUESTED = "FETCH_USER_LIST_REQUESTED"; +export const FETCH_USER_LIST_SUCCESS = "FETCH_USER_LIST_SUCCESS"; +export const FETCH_USER_LIST_FAILURE = "FETCH_USER_LIST_FAILURE"; +export const RESOLVE_CRISIS_REQUESTED = "RESOLVE_CRISIS_REQUESTED"; +export const RESOLVE_CRISIS_SUCCESS = "RESOLVE_CRISIS_SUCCESS"; +export const RESOLVE_CRISIS_FAILURE = "RESOLVE_CRISIS_FAILURE"; +export const ADD_USER_REQUESTED = "ADD_USER_REQUESTED"; +export const ADD_USER_SUCCESS = "ADD_USER_SUCCESS"; +export const ADD_USER_FAILURE = "ADD_USER_FAILURE"; +export const EDIT_USER_REQUESTED = "EDIT_USER_REQUESTED"; +export const EDIT_USER_SUCCESS = "EDIT_USER_SUCCESS"; +export const EDIT_USER_FAILURE = "EDIT_USER_FAILURE"; +export const ADD_CRISIS_TYPE_REQUESTED = "ADD_CRISIS_TYPE_REQUESTED"; +export const ADD_CRISIS_TYPE_SUCCESS = "ADD_CRISIS_TYPE_SUCCESS"; +export const ADD_CRISIS_TYPE_FAILURE = "ADD_CRISIS_TYPE_FAILURE"; +export const ADD_ASSISTANCE_TYPE_REQUESTED = "ADD_ASSISTANCE_TYPE_REQUESTED"; +export const ADD_ASSISTANCE_TYPE_SUCCESS = "ADD_ASSISTANCE_TYPE_SUCCESS"; +export const ADD_ASSISTANCE_TYPE_FAILURE = "ADD_ASSISTANCE_TYPE_FAILURE"; +export const ADD_EMERGENCY_AGENCIES_REQUESTED = + "ADD_EMERGENCY_AGENCIES_REQUESTED"; +export const ADD_EMERGENCY_AGENCIES_SUCCESS = "ADD_EMERGENCY_AGENCIES_SUCCESS"; +export const ADD_EMERGENCY_AGENCIES_FAILURE = "ADD_EMERGENCY_AGENCIES_FAILURE"; +export const EDIT_EMERGENCY_AGENCIES_REQUESTED = + "EDIT_EMERGENCY_AGENCIES_REQUESTED"; +export const EDIT_EMERGENCY_AGENCIES_SUCCESS = + "EDIT_EMERGENCY_AGENCIES_SUCCESS"; +export const EDIT_EMERGENCY_AGENCIES_FAILURE = + "EDIT_EMERGENCY_AGENCIES_TYPE_FAILURE"; +export const EDIT_SITE_SETTINGS_REQUESTED = "EDIT_SITE_SETTINGS_REQUESTED"; +export const EDIT_SITE_SETTINGS_SUCCESS = "EDIT_SITE_SETTINGS_SUCCESS"; +export const EDIT_SITE_SETTINGS_FAILURE = "EDIT_SITE_SETTINGS_TYPE_FAILURE"; +export const DISPATCH_CRISIS_REQUESTED = "DISPATCH_CRISIS_REQUESTED"; +export const DISPATCH_CRISIS_SUCCESS = "DISPATCH_CRISIS_SUCCESS"; +export const DISPATCH_CRISIS_FAILURE = "DISPATCH_CRISIS_TYPE_FAILURE"; + +// ======================================================== MODAL +export const MODAL_SHOW = "MODAL_SHOW"; +export const MODAL_HIDE = "MODAL_HIDE"; diff --git a/deans-frontend/src/redux/actions.js b/deans-frontend/src/redux/actions.js new file mode 100644 index 0000000..e3b97c6 --- /dev/null +++ b/deans-frontend/src/redux/actions.js @@ -0,0 +1,454 @@ +import * as actionTypes from "./actionTypes"; +import * as api from "@api"; + +export const startRealTimeCrisisTracking = () => dispatch => { + let socket; + const onOpen = () => { + console.log("Socket connection established."); + dispatch({ + type: actionTypes.FETCH_CRISIS_REQUESTED + }); + api + .getCrises() + .then(response => + dispatch({ + type: actionTypes.FETCH_CRISIS_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_CRISIS_FAILURE + }) + ); + }; + const onMessage = message => { + console.log("Socket received message."); + const crises = JSON.parse(message && message.data); + dispatch({ + type: actionTypes.FETCH_CRISIS_SUCCESS, + payload: crises + }); + }; + const onException = () => { + console.log("Socket connection error... Try again in 10 seconds."); + setTimeout(() => { + socket = api.createWebSocket(); + socket.onerror = onException; + socket.onopen = onOpen; + socket.onmessage = onMessage; + // socket.onclose = onException; + }, 10000); + }; + + socket = api.createWebSocket(); + socket.onerror = onException; + socket.onopen = onOpen; + socket.onmessage = onMessage; +}; + +export const startRealTimeConditionTracking = interval => { + return async dispatch => { + const job = () => { + api + .getPSI() + .then(response => + dispatch({ + type: actionTypes.FETCH_PSI_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_PSI_FAILURE + }) + ); + api + .getHumidity() + .then(response => + dispatch({ + type: actionTypes.FETCH_HUMIDITY_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_HUMIDITY_FAILURE + }) + ); + api + .getRainfall() + .then(response => + dispatch({ + type: actionTypes.FETCH_RAINFALL_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_RAINFALL_FAILURE + }) + ); + api + .getTemperature() + .then(response => + dispatch({ + type: actionTypes.FETCH_TEMPERATURE_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_TEMPERATURE_FAILURE + }) + ); + }; + job(); + setInterval(job, interval); + }; +}; + +export const fetchTypes = () => { + return async dispatch => { + dispatch({ + type: actionTypes.FETCH_CRISIS_TYPE_REQUESTED + }); + api + .getCrisisType() + .then(response => + dispatch({ + type: actionTypes.FETCH_CRISIS_TYPE_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_CRISIS_TYPE_FAILURE + }) + ); + dispatch({ + type: actionTypes.FETCH_ASSISTANCE_TYPE_REQUESTED + }); + api + .getAssistanceType() + .then(response => + dispatch({ + type: actionTypes.FETCH_ASSISTANCE_TYPE_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_ASSISTANCE_TYPE_FAILURE + }) + ); + dispatch({ + type: actionTypes.FETCH_EMERGENCY_AGENCIES_REQUESTED + }); + api + .getEmergencyAgencies() + .then(response => + dispatch({ + type: actionTypes.FETCH_EMERGENCY_AGENCIES_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_EMERGENCY_AGENCIES_FAILURE + }) + ); + }; +}; + +export const getCrises = () => { + return async dispatch => { + dispatch({ + type: actionTypes.FETCH_CRISIS_REQUESTED + }); + api + .getCrises() + .then(response => + dispatch({ + type: actionTypes.FETCH_CRISIS_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_CRISIS_FAILURE + }) + ); + }; +}; + +export const getUserList = () => { + return async dispatch => { + dispatch({ + type: actionTypes.FETCH_USER_LIST_REQUESTED + }); + api + .getUserList() + .then(response => + dispatch({ + type: actionTypes.FETCH_USER_LIST_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_USER_LIST_FAILURE + }) + ); + }; +}; + +export const reportCrises = form => { + return async dispatch => { + dispatch({ + type: actionTypes.REPORT_CRISIS_REQUESTED + }); + await api + .reportCrises(form) + .then(() => dispatch({ type: actionTypes.REPORT_CRISIS_SUCCESS })) + .catch(() => dispatch({ type: actionTypes.REPORT_CRISIS_FAILURE })); + }; +}; + +export const userLogin = form => { + return async dispatch => { + dispatch({ + type: actionTypes.USER_LOGIN_REQUESTED + }); + await api + .userLogin(form) + .then(response => { + dispatch({ + type: actionTypes.USER_LOGIN_SUCCESS, + payload: response.data + }); + }) + .catch(() => dispatch({ type: actionTypes.USER_LOGIN_FAILURE })); + }; +}; + +export const userLogout = form => { + return async dispatch => { + dispatch({ + type: actionTypes.USER_LOGOUT_REQUESTED + }); + await api + .userLogout(form) + .then(() => { + dispatch({ + type: actionTypes.USER_LOGOUT_SUCCESS + }); + }) + .catch(() => dispatch({ type: actionTypes.USER_LOGOUT_FAILURE })); + }; +}; + +export const resolveCrisis = (id, undo) => { + return async dispatch => { + dispatch({ + type: actionTypes.RESOLVE_CRISIS_REQUESTED + }); + await api + .resolveCrisis(id, undo) + .then(() => { + dispatch({ + type: actionTypes.RESOLVE_CRISIS_SUCCESS + }); + }) + .catch(() => dispatch({ type: actionTypes.RESOLVE_CRISIS_FAILURE })); + }; +}; + +export const addUser = form => { + return async dispatch => { + dispatch({ + type: actionTypes.ADD_USER_REQUESTED + }); + await api + .addUser(form) + .then(() => { + dispatch({ + type: actionTypes.ADD_USER_SUCCESS + }); + }) + .catch(() => dispatch({ type: actionTypes.ADD_USER_FAILURE })); + }; +}; + +export const editUser = (id, form) => { + return async dispatch => { + dispatch({ + type: actionTypes.EDIT_USER_REQUESTED + }); + await api + .editUser(id, form) + .then(() => { + dispatch({ + type: actionTypes.EDIT_USER_SUCCESS + }); + }) + .catch(() => dispatch({ type: actionTypes.EDIT_USER_FAILURE })); + }; +}; + +export const addCrisisType = form => { + return async dispatch => { + dispatch({ + type: actionTypes.ADD_CRISIS_TYPE_REQUESTED + }); + await api + .addCrisisType(form) + .then(() => { + dispatch({ type: actionTypes.ADD_CRISIS_TYPE_SUCCESS }); + }) + .catch(() => dispatch({ type: actionTypes.ADD_CRISIS_TYPE_FAILURE })); + }; +}; + +export const addAssistanceType = form => { + return async dispatch => { + dispatch({ + type: actionTypes.ADD_ASSISTANCE_TYPE_REQUESTED + }); + await api + .addAssistanceType(form) + .then(() => { + dispatch({ type: actionTypes.ADD_ASSISTANCE_TYPE_SUCCESS }); + }) + .catch(() => dispatch({ type: actionTypes.ADD_ASSISTANCE_TYPE_FAILURE })); + }; +}; + +export const getEmergencyAgencies = () => { + return async dispatch => { + dispatch({ + type: actionTypes.FETCH_EMERGENCY_AGENCIES_REQUESTED + }); + api + .getEmergencyAgencies() + .then(response => + dispatch({ + type: actionTypes.FETCH_EMERGENCY_AGENCIES_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_EMERGENCY_AGENCIES_FAILURE + }) + ); + }; +}; + +export const editEmergencyAgencies = (id, form) => { + return async dispatch => { + dispatch({ + type: actionTypes.EDIT_EMERGENCY_AGENCIES_REQUESTED + }); + await api + .editEmergencyAgencies(id, form) + .then(response => + dispatch({ + type: actionTypes.EDIT_EMERGENCY_AGENCIES_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.EDIT_EMERGENCY_AGENCIES_FAILURE + }) + ); + }; +}; + +export const addEmergencyAgencies = form => { + return async dispatch => { + dispatch({ + type: actionTypes.ADD_EMERGENCY_AGENCIES_REQUESTED + }); + await api + .addEmergencyAgencies(form) + .then(() => { + dispatch({ type: actionTypes.ADD_EMERGENCY_AGENCIES_SUCCESS }); + }) + .catch(() => + dispatch({ type: actionTypes.ADD_EMERGENCY_AGENCIES_FAILURE }) + ); + }; +}; + +export const editSiteSettings = form => { + return async dispatch => { + dispatch({ + type: actionTypes.EDIT_SITE_SETTINGS_REQUESTED + }); + await api + .editSiteSettings(form) + .then(() => { + dispatch({ type: actionTypes.EDIT_SITE_SETTINGS_SUCCESS }); + }) + .catch(() => dispatch({ type: actionTypes.EDIT_SITE_SETTINGS_FAILURE })); + }; +}; + +export const getCurrentUser = () => { + return async dispatch => { + dispatch({ + type: actionTypes.FETCH_CURRENT_USER_REQUESTED + }); + api + .getCurrentUser() + .then(response => + dispatch({ + type: actionTypes.FETCH_CURRENT_USER_SUCCESS, + payload: response.data + }) + ) + .catch(() => + dispatch({ + type: actionTypes.FETCH_CURRENT_USER_FAILURE + }) + ); + }; +}; + +export const dispatchCrisis = (id, phoneNumberToNotify) => { + return async dispatch => { + dispatch({ + type: actionTypes.DISPATCH_CRISIS_REQUESTED + }); + await api + .dispatchCrisis(id, phoneNumberToNotify) + .then(() => + dispatch({ + type: actionTypes.DISPATCH_CRISIS_SUCCESS + }) + ) + .catch(() => + dispatch({ + type: actionTypes.DISPATCH_CRISIS_FAILURE + }) + ); + }; +}; + +export const showModal = (modalType, modalProps) => { + return { + type: actionTypes.MODAL_SHOW, + payload: { + modalType, + modalProps + } + }; +}; + +export const hideModal = () => { + return { + type: actionTypes.MODAL_HIDE + }; +}; diff --git a/deans-frontend/src/redux/reducers.js b/deans-frontend/src/redux/reducers.js new file mode 100644 index 0000000..b2869ff --- /dev/null +++ b/deans-frontend/src/redux/reducers.js @@ -0,0 +1,310 @@ +import * as actionTypes from "./actionTypes"; +import { combineReducers } from "redux"; + +const initialState = { + staff: { + currentUser: null, + isAdmin: false, + flag: false, + userList: null + }, + system: { + crisisType: null, + assistanceType: null, + emergencyAgencies: null + }, + common: { + flag: false, + crises: null, + psi: null, + humidity: null, + temperature: null, + rainfall: null + }, + modal: { + modalType: null, + modalProps: null + } +}; + +const system = (state = initialState.system, action) => { + const { type, payload } = action; + const transform = obj => { + const type = {}; + obj.forEach(val => { + type[val.id] = val.name; + }); + return type; + }; + switch (type) { + case actionTypes.FETCH_CRISIS_TYPE_SUCCESS: + return { + ...state, + crisisType: transform(payload) + }; + case actionTypes.FETCH_ASSISTANCE_TYPE_SUCCESS: + return { + ...state, + assistanceType: transform(payload) + }; + case actionTypes.FETCH_EMERGENCY_AGENCIES_SUCCESS: + return { + ...state, + emergencyAgencies: payload + }; + default: + return state; + } +}; + +// eslint-disable-next-line +const staff = (state = initialState.staff, action) => { + const { type, payload } = action; + switch (type) { + case actionTypes.USER_LOGIN_REQUESTED: + return { + ...state, + flag: false // reset flag + }; + case actionTypes.USER_LOGIN_SUCCESS: + localStorage.setItem("token", payload.key); // set token + return { + ...state, + flag: true + }; + case actionTypes.USER_LOGIN_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.USER_LOGOUT_REQUESTED: + return { + ...state, + flag: false // reset flag + }; + case actionTypes.USER_LOGOUT_SUCCESS: + localStorage.removeItem("token"); // remove token + return { + ...state, + currentUser: null, + isAdmin: false, + flag: true + }; + case actionTypes.USER_LOGOUT_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.FETCH_USER_LIST_SUCCESS: + return { + ...state, + userList: payload + }; + case actionTypes.FETCH_CURRENT_USER_SUCCESS: + return { + ...state, + currentUser: payload.username, + isAdmin: payload.is_staff + }; + case actionTypes.RESOLVE_CRISIS_REQUESTED: + return { + ...state, + flag: false // reset flag + }; + case actionTypes.RESOLVE_CRISIS_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.RESOLVE_CRISIS_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.ADD_USER_REQUESTED: + return { + ...state, + flag: false + }; + case actionTypes.ADD_USER_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.ADD_USER_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.EDIT_USER_REQUESTED: + return { + ...state, + flag: false + }; + case actionTypes.EDIT_USER_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.EDIT_USER_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.ADD_CRISIS_TYPE_REQUESTED: + return { + ...state, + flag: false + }; + case actionTypes.ADD_CRISIS_TYPE_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.ADD_CRISIS_TYPE_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.ADD_ASSISTANCE_TYPE_REQUESTED: + return { + ...state, + flag: false + }; + case actionTypes.ADD_ASSISTANCE_TYPE_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.ADD_ASSISTANCE_TYPE_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.ADD_EMERGENCY_AGENCIES_REQUESTED: + return { + ...state, + flag: false + }; + case actionTypes.ADD_EMERGENCY_AGENCIES_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.ADD_EMERGENCY_AGENCIES_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.EDIT_SITE_SETTINGS_REQUESTED: + return { + ...state, + flag: false + }; + case actionTypes.EDIT_SITE_SETTINGS_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.EDIT_SITE_SETTINGS_FAILURE: + return { + ...state, + flag: false + }; + case actionTypes.EDIT_EMERGENCY_AGENCIES_REQUESTED: + return { + ...state, + flag: false + }; + case actionTypes.EDIT_EMERGENCY_AGENCIES_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.EDIT_EMERGENCY_AGENCIES_FAILURE: + return { + ...state, + flag: false + }; + default: + return state; + } +}; + +const common = (state = initialState.common, action) => { + const { type, payload } = action; + switch (type) { + case actionTypes.FETCH_CRISIS_SUCCESS: + return { + ...state, + crises: payload + }; + case actionTypes.FETCH_PSI_SUCCESS: + return { + ...state, + psi: { + status: payload && payload.api_info && payload.api_info.status, + hourly: + payload && + payload.items && + payload.items[0].readings.no2_one_hour_max + } + }; + case actionTypes.FETCH_HUMIDITY_SUCCESS: + return { + ...state, + humidity: payload && payload.items && payload.items[0].readings[0].value + }; + case actionTypes.FETCH_RAINFALL_SUCCESS: + return { + ...state, + rainfall: + payload && payload.items && payload.items[0].readings[23].value + }; + case actionTypes.FETCH_TEMPERATURE_SUCCESS: + return { + ...state, + temperature: + payload && payload.items && payload.items[0].readings[0].value + }; + case actionTypes.REPORT_CRISIS_REQUESTED: + return { + ...state, + flag: false // reset flag + }; + case actionTypes.REPORT_CRISIS_SUCCESS: + return { + ...state, + flag: true + }; + case actionTypes.REPORT_CRISIS_FAILURE: + return { + ...state, + flag: false + }; + default: + return state; + } +}; + +const modal = (state = initialState.modal, action) => { + const { type, payload } = action; + switch (type) { + case actionTypes.MODAL_SHOW: + return { + ...state, + modalType: payload.modalType, + modalProps: payload.modalProps + }; + case actionTypes.MODAL_HIDE: + return { + ...state, + modalType: null, + modalProps: null + }; + default: + return state; + } +}; + +export default combineReducers({ modal, common, system, staff }); diff --git a/deans-frontend/src/redux/store.js b/deans-frontend/src/redux/store.js new file mode 100644 index 0000000..cfe0eb5 --- /dev/null +++ b/deans-frontend/src/redux/store.js @@ -0,0 +1,12 @@ +import { createStore, applyMiddleware, compose } from "redux"; +import thunk from "redux-thunk"; +import rootReducer from "./reducers"; + +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; + +const store = createStore( + rootReducer, + composeEnhancers(applyMiddleware(thunk)) +); + +export default store; diff --git a/deans-frontend/src/routes/index.js b/deans-frontend/src/routes/index.js new file mode 100644 index 0000000..6705e39 --- /dev/null +++ b/deans-frontend/src/routes/index.js @@ -0,0 +1,9 @@ +export const ROUTE_HOME = "/"; +export const ROUTE_REPORT = "/report"; +export const ROUTE_LOGIN = "/login"; + +// staff page +export const ROUTE_STAFF = "/staff"; +export const ROUTE_DASHBOARD = "/staff/dashboard"; +export const ROUTE_USER_CENTER = "/staff/user-center"; +export const ROUTE_SETTING = "/staff/setting"; diff --git a/deans-frontend/src/styles/_colors.scss b/deans-frontend/src/styles/_colors.scss new file mode 100644 index 0000000..61d5ce7 --- /dev/null +++ b/deans-frontend/src/styles/_colors.scss @@ -0,0 +1,3 @@ +$white: white; +$black: black; +$gray: gray; diff --git a/deans-frontend/src/styles/_functions.scss b/deans-frontend/src/styles/_functions.scss new file mode 100644 index 0000000..7c054c5 --- /dev/null +++ b/deans-frontend/src/styles/_functions.scss @@ -0,0 +1,3 @@ +@mixin disable-select { + user-select: none; +} \ No newline at end of file diff --git a/deans-frontend/src/styles/_typography.scss b/deans-frontend/src/styles/_typography.scss new file mode 100644 index 0000000..661e55e --- /dev/null +++ b/deans-frontend/src/styles/_typography.scss @@ -0,0 +1 @@ +// add your favorite fonts \ No newline at end of file diff --git a/deans-frontend/src/styles/app.scss b/deans-frontend/src/styles/app.scss new file mode 100644 index 0000000..bc68e42 --- /dev/null +++ b/deans-frontend/src/styles/app.scss @@ -0,0 +1,19 @@ +// Add your global style here +:global { + .gm-style:first-of-type > div:nth-child(1) { + cursor: default !important; + } + + .ant-form-item-label { + text-align: left !important; + margin-right: 1rem; + } + + a { + text-decoration: none !important; + } + + body { + min-width: 1024px; + } +} \ No newline at end of file diff --git a/deans-frontend/src/styles/normalize.scss b/deans-frontend/src/styles/normalize.scss new file mode 100644 index 0000000..d7c7aad --- /dev/null +++ b/deans-frontend/src/styles/normalize.scss @@ -0,0 +1,343 @@ +:global { + /*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ + + /* Document + ========================================================================== */ + + /** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers. + */ + + body { + margin: 0; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + ========================================================================== */ + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove the border on images inside links in IE 10. + */ + + img { + border-style: none; + } + + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + + button, + input { /* 1 */ + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * Correct the inability to style clickable types in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Remove the inner border and padding in Firefox. + */ + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ + } + + /** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + vertical-align: baseline; + } + + /** + * Remove the default vertical scrollbar in IE 10+. + */ + + textarea { + overflow: auto; + } + + /** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Remove the inner padding in Chrome and Safari on macOS. + */ + + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Misc + ========================================================================== */ + + /** + * Add the correct display in IE 10+. + */ + + template { + display: none; + } + + /** + * Add the correct display in IE 10. + */ + + [hidden] { + display: none; + } +} \ No newline at end of file diff --git a/deans-frontend/src/utils/README.md b/deans-frontend/src/utils/README.md new file mode 100644 index 0000000..27368a6 --- /dev/null +++ b/deans-frontend/src/utils/README.md @@ -0,0 +1 @@ +## Here is the place where you put your helper functions. \ No newline at end of file diff --git a/deans-frontend/webpack/webpack.common.js b/deans-frontend/webpack/webpack.common.js new file mode 100644 index 0000000..77f8da8 --- /dev/null +++ b/deans-frontend/webpack/webpack.common.js @@ -0,0 +1,185 @@ +const path = require("path"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const CleanWebpackPlugin = require("clean-webpack-plugin"); +const devMode = process.env.NODE_ENV !== "production"; +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); + +// constants +const OUTPUT_PATH = path.resolve(__dirname, "../dist"); +const SRC_PATH = path.resolve(__dirname, "../src"); +const PROJECT_ROOT = path.resolve(__dirname, "../"); + +const config = { + entry: ["babel-polyfill", SRC_PATH + "/index.js"], + output: { + filename: "[name].[hash].js", + publicPath: "/", + path: OUTPUT_PATH + }, + resolve: { + alias: { + src: SRC_PATH, + "@components": SRC_PATH + "/components", + "@containers": SRC_PATH + "/containers", + "@api": SRC_PATH + "/api", + "@redux": SRC_PATH + "/redux", + "@assets": SRC_PATH + "/assets" + } + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: [{ loader: "babel-loader" }] + }, + { + test: [ + /\.(png|jpg|gif|woff|woff2|eot|ttf|svg)/, + /\/typefaces\/.*\.svg/ + ], + exclude: /node_modules/, + use: [{ loader: "file-loader" }] + }, + { + test: /\.css$/, + // exclude: /node_modules/, + use: [ + { + loader: devMode ? "style-loader" : MiniCssExtractPlugin.loader + }, + { + loader: "css-loader", + options: { + importLoaders: 1, + minimize: true, + sourceMap: true, + camelCase: true + } + }, + { + loader: "postcss-loader", + options: { + config: { + path: path.resolve(PROJECT_ROOT, "postcss.config.js") + } + } + } + ] + }, + { + test: /\.less$/, + use: [ + { + loader: "style-loader" + }, + { + loader: "css-loader" // translates CSS into CommonJS + }, + { + loader: "less-loader", // compiles Less to CSS, + options: { + modifyVars: { + "primary-color": "#000000", + "link-color": "#000000", + "border-radius-base": "2px", + "item-hover-bg": "rgba(250,250,250,.9)", + "item-active-bg": "rgba(250,250,250,.9)", + "table-row-hover-bg": "rgba(250,250,250,.9)" + }, + javascriptEnabled: true + } + } + ] + }, + { + test: /\.scss$/, + exclude: /node_modules/, + use: [ + { + loader: devMode ? "style-loader" : MiniCssExtractPlugin.loader + }, + { + loader: "css-loader", + options: { + minimize: true, + sourceMap: true, + importLoaders: 1, + modules: true, + camelCase: true + } + }, + { + loader: "postcss-loader", + options: { + config: { + path: path.resolve(PROJECT_ROOT, "postcss.config.js") + } + } + }, + { + loader: "resolve-url-loader" + }, + { + loader: "sass-loader", + options: { + includePaths: [path.resolve(SRC_PATH, "styles")], + sourceMap: true + } + } + ] + } + ] + }, + optimization: { + splitChunks: { + chunks: "all", + minChunks: 1, + maxAsyncRequests: 5, + maxInitialRequests: 3, + automaticNameDelimiter: "~", + name: true, + cacheGroups: { + vendors: { + test: /[\\/]node_modules[\\/]/, + priority: -10 + }, + default: { + minChunks: 2, + priority: -20, + reuseExistingChunk: true + } + } + }, + minimizer: [ + // we specify a custom UglifyJsPlugin here to get source maps in production + new UglifyJsPlugin({ + cache: true, + parallel: true, + uglifyOptions: { + compress: false, + ecma: 6, + mangle: true + }, + sourceMap: true + }) + ] + }, + plugins: [ + new HtmlWebpackPlugin({ + template: PROJECT_ROOT + "/index.html" + }), + new CleanWebpackPlugin([OUTPUT_PATH], { + root: PROJECT_ROOT + }), + new MiniCssExtractPlugin({ + // Options similar to the same options in webpackOptions.output + // both options are optional + filename: devMode ? "[name].css" : "[name].[hash].css", + chunkFilename: devMode ? "[id].css" : "[id].[hash].css" + }) + ] +}; + +module.exports = config; diff --git a/deans-frontend/webpack/webpack.dev.js b/deans-frontend/webpack/webpack.dev.js new file mode 100644 index 0000000..4b4d632 --- /dev/null +++ b/deans-frontend/webpack/webpack.dev.js @@ -0,0 +1,12 @@ +const merge = require("webpack-merge"); +const common = require("./webpack.common.js"); + +module.exports = merge(common, { + mode: "development", + devServer: { + host: "0.0.0.0", + historyApiFallback: true, // make sure Router works by redirecting 404 back to entry point + port: 3000, + open: true + } +}); diff --git a/deans-frontend/webpack/webpack.prod.js b/deans-frontend/webpack/webpack.prod.js new file mode 100644 index 0000000..b4b0178 --- /dev/null +++ b/deans-frontend/webpack/webpack.prod.js @@ -0,0 +1,6 @@ +const merge = require("webpack-merge"); +const common = require("./webpack.common.js"); + +module.exports = merge(common, { + mode: "production" +}); diff --git a/deans-frontend/yarn.lock b/deans-frontend/yarn.lock new file mode 100644 index 0000000..538e25a --- /dev/null +++ b/deans-frontend/yarn.lock @@ -0,0 +1,9250 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ant-design/icons-react@~1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons-react/-/icons-react-1.1.1.tgz#6b58eb7cc5612392a2c4347d27d85e599d130661" + dependencies: + ant-design-palettes "^1.1.3" + babel-runtime "^6.26.0" + +"@ant-design/icons@~1.1.5": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-1.1.7.tgz#b901f6f35e8b518229ec4cd11f65bc34a422f992" + +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + dependencies: + "@babel/highlight" "7.0.0-beta.44" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + dependencies: + "@babel/types" "7.0.0-beta.44" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + lodash "^4.2.0" + +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + +"@mapbox/point-geometry@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + +"@webassemblyjs/ast@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" + dependencies: + "@webassemblyjs/helper-module-context" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/wast-parser" "1.5.13" + debug "^3.1.0" + mamacro "^0.0.3" + +"@webassemblyjs/floating-point-hex-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" + +"@webassemblyjs/helper-api-error@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" + +"@webassemblyjs/helper-buffer@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" + dependencies: + debug "^3.1.0" + +"@webassemblyjs/helper-code-frame@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" + dependencies: + "@webassemblyjs/wast-printer" "1.5.13" + +"@webassemblyjs/helper-fsm@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" + +"@webassemblyjs/helper-module-context@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" + dependencies: + debug "^3.1.0" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" + +"@webassemblyjs/helper-wasm-section@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + debug "^3.1.0" + +"@webassemblyjs/ieee754@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" + dependencies: + ieee754 "^1.1.11" + +"@webassemblyjs/leb128@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" + dependencies: + long "4.0.0" + +"@webassemblyjs/utf8@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" + +"@webassemblyjs/wasm-edit@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/helper-wasm-section" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + "@webassemblyjs/wasm-opt" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + "@webassemblyjs/wast-printer" "1.5.13" + debug "^3.1.0" + +"@webassemblyjs/wasm-gen@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/ieee754" "1.5.13" + "@webassemblyjs/leb128" "1.5.13" + "@webassemblyjs/utf8" "1.5.13" + +"@webassemblyjs/wasm-opt@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + debug "^3.1.0" + +"@webassemblyjs/wasm-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-api-error" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/ieee754" "1.5.13" + "@webassemblyjs/leb128" "1.5.13" + "@webassemblyjs/utf8" "1.5.13" + +"@webassemblyjs/wast-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/floating-point-hex-parser" "1.5.13" + "@webassemblyjs/helper-api-error" "1.5.13" + "@webassemblyjs/helper-code-frame" "1.5.13" + "@webassemblyjs/helper-fsm" "1.5.13" + long "^3.2.0" + mamacro "^0.0.3" + +"@webassemblyjs/wast-printer@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/wast-parser" "1.5.13" + long "^3.2.0" + +"@webpack-contrib/schema-utils@^1.0.0-beta.0": + version "1.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chalk "^2.3.2" + strip-ansi "^4.0.0" + text-table "^0.2.0" + webpack-log "^1.1.2" + +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + dependencies: + acorn "^5.0.0" + +acorn-globals@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn-jsx@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" + dependencies: + acorn "^5.0.3" + +acorn-walk@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.0.tgz#c957f4a1460da46af4a0388ce28b4c99355b0cbc" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.0.0, acorn@^5.0.3, acorn@^5.5.0, acorn@^5.6.0, acorn@^5.6.2: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + +acorn@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" + +add-dom-event-listener@1.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz#8faed2c41008721cf111da1d30d995b85be42bed" + dependencies: + object-assign "4.x" + +adjust-sourcemap-loader@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz#e33fde95e50db9f2a802e3647e311d2fc5000c69" + dependencies: + assert "^1.3.0" + camelcase "^1.2.1" + loader-utils "^1.1.0" + lodash.assign "^4.0.1" + lodash.defaults "^3.1.2" + object-path "^0.9.2" + regex-parser "^2.2.9" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.0.1, ajv@^6.1.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.1" + +ajv@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +ant-design-palettes@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ant-design-palettes/-/ant-design-palettes-1.1.3.tgz#84119b1a4d86363adc52a38d587e65336a0a27dd" + dependencies: + tinycolor2 "^1.4.1" + +antd@^3.9.2: + version "3.9.2" + resolved "https://registry.yarnpkg.com/antd/-/antd-3.9.2.tgz#7f1007da4fc746e8a0d9bb6846b70b6001374ed9" + dependencies: + "@ant-design/icons" "~1.1.5" + "@ant-design/icons-react" "~1.1.1" + array-tree-filter "^2.0.0" + babel-runtime "6.x" + classnames "~2.2.0" + create-react-class "^15.6.0" + create-react-context "0.2.2" + css-animation "^1.2.5" + dom-closest "^0.2.0" + enquire.js "^2.1.1" + intersperse "^1.0.0" + lodash "^4.17.5" + moment "^2.19.3" + omit.js "^1.0.0" + prop-types "^15.5.7" + raf "^3.4.0" + rc-animate "^2.4.1" + rc-calendar "~9.7.3" + rc-cascader "~0.16.0" + rc-checkbox "~2.1.5" + rc-collapse "~1.10.0" + rc-dialog "~7.2.0" + rc-drawer "~1.7.3" + rc-dropdown "~2.2.0" + rc-editor-mention "^1.0.2" + rc-form "^2.1.0" + rc-input-number "~4.0.0" + rc-menu "~7.4.1" + rc-notification "~3.2.0" + rc-pagination "~1.17.0" + rc-progress "~2.2.2" + rc-rate "~2.4.0" + rc-select "~8.2.6" + rc-slider "~8.6.0" + rc-steps "~3.3.0" + rc-switch "~1.7.0" + rc-table "~6.3.2" + rc-tabs "~9.4.0" + rc-time-picker "~3.4.0" + rc-tooltip "~3.7.0" + rc-tree "~1.14.5" + rc-tree-select "~2.2.0" + rc-trigger "^2.5.4" + rc-upload "~2.5.0" + rc-util "^4.0.4" + react-lazy-load "^3.0.12" + react-lifecycles-compat "^3.0.2" + react-slick "~0.23.1" + shallowequal "^1.0.1" + warning "~4.0.1" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-tree-filter@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-1.0.1.tgz#0a8ad1eefd38ce88858632f9cc0423d7634e4d5d" + +array-tree-filter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1, assert@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async-validator@1.x: + version "1.8.5" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0" + dependencies: + babel-runtime "6.x" + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4, async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + +autoprefixer@^7.1.1: + version "7.2.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" + dependencies: + browserslist "^2.11.3" + caniuse-lite "^1.0.30000805" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.17" + postcss-value-parser "^3.2.3" + +autoprefixer@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.0.2.tgz#c41947aa155038b3614414dbc58b4e70908af6e0" + dependencies: + browserslist "^4.0.1" + caniuse-lite "^1.0.30000865" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.2" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + +axios@^0.18.0: + version "0.18.0" + resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + dependencies: + follow-redirects "^1.3.0" + is-buffer "^1.1.5" + +axobject-query@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.1.tgz#05dfa705ada8ad9db993fa6896f22d395b0b0a07" + dependencies: + ast-types-flow "0.0.7" + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.26.0, babel-core@^6.26.3: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-eslint@^8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-generator@^6.18.0, babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + 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" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + 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" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + 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" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + dependencies: + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" + +babel-loader@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-dynamic-import-node@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.0.0.tgz#d6fc3f6c5e3bdc34e49c15faca7ce069755c0a57" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + object.assign "^4.1.0" + +babel-plugin-istanbul@^4.1.6: + version "4.1.6" + resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + +babel-plugin-jest-hoist@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + 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" + +babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + 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" + +babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + 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" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0, babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-display-name@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + 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" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^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.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + +babel-preset-jest@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" + dependencies: + babel-plugin-jest-hoist "^23.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-preset-react@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@6.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + 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" + +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + 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" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + 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" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + 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" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + 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" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^2.0.0, browserslist@^2.11.3: + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + dependencies: + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +browserslist@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.0.1.tgz#61c05ce2a5843c7d96166408bc23d58b5416e818" + dependencies: + caniuse-lite "^1.0.30000865" + electron-to-chromium "^1.3.52" + node-releases "^1.0.0-alpha.10" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + 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" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-api@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-2.0.0.tgz#b1ddb5a5966b16f48dc4998444d4bbc6c7d9d834" + dependencies: + browserslist "^2.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000865: + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + dependencies: + rsvp "^3.3.3" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + 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" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +chardet@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" + +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chokidar@^2.0.0, chokidar@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + dependencies: + tslib "^1.9.0" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@2.x, classnames@^2.2.0, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@~2.2.0: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + +clean-css@4.1.x: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" + dependencies: + source-map "0.5.x" + +clean-webpack-plugin@^0.1.19: + version "0.1.19" + resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz#ceda8bb96b00fe168e9b080272960d20fdcadd6d" + dependencies: + rimraf "^2.6.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cli@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" + dependencies: + exit "0.1.2" + glob "^7.1.1" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +clone@^2.1.1, clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.3.0, color-convert@^1.8.2, color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + dependencies: + color-name "1.1.1" + +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + +color-name@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color-string@^1.4.0, color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +color@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/color/-/color-1.0.3.tgz#e48e832d85f14ef694fb468811c2d5cfe729b55d" + dependencies: + color-convert "^1.8.2" + color-string "^1.4.0" + +color@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color/-/color-2.0.1.tgz#e4ed78a3c4603d0891eba5430b04b86314f4c839" + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5, combined-stream@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@2.16.x, commander@^2.11.0, commander@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + +common-tags@^1.4.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-classes@1.x, component-classes@^1.2.5, component-classes@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" + dependencies: + component-indexof "0.0.3" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-indexof@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" + +compressible@~2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" + dependencies: + mime-db ">= 1.34.0 < 2" + +compression@^1.5.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + +console-browserify@1.1.x, console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + +convert-source-map@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + 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" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + require-from-string "^2.0.1" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + 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" + +create-react-class@^15.5.2, create-react-class@^15.5.3, create-react-class@^15.6.0: + version "15.6.3" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +create-react-context@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" + dependencies: + fbjs "^0.8.0" + gud "^1.0.0" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + 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" + +css-animation@1.x, css-animation@^1.2.5, css-animation@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.4.1.tgz#5b8813125de0fbbbb0bbe1b472ae84221469b7a8" + dependencies: + babel-runtime "6.x" + component-classes "^1.2.5" + +css-color-function@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/css-color-function/-/css-color-function-1.3.3.tgz#8ed24c2c0205073339fafa004bc8c141fccb282e" + dependencies: + balanced-match "0.1.0" + color "^0.11.0" + debug "^3.1.0" + rgb "~0.1.0" + +css-loader@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56" + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + postcss "^6.0.23" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +css@^2.0.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.5.1" + urix "^0.1.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" + +cssstyle@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" + dependencies: + cssom "0.3.x" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +damerau-levenshtein@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@=3.1.0, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + dependencies: + xregexp "4.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + +diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dlv@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.2.tgz#270f6737b30d25b6657a7e962c784403f85137e5" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +dom-align@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.8.0.tgz#c0e89b5b674c6e836cd248c52c2992135f093654" + +dom-closest@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-closest/-/dom-closest-0.2.0.tgz#ebd9f91d1bf22e8d6f477876bbcd3ec90216c0cf" + dependencies: + dom-matches ">=1.0.1" + +dom-converter@~0.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" + dependencies: + utila "~0.3" + +dom-matches@>=1.0.1: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-matches/-/dom-matches-2.0.0.tgz#d2728b416a87533980eb089b848d253cf23a758c" + +dom-scroll-into-view@1.x, dom-scroll-into-view@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +domelementtype@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + +domhandler@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + dependencies: + domelementtype "1" + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domutils@1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + dependencies: + domelementtype "1" + +domutils@1.5, domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +draft-js@^0.10.0, draft-js@~0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/draft-js/-/draft-js-0.10.5.tgz#bfa9beb018fe0533dbb08d6675c371a6b08fa742" + dependencies: + fbjs "^0.8.15" + immutable "~3.7.4" + object-assign "^4.1.0" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.52: + version "1.3.55" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.55.tgz#f150e10b20b77d9d41afcca312efe0c3b1a7fdce" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + 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" + +emoji-regex@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enquire.js@^2.1.1, enquire.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.45" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.9.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-airbnb-base@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz#b5a1b480b80dfad16433d6c4ad84e6605052c05c" + dependencies: + eslint-restricted-globals "^0.1.1" + object.assign "^4.1.0" + object.entries "^1.0.4" + +eslint-config-airbnb@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz#3964ed4bc198240315ff52030bf8636f42bc4732" + dependencies: + eslint-config-airbnb-base "^13.1.0" + object.assign "^4.1.0" + object.entries "^1.0.4" + +eslint-config-prettier@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz#5ecd65174d486c22dff389fe036febf502d468a3" + dependencies: + get-stdin "^5.0.1" + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-json@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-json/-/eslint-plugin-json-1.2.1.tgz#a4d6ecb59b1c3cdc6008d293708e9d57c35c50b0" + dependencies: + jshint "^2.9.6" + +eslint-plugin-jsx-a11y@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.1.tgz#7bf56dbe7d47d811d14dbb3ddff644aa656ce8e1" + dependencies: + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.1" + damerau-levenshtein "^1.0.4" + emoji-regex "^6.5.1" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + +eslint-plugin-prettier@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz#71998c60aedfa2141f7bfcbf9d1c459bf98b4fad" + dependencies: + fast-diff "^1.1.1" + jest-docblock "^21.0.0" + +eslint-plugin-react@^7.11.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.2" + +eslint-restricted-globals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" + +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.0.0: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +eslint@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.5.0.tgz#8557fcceab5141a8197da9ffd9904f89f64425c6" + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + imurmurhash "^0.1.4" + inquirer "^6.1.0" + is-resolvable "^1.1.0" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^2.0.0" + require-uncached "^1.0.3" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" + +espree@^3.5.2, espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +espree@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" + dependencies: + acorn "^5.6.0" + acorn-jsx "^4.1.1" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + +esquery@^1.0.0, esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +eventemitter3@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + +eventlistener@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/eventlistener/-/eventlistener-0.0.1.tgz#ed2baabb852227af2bcf889152c72c63ca532eb8" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + dependencies: + merge "^1.2.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@0.1.2, exit@0.1.x, exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + 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" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^23.6.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + +express@^4.16.2: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + 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.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.0, extend@~3.0.1, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6" + dependencies: + chardet "^0.5.0" + iconv-lite "^0.4.22" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + 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" + +extract-zip@^1.6.5: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-diff@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +fbjs@^0.8.0, fbjs@^0.8.15, fbjs@^0.8.16, fbjs@^0.8.9: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-loader@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.4.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + dependencies: + locate-path "^3.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +flow-bin@^0.77.0: + version "0.77.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.77.0.tgz#4e5c93929f289a0c28e08fb361a9734944a11297" + +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +follow-redirects@^1.0.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.2.tgz#5a9d80e0165957e5ef0c1210678fc5c4acb9fb03" + dependencies: + debug "^3.1.0" + +follow-redirects@^1.3.0: + version "1.5.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" + dependencies: + debug "=3.1.0" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1, form-data@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.0, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + 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" + +global-modules-path@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" + +globals@^11.0.1, globals@^11.1.0, globals@^11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +google-map-react@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/google-map-react/-/google-map-react-1.0.9.tgz#059c546d237d222ac97c4c2462b12a0b8352666b" + dependencies: + "@mapbox/point-geometry" "^0.1.0" + eventemitter3 "^1.1.0" + scriptjs "^2.5.7" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + +hammerjs@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + +handlebars@^4.0.3: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + dependencies: + ajv "^5.3.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasha@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +he@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +history@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" + dependencies: + invariant "^2.2.1" + loose-envify "^1.2.0" + resolve-pathname "^2.2.0" + value-equal "^0.4.0" + warning "^3.0.0" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +html-minifier@^3.2.3: + version "3.5.19" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.19.tgz#ed53c4b7326fe507bc3a1adbcc3bbb56660a2ebd" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.16.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@3.8.x: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +htmlparser2@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + dependencies: + domelementtype "1" + domhandler "2.1" + domutils "1.1" + readable-stream "1.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + dependencies: + http-proxy "^1.16.2" + is-glob "^4.0.0" + lodash "^4.17.5" + micromatch "^3.1.9" + +http-proxy@^1.16.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.17, iconv-lite@^0.4.22, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.11, ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + +immutable@^3.7.4: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + +immutable@~3.7.4: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + dependencies: + import-from "^2.1.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + dependencies: + resolve-from "^3.0.0" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.0.0.tgz#e8c20303ddc15bbfc2c12a6213710ccd9e1413d8" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +internal-ip@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + +interpret@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +intersperse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/intersperse/-/intersperse-1.0.0.tgz#f2561fb1cfef9f5277cc3347a22886b4351a5181" + +invariant@^2.0.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + dependencies: + ci-info "^1.5.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0, is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isnumeric@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/isnumeric/-/isnumeric-0.2.0.tgz#a2347ba360de19e33d0ffd590fddf7755cbf2e64" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.3.1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.1" + istanbul-lib-hook "^1.2.2" + istanbul-lib-instrument "^1.10.2" + istanbul-lib-report "^1.1.5" + istanbul-lib-source-maps "^1.2.6" + istanbul-reports "^1.5.1" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + +istanbul-lib-hook@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + dependencies: + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" + dependencies: + throat "^4.0.0" + +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.3.1" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-source-maps "^1.2.4" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" + jest-get-type "^22.1.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + jest-watcher "^23.4.0" + jest-worker "^23.2.0" + micromatch "^2.3.11" + node-notifier "^5.2.1" + prompts "^0.1.9" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^11.0.0" + +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + dependencies: + babel-core "^6.0.0" + babel-jest "^23.6.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" + jest-get-type "^22.1.0" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" + +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-docblock@^21.0.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" + +jest-docblock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" + dependencies: + detect-newline "^2.1.0" + +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + dependencies: + chalk "^2.0.1" + pretty-format "^23.6.0" + +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" + +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + +jest-get-type@^22.1.0: + version "22.4.3" + resolved "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + invariant "^2.2.4" + jest-docblock "^23.2.0" + jest-serializer "^23.0.1" + jest-worker "^23.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + dependencies: + babel-traverse "^6.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^23.6.0" + is-generator-fn "^1.0.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + dependencies: + pretty-format "^23.6.0" + +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" + dependencies: + jest-regex-util "^23.3.0" + jest-snapshot "^23.6.0" + +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + dependencies: + browser-resolve "^1.11.3" + chalk "^2.0.1" + realpath-native "^1.0.0" + +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + dependencies: + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-docblock "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" + jest-message-util "^23.4.0" + jest-runtime "^23.6.0" + jest-util "^23.4.0" + jest-worker "^23.2.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^4.1.6" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^11.0.0" + +jest-serializer@^23.0.1: + version "23.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" + +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + dependencies: + babel-types "^6.0.0" + chalk "^2.0.1" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^23.6.0" + semver "^5.5.0" + +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" + +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.6.0" + +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + string-length "^2.0.0" + +jest-worker@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" + dependencies: + merge-stream "^1.0.1" + +jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" + dependencies: + import-local "^1.0.0" + jest-cli "^23.6.0" + +js-base64@^2.1.8: + version "2.4.8" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + +js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +jshint@^2.9.6: + version "2.9.6" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.6.tgz#19b34e578095a34928fe006135a6cb70137b9c08" + dependencies: + cli "~1.0.0" + console-browserify "1.1.x" + exit "0.1.x" + htmlparser2 "3.8.x" + lodash "~4.17.10" + minimatch "~3.0.2" + shelljs "0.3.x" + strip-json-comments "1.0.x" + unicode-5.2.0 "^0.7.5" + optionalDependencies: + phantom "~4.0.1" + phantomjs-prebuilt "~2.1.7" + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + dependencies: + string-convert "^0.2.0" + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + +kew@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + +killable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + +less-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" + pify "^3.0.0" + +less@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" + dependencies: + clone "^2.1.2" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + 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" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash-es@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.0.1, lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.debounce@^4.0.0, lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.defaults@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0, lodash.keys@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + +lodash.merge@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + +lodash.template@^4.2.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash.throttle@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash@^4.0.0, lodash@^4.16.5, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@~4.17.10: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +lodash@^4.13.1: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + +log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + dependencies: + chalk "^2.0.1" + +loglevel-colored-level-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" + dependencies: + chalk "^1.1.3" + loglevel "^1.4.1" + +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + +loglevelnext@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" + dependencies: + es6-symbol "^3.1.1" + object.assign "^4.1.0" + +long@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + +long@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0, loud-rejection@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0, meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + 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" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.34.0 < 2", mime-db@~1.35.0: + version "1.35.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" + +mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + dependencies: + mime-db "~1.35.0" + +mime-types@~2.1.19: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + dependencies: + mime-db "~1.36.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + +mime@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +mini-css-extract-plugin@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.1.tgz#d2bcf77bb2596b8e4bd9257e43d3f9164c2e86cb" + dependencies: + "@webpack-contrib/schema-utils" "^1.0.0-beta.0" + loader-utils "^1.1.0" + webpack-sources "^1.1.0" + +mini-store@^1.0.2, mini-store@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/mini-store/-/mini-store-1.1.2.tgz#cc150e0878e080ca58219d47fccefefe2c9aea3e" + dependencies: + hoist-non-react-statics "^2.3.1" + prop-types "^15.6.0" + react-lifecycles-compat "^3.0.4" + shallowequal "^1.0.2" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +moment@2.x, moment@^2.19.3: + version "2.22.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + 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" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mutationobserver-shim@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#f4d5dae7a4971a2207914fb5a90ebd514b65acca" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.10.0, nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + 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" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +needle@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +neo-async@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + +nice-try@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + dependencies: + lower-case "^1.1.1" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + +node-gyp@^3.3.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request ">=2.9.0 <2.82.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + 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 "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + 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.10.3" + vm-browserify "0.0.4" + +node-notifier@^5.2.1: + version "5.3.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01" + dependencies: + growly "^1.3.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.0.0-alpha.10: + version "1.0.0-alpha.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.10.tgz#61c8d5f9b5b2e05d84eba941d05b6f5202f68a2a" + dependencies: + semver "^5.3.0" + +node-sass@^4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz#5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "2.87.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +nwsapi@^2.0.7: + version "2.0.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + +object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.8: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + +object-path@^0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + +omit.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-1.0.0.tgz#e013cb86a7517b9cf6f7cfb0ddb4297256a99288" + dependencies: + babel-runtime "^6.23.0" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onecolor@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/onecolor/-/onecolor-3.0.5.tgz#36eff32201379efdf1180fb445e51a8e2425f9f6" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opn@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + dependencies: + is-wsl "^1.1.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +original@>=0.0.5: + version "1.0.1" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz#b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190" + dependencies: + url-parse "~1.4.0" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + dependencies: + p-limit "^2.0.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + 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" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +phantom@~4.0.1: + version "4.0.12" + resolved "https://registry.yarnpkg.com/phantom/-/phantom-4.0.12.tgz#78d18cf3f2a76fea4909f6160fcabf2742d7dbf0" + dependencies: + phantomjs-prebuilt "^2.1.16" + split "^1.0.1" + winston "^2.4.0" + +phantomjs-prebuilt@^2.1.16, phantomjs-prebuilt@~2.1.7: + version "2.1.16" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" + dependencies: + es6-promise "^4.0.3" + extract-zip "^1.6.5" + fs-extra "^1.0.0" + hasha "^2.2.0" + kew "^0.7.0" + progress "^1.1.8" + request "^2.81.0" + request-progress "^2.0.1" + which "^1.2.10" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pixrem@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pixrem/-/pixrem-4.0.1.tgz#2da4a1de6ec4423c5fc3794e930b81d4490ec686" + dependencies: + browserslist "^2.0.0" + postcss "^6.0.0" + reduce-css-calc "^1.2.7" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pleeease-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pleeease-filters/-/pleeease-filters-4.0.0.tgz#6632b2fb05648d2758d865384fbced79e1ccaec7" + dependencies: + onecolor "^3.0.4" + postcss "^6.0.1" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +portfinder@^1.0.9: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-apply@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/postcss-apply/-/postcss-apply-0.8.0.tgz#14e544bbb5cb6f1c1e048857965d79ae066b1343" + dependencies: + babel-runtime "^6.23.0" + balanced-match "^0.4.2" + postcss "^6.0.0" + +postcss-attribute-case-insensitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-2.0.0.tgz#94dc422c8f90997f16bd33a3654bbbec084963b4" + dependencies: + postcss "^6.0.0" + postcss-selector-parser "^2.2.3" + +postcss-calc@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.1.tgz#3d24171bbf6e7629d422a436ebfe6dd9511f4330" + dependencies: + css-unit-converter "^1.1.1" + postcss "^6.0.0" + postcss-selector-parser "^2.2.2" + reduce-css-calc "^2.0.0" + +postcss-color-function@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-4.0.1.tgz#402b3f2cebc3f6947e618fb6be3654fbecef6444" + dependencies: + css-color-function "~1.3.3" + postcss "^6.0.1" + postcss-message-helpers "^2.0.0" + postcss-value-parser "^3.3.0" + +postcss-color-gray@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-4.1.0.tgz#e5581ed57eaa826fb652ca11b1e2b7b136a9f9df" + dependencies: + color "^2.0.1" + postcss "^6.0.14" + postcss-message-helpers "^2.0.0" + reduce-function-call "^1.0.2" + +postcss-color-hex-alpha@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz#1e53e6c8acb237955e8fd08b7ecdb1b8b8309f95" + dependencies: + color "^1.0.3" + postcss "^6.0.1" + postcss-message-helpers "^2.0.0" + +postcss-color-hsl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hsl/-/postcss-color-hsl-2.0.0.tgz#12703666fa310430e3f30a454dac1386317d5844" + dependencies: + postcss "^6.0.1" + postcss-value-parser "^3.3.0" + units-css "^0.4.0" + +postcss-color-hwb@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hwb/-/postcss-color-hwb-3.0.0.tgz#3402b19ef4d8497540c1fb5072be9863ca95571e" + dependencies: + color "^1.0.3" + postcss "^6.0.1" + postcss-message-helpers "^2.0.0" + reduce-function-call "^1.0.2" + +postcss-color-rebeccapurple@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-3.1.0.tgz#ce1269ecc2d0d8bf92aab44bd884e633124c33ec" + dependencies: + postcss "^6.0.22" + postcss-values-parser "^1.5.0" + +postcss-color-rgb@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rgb/-/postcss-color-rgb-2.0.0.tgz#14539c8a7131494b482e0dd1cc265ff6514b5263" + dependencies: + postcss "^6.0.1" + postcss-value-parser "^3.3.0" + +postcss-color-rgba-fallback@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-3.0.0.tgz#37d5c9353a07a09270912a82606bb42a0d702c04" + dependencies: + postcss "^6.0.6" + postcss-value-parser "^3.3.0" + rgb-hex "^2.1.0" + +postcss-cssnext@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-cssnext/-/postcss-cssnext-3.1.0.tgz#927dc29341a938254cde38ea60a923b9dfedead9" + dependencies: + autoprefixer "^7.1.1" + caniuse-api "^2.0.0" + chalk "^2.0.1" + pixrem "^4.0.0" + pleeease-filters "^4.0.0" + postcss "^6.0.5" + postcss-apply "^0.8.0" + postcss-attribute-case-insensitive "^2.0.0" + postcss-calc "^6.0.0" + postcss-color-function "^4.0.0" + postcss-color-gray "^4.0.0" + postcss-color-hex-alpha "^3.0.0" + postcss-color-hsl "^2.0.0" + postcss-color-hwb "^3.0.0" + postcss-color-rebeccapurple "^3.0.0" + postcss-color-rgb "^2.0.0" + postcss-color-rgba-fallback "^3.0.0" + postcss-custom-media "^6.0.0" + postcss-custom-properties "^6.1.0" + postcss-custom-selectors "^4.0.1" + postcss-font-family-system-ui "^3.0.0" + postcss-font-variant "^3.0.0" + postcss-image-set-polyfill "^0.3.5" + postcss-initial "^2.0.0" + postcss-media-minmax "^3.0.0" + postcss-nesting "^4.0.1" + postcss-pseudo-class-any-link "^4.0.0" + postcss-pseudoelements "^5.0.0" + postcss-replace-overflow-wrap "^2.0.0" + postcss-selector-matches "^3.0.1" + postcss-selector-not "^3.0.1" + +postcss-custom-media@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-6.0.0.tgz#be532784110ecb295044fb5395a18006eb21a737" + dependencies: + postcss "^6.0.1" + +postcss-custom-properties@^6.1.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-6.3.1.tgz#5c52abde313d7ec9368c4abf67d27a656cba8b39" + dependencies: + balanced-match "^1.0.0" + postcss "^6.0.18" + +postcss-custom-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-4.0.1.tgz#781382f94c52e727ef5ca4776ea2adf49a611382" + dependencies: + postcss "^6.0.1" + postcss-selector-matches "^3.0.0" + +postcss-flexbugs-fixes@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" + dependencies: + postcss "^7.0.0" + +postcss-font-family-system-ui@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-family-system-ui/-/postcss-font-family-system-ui-3.0.0.tgz#675fe7a9e029669f05f8dba2e44c2225ede80623" + dependencies: + postcss "^6.0" + +postcss-font-variant@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-3.0.0.tgz#08ccc88f6050ba82ed8ef2cc76c0c6a6b41f183e" + dependencies: + postcss "^6.0.1" + +postcss-image-set-polyfill@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/postcss-image-set-polyfill/-/postcss-image-set-polyfill-0.3.5.tgz#0f193413700cf1f82bd39066ef016d65a4a18181" + dependencies: + postcss "^6.0.1" + postcss-media-query-parser "^0.2.3" + +postcss-initial@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-2.0.0.tgz#72715f7336e0bb79351d99ee65c4a253a8441ba4" + dependencies: + lodash.template "^4.2.4" + postcss "^6.0.1" + +postcss-load-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" + dependencies: + cosmiconfig "^4.0.0" + import-cwd "^2.0.0" + +postcss-loader@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" + dependencies: + loader-utils "^1.1.0" + postcss "^6.0.0" + postcss-load-config "^2.0.0" + schema-utils "^0.4.0" + +postcss-media-minmax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-3.0.0.tgz#675256037a43ef40bc4f0760bfd06d4dc69d48d2" + dependencies: + postcss "^6.0.1" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-nesting@^4.0.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-4.2.1.tgz#0483bce338b3f0828ced90ff530b29b98b00300d" + dependencies: + postcss "^6.0.11" + +postcss-pseudo-class-any-link@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-4.0.0.tgz#9152a0613d3450720513e8892854bae42d0ee68e" + dependencies: + postcss "^6.0.1" + postcss-selector-parser "^2.2.3" + +postcss-pseudoelements@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudoelements/-/postcss-pseudoelements-5.0.0.tgz#eef194e8d524645ca520a949e95e518e812402cb" + dependencies: + postcss "^6.0.0" + +postcss-replace-overflow-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-2.0.0.tgz#794db6faa54f8db100854392a93af45768b4e25b" + dependencies: + postcss "^6.0.1" + +postcss-selector-matches@^3.0.0, postcss-selector-matches@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-3.0.1.tgz#e5634011e13950881861bbdd58c2d0111ffc96ab" + dependencies: + balanced-match "^0.4.2" + postcss "^6.0.1" + +postcss-selector-not@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-3.0.1.tgz#2e4db2f0965336c01e7cec7db6c60dff767335d9" + dependencies: + balanced-match "^0.4.2" + postcss "^6.0.1" + +postcss-selector-parser@^2.2.2, postcss-selector-parser@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-values-parser@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^6.0, postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.18, postcss@^6.0.22, postcss@^6.0.23, postcss@^6.0.5, postcss@^6.0.6: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.2.tgz#7b5a109de356804e27f95a960bef0e4d5bc9bb18" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +prettier-eslint@^8.8.2: + version "8.8.2" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.2.tgz#fcb29a48ab4524e234680797fe70e9d136ccaf0b" + dependencies: + babel-runtime "^6.26.0" + common-tags "^1.4.0" + dlv "^1.1.0" + eslint "^4.0.0" + indent-string "^3.2.0" + lodash.merge "^4.6.0" + loglevel-colored-level-prefix "^1.0.0" + prettier "^1.7.0" + pretty-format "^23.0.1" + require-relative "^0.8.7" + typescript "^2.5.1" + typescript-eslint-parser "^16.0.0" + vue-eslint-parser "^2.0.2" + +prettier@^1.13.7, prettier@^1.7.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372" + +pretty-error@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +pretty-format@^23.0.1: + version "23.2.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prompts@^0.1.9: + version "0.1.14" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" + dependencies: + kleur "^2.0.1" + sisteransi "^0.1.1" + +prop-types@15.x, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + +proxy-addr@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + +public-encrypt@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + 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" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.5.1, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" + +raf@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + dependencies: + performance-now "^2.1.0" + +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +rc-align@^2.4.0, rc-align@^2.4.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-2.4.3.tgz#b9b3c2a6d68adae71a8e1d041cd5e3b2a655f99a" + dependencies: + babel-runtime "^6.26.0" + dom-align "^1.7.0" + prop-types "^15.5.8" + rc-util "^4.0.4" + +rc-animate@2.x, rc-animate@^2.3.0, rc-animate@^2.4.1: + version "2.4.4" + resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-2.4.4.tgz#a05a784c747beef140d99ff52b6117711bef4b1e" + dependencies: + babel-runtime "6.x" + css-animation "^1.3.2" + prop-types "15.x" + +rc-animate@^3.0.0-rc.1, rc-animate@^3.0.0-rc.4, rc-animate@^3.0.0-rc.5: + version "3.0.0-rc.6" + resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-3.0.0-rc.6.tgz#04288eefa118e0cae214536c8a903ffaac1bc3fb" + dependencies: + babel-runtime "6.x" + classnames "^2.2.5" + component-classes "^1.2.6" + fbjs "^0.8.16" + prop-types "15.x" + raf "^3.4.0" + rc-util "^4.5.0" + react-lifecycles-compat "^3.0.4" + +rc-calendar@~9.7.3: + version "9.7.7" + resolved "https://registry.yarnpkg.com/rc-calendar/-/rc-calendar-9.7.7.tgz#d8c979e13e290e3017967423c335a7a3dda70cfb" + dependencies: + babel-runtime "6.x" + classnames "2.x" + create-react-class "^15.5.2" + moment "2.x" + prop-types "^15.5.8" + rc-trigger "^2.2.0" + rc-util "^4.1.1" + +rc-cascader@~0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-0.16.0.tgz#11baa854c2aaa2d6a8f601dec75dd136d59c5156" + dependencies: + array-tree-filter "^1.0.0" + prop-types "^15.5.8" + rc-trigger "^2.2.0" + rc-util "^4.0.4" + shallow-equal "^1.0.0" + warning "^4.0.1" + +rc-checkbox@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.1.5.tgz#411858448c0ee2a797ef8544dac63bcaeef722ef" + dependencies: + babel-runtime "^6.23.0" + classnames "2.x" + prop-types "15.x" + rc-util "^4.0.4" + +rc-collapse@~1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-1.10.0.tgz#b39578633a1e033391597776758763a10d3bc261" + dependencies: + classnames "2.x" + css-animation "1.x" + prop-types "^15.5.6" + rc-animate "2.x" + +rc-dialog@~7.2.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-7.2.1.tgz#ac92fcffdf2a0eaa64b77f829336653d911a57be" + dependencies: + babel-runtime "6.x" + rc-animate "2.x" + rc-util "^4.4.0" + +rc-drawer@~1.7.3: + version "1.7.4" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-1.7.4.tgz#008e73ab34aac5fcea5f0ec9a2b200d9f7731655" + dependencies: + babel-runtime "6.x" + classnames "^2.2.5" + prop-types "^15.5.0" + rc-util "^4.5.1" + +rc-dropdown@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-2.2.0.tgz#a905067666ce73c0ce26cf0980e7b75b46126825" + dependencies: + babel-runtime "^6.26.0" + prop-types "^15.5.8" + rc-trigger "^2.5.1" + react-lifecycles-compat "^3.0.2" + +rc-editor-core@~0.8.3: + version "0.8.7" + resolved "https://registry.yarnpkg.com/rc-editor-core/-/rc-editor-core-0.8.7.tgz#0d0a46de772e48a1325c7c49d5ea6597b056b69e" + dependencies: + babel-runtime "^6.26.0" + classnames "^2.2.5" + draft-js "^0.10.0" + immutable "^3.7.4" + lodash "^4.16.5" + prop-types "^15.5.8" + setimmediate "^1.0.5" + +rc-editor-mention@^1.0.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/rc-editor-mention/-/rc-editor-mention-1.1.7.tgz#c72d181859beda96669f4b43e19a941e68fa985b" + dependencies: + babel-runtime "^6.23.0" + classnames "^2.2.5" + dom-scroll-into-view "^1.2.0" + draft-js "~0.10.0" + prop-types "^15.5.8" + rc-animate "^2.3.0" + rc-editor-core "~0.8.3" + +rc-form@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/rc-form/-/rc-form-2.2.2.tgz#51fe9d1ef16880ddcaaa67ea90ad67944882fa8a" + dependencies: + async-validator "1.x" + babel-runtime "6.x" + create-react-class "^15.5.3" + dom-scroll-into-view "1.x" + hoist-non-react-statics "^2.3.1" + lodash "^4.17.4" + warning "^3.0.0" + +rc-hammerjs@~0.6.0: + version "0.6.9" + resolved "https://registry.yarnpkg.com/rc-hammerjs/-/rc-hammerjs-0.6.9.tgz#9a4ddbda1b2ec8f9b9596091a6a989842a243907" + dependencies: + babel-runtime "6.x" + hammerjs "^2.0.8" + prop-types "^15.5.9" + +rc-input-number@~4.0.0: + version "4.0.13" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-4.0.13.tgz#18ac305bf07b6771ad0e4edc97b1e1bbb9b71918" + dependencies: + babel-runtime "6.x" + classnames "^2.2.0" + is-negative-zero "^2.0.0" + prop-types "^15.5.7" + rc-util "^4.5.1" + rmc-feedback "^2.0.0" + +rc-menu@^7.3.0, rc-menu@~7.4.1: + version "7.4.5" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-7.4.5.tgz#bae74efacc2c3b9f9948edec958ba55994d01fa3" + dependencies: + babel-runtime "6.x" + classnames "2.x" + dom-scroll-into-view "1.x" + mini-store "^1.1.0" + mutationobserver-shim "^0.3.2" + prop-types "^15.5.6" + rc-animate "2.x" + rc-trigger "^2.3.0" + rc-util "^4.1.0" + resize-observer-polyfill "^1.5.0" + +rc-notification@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-3.2.0.tgz#bbfb6a92c4e54c9eeb7ac51a7e8c64011ea12ab1" + dependencies: + babel-runtime "6.x" + classnames "2.x" + prop-types "^15.5.8" + rc-animate "2.x" + rc-util "^4.0.4" + +rc-pagination@~1.17.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-1.17.1.tgz#76cfaa64dc8b301816a118a0aca8cde46bbbb32b" + dependencies: + babel-runtime "6.x" + prop-types "^15.5.7" + +rc-progress@~2.2.2: + version "2.2.5" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-2.2.5.tgz#e61d0544bf9d4208e5ba32fc50962159e7f952a3" + dependencies: + babel-runtime "6.x" + prop-types "^15.5.8" + +rc-rate@~2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.4.2.tgz#c097bfdba7a5783cec287c928b1461cc1621f836" + dependencies: + babel-runtime "^6.26.0" + classnames "^2.2.5" + prop-types "^15.5.8" + rc-util "^4.3.0" + +rc-select@~8.2.6: + version "8.2.7" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-8.2.7.tgz#c873e3043aff8b0ab90ec2d210ffc446a2f8fe4f" + dependencies: + babel-runtime "^6.23.0" + classnames "2.x" + component-classes "1.x" + dom-scroll-into-view "1.x" + prop-types "^15.5.8" + raf "^3.4.0" + rc-animate "2.x" + rc-menu "^7.3.0" + rc-trigger "^2.5.4" + rc-util "^4.0.4" + react-lifecycles-compat "^3.0.2" + warning "^4.0.2" + +rc-slider@~8.6.0: + version "8.6.2" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-8.6.2.tgz#ee0996b6c6b3f1f6fe8f2b7b2c714ba256ad2909" + dependencies: + babel-runtime "6.x" + classnames "^2.2.5" + prop-types "^15.5.4" + rc-tooltip "^3.7.0" + rc-util "^4.0.4" + shallowequal "^1.0.1" + warning "^3.0.0" + +rc-steps@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-3.3.0.tgz#8817c438a6a5648997c7edb51bde727e6f32e132" + dependencies: + babel-runtime "^6.23.0" + classnames "^2.2.3" + lodash "^4.17.5" + prop-types "^15.5.7" + +rc-switch@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-1.7.0.tgz#a655f08951d6db94d83f162da5b69506cb703b6f" + dependencies: + babel-runtime "^6.23.0" + classnames "^2.2.1" + prop-types "^15.5.6" + +rc-table@~6.3.2: + version "6.3.4" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-6.3.4.tgz#5ec6e37f18661228161bcaa7bbf8cbaf132405ec" + dependencies: + babel-runtime "6.x" + classnames "^2.2.5" + component-classes "^1.2.6" + lodash "^4.17.5" + mini-store "^1.0.2" + prop-types "^15.5.8" + rc-util "^4.0.4" + react-lifecycles-compat "^3.0.2" + shallowequal "^1.0.2" + warning "^3.0.0" + +rc-tabs@~9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-9.4.1.tgz#874d410e8e02dc460cabfc695f713f008f74815d" + dependencies: + babel-runtime "6.x" + classnames "2.x" + lodash "^4.17.5" + prop-types "15.x" + rc-hammerjs "~0.6.0" + rc-util "^4.0.4" + warning "^3.0.0" + +rc-time-picker@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/rc-time-picker/-/rc-time-picker-3.4.0.tgz#274e80122f885b37a4eace7393f3a25334fa141f" + dependencies: + babel-runtime "6.x" + classnames "2.x" + moment "2.x" + prop-types "^15.5.8" + rc-trigger "^2.2.0" + +rc-tooltip@^3.7.0, rc-tooltip@~3.7.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-3.7.2.tgz#3698656d4bacd51b72d9e327bed15d1d5a9f1b27" + dependencies: + babel-runtime "6.x" + prop-types "^15.5.8" + rc-trigger "^2.2.2" + +rc-tree-select@~2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-2.2.3.tgz#6db2f23119136c553f42bec73422ccbde91a58ef" + dependencies: + babel-runtime "^6.23.0" + classnames "^2.2.1" + prop-types "^15.5.8" + raf "^3.4.0" + rc-animate "^3.0.0-rc.4" + rc-tree "~1.14.3" + rc-trigger "^3.0.0-rc.2" + rc-util "^4.5.0" + react-lifecycles-compat "^3.0.4" + shallowequal "^1.0.2" + warning "^4.0.1" + +rc-tree@~1.14.3, rc-tree@~1.14.5: + version "1.14.5" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-1.14.5.tgz#7216517111997faafbe5fd97c3a1b7f482b38050" + dependencies: + babel-runtime "^6.23.0" + classnames "2.x" + prop-types "^15.5.8" + rc-animate "^3.0.0-rc.5" + rc-util "^4.5.1" + react-lifecycles-compat "^3.0.4" + warning "^3.0.0" + +rc-trigger@^2.2.0, rc-trigger@^2.2.2, rc-trigger@^2.3.0, rc-trigger@^2.5.1, rc-trigger@^2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-2.5.4.tgz#9088a24ba5a811b254f742f004e38a9e2f8843fb" + dependencies: + babel-runtime "6.x" + classnames "^2.2.6" + prop-types "15.x" + rc-align "^2.4.0" + rc-animate "2.x" + rc-util "^4.4.0" + +rc-trigger@^3.0.0-rc.2: + version "3.0.0-rc.3" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-3.0.0-rc.3.tgz#35842df1674d25315e1426a44882a4c97652258b" + dependencies: + babel-runtime "6.x" + classnames "^2.2.6" + prop-types "15.x" + raf "^3.4.0" + rc-align "^2.4.1" + rc-animate "^3.0.0-rc.1" + rc-util "^4.4.0" + +rc-upload@~2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-2.5.1.tgz#7ae0c9038d98ba8750e9466d8f969e1b4bc9f0e0" + dependencies: + babel-runtime "6.x" + classnames "^2.2.5" + prop-types "^15.5.7" + warning "2.x" + +rc-util@^4.0.4, rc-util@^4.1.0, rc-util@^4.1.1, rc-util@^4.3.0, rc-util@^4.4.0, rc-util@^4.5.0, rc-util@^4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.5.1.tgz#0e435057174c024901c7600ba8903dd03da3ab39" + dependencies: + add-dom-event-listener "1.x" + babel-runtime "6.x" + prop-types "^15.5.10" + shallowequal "^0.2.2" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^16.4.1: + version "16.4.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +react-lazy-load@^3.0.12: + version "3.0.13" + resolved "https://registry.yarnpkg.com/react-lazy-load/-/react-lazy-load-3.0.13.tgz#3b0a92d336d43d3f0d73cbe6f35b17050b08b824" + dependencies: + eventlistener "0.0.1" + lodash.debounce "^4.0.0" + lodash.throttle "^4.0.0" + prop-types "^15.5.8" + +react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + +react-places-autocomplete@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/react-places-autocomplete/-/react-places-autocomplete-7.2.0.tgz#85319ff42a1e3e0d2b02cc40471c1e2911e6dfbe" + dependencies: + lodash.debounce "^4.0.8" + prop-types "^15.5.8" + +react-redux@^5.0.7: + version "5.0.7" + resolved "http://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" + dependencies: + hoist-non-react-statics "^2.5.0" + invariant "^2.0.0" + lodash "^4.17.5" + lodash-es "^4.17.5" + loose-envify "^1.1.0" + prop-types "^15.6.0" + +react-router-dom@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" + dependencies: + history "^4.7.2" + invariant "^2.2.4" + loose-envify "^1.3.1" + prop-types "^15.6.1" + react-router "^4.3.1" + warning "^4.0.1" + +react-router@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" + dependencies: + history "^4.7.2" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.4" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.1" + warning "^4.0.1" + +react-slick@~0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/react-slick/-/react-slick-0.23.1.tgz#15791c4107f0ba3a5688d5bd97b7b7ceaa0dd181" + dependencies: + classnames "^2.2.5" + enquire.js "^2.1.6" + json2mq "^0.2.0" + lodash.debounce "^4.0.8" + resize-observer-polyfill "^1.5.0" + +react-social-icons@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-social-icons/-/react-social-icons-3.0.0.tgz#667de84c08fb2247eaa79f676e3aa1d6edc59f59" + dependencies: + babel-runtime "^6.11.6" + classnames "^2.2.5" + +react@^16.4.1: + version "16.4.2" + resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + 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" + +readable-stream@1.0: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +realpath-native@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" + dependencies: + util.promisify "^1.0.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reduce-css-calc@^1.2.7: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-css-calc@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.4.tgz#c20e9cda8445ad73d4ff4bea960c6f8353791708" + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +reduce-function-call@^1.0.1, reduce-function-call@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +redux-thunk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" + +redux@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.9: + version "2.2.9" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz#a372f45a248b62976a568037c1b6e60a60599192" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +regexpp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +renderkid@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" + dependencies: + css-select "^1.1.0" + dom-converter "~0.1" + htmlparser2 "~3.3.0" + strip-ansi "^3.0.0" + utila "~0.3" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request-progress@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@2.87.0, request@^2.81.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +"request@>=2.9.0 <2.82.0": + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@^2.83.0, request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resize-observer-polyfill@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-pathname@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" + +resolve-url-loader@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.0.tgz#e1b37034d48f22f8cfb9f04c026faaa070fdaf26" + dependencies: + adjust-sourcemap-loader "^1.1.0" + camelcase "^4.1.0" + convert-source-map "^1.5.1" + loader-utils "^1.1.0" + lodash.defaults "^4.0.0" + rework "^1.0.1" + rework-visit "^1.0.0" + source-map "^0.5.7" + urix "^0.1.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.5.0, resolve@^1.6.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +rework-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + +rework@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-hex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/rgb-hex/-/rgb-hex-2.1.0.tgz#c773c5fe2268a25578d92539a82a7a5ce53beda6" + +rgb@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rmc-feedback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rmc-feedback/-/rmc-feedback-2.0.0.tgz#cbc6cb3ae63c7a635eef0e25e4fbaf5ac366eeaa" + dependencies: + babel-runtime "6.x" + classnames "^2.2.5" + +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rxjs@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sane@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^7.0.3: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + semver "^5.5.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.4.0, schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +scriptjs@^2.5.7: + version "2.5.9" + resolved "https://registry.yarnpkg.com/scriptjs/-/scriptjs-2.5.9.tgz#343915cd2ec2ed9bfdde2b9875cd28f59394b35f" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +selfsigned@^1.9.1: + version "1.10.3" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" + dependencies: + node-forge "0.7.5" + +"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.3.0, semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +semver@^5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + 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.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + 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" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + +shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.0.0.tgz#508d1838b3de590ab8757b011b25e430900945f7" + +shallowequal@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e" + dependencies: + lodash.keys "^3.1.2" + +shallowequal@^1.0.1, shallowequal@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + 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" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sockjs-client@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.6: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +split@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + 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" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" + dependencies: + loader-utils "^1.1.0" + schema-utils "^0.4.5" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +table@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + dependencies: + ajv "^6.0.1" + ajv-keywords "^3.0.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tapable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + +tar@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +test-exclude@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +thunky@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + +tinycolor2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +"true-case-path@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + dependencies: + glob "^6.0.4" + +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typescript-eslint-parser@^16.0.0: + version "16.0.1" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz#b40681c7043b222b9772748b700a000b241c031b" + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + +typescript@^2.5.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + +ua-parser-js@^0.7.18: + version "0.7.18" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" + +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@3.4.x: + version "3.4.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.6.tgz#bc546d53f3e02b05d97d0ca5a7abfe0fb0384ddb" + dependencies: + commander "~2.16.0" + source-map "~0.6.1" + +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + +uglifyjs-webpack-plugin@^1.2.4, uglifyjs-webpack-plugin@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +unicode-5.2.0@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz#e0df129431a28a95263d8c480fb5e9ab2b0973f0" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +units-css@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/units-css/-/units-css-0.4.0.tgz#d6228653a51983d7c16ff28f8b9dc3b1ffed3a07" + dependencies: + isnumeric "^0.2.0" + viewport-dimensions "^0.2.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +uri-js@^4.2.1, uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-join@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" + +url-parse@^1.1.8, url-parse@~1.4.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util.promisify@1.0.0, util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + +utila@~0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + +v8-compile-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" + +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +viewport-dimensions@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz#de740747db5387fd1725f5175e91bac76afdf36c" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +vue-eslint-parser@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" + dependencies: + debug "^3.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + lodash "^4.17.4" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +warning@2.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-2.1.0.tgz#21220d9c63afc77a8c92111e011af705ce0c6901" + dependencies: + loose-envify "^1.0.0" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.1, warning@^4.0.2, warning@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" + dependencies: + loose-envify "^1.0.0" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +webpack-cli@^3.0.8: + version "3.1.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.0.tgz#d71a83687dcfeb758fdceeb0fe042f96bcf62994" + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.0.0" + global-modules-path "^2.1.0" + import-local "^1.0.0" + inquirer "^6.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.4.0" + v8-compile-cache "^2.0.0" + yargs "^12.0.1" + +webpack-dev-middleware@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz#8b32aa43da9ae79368c1bf1183f2b6cf5e1f39ed" + dependencies: + loud-rejection "^1.6.0" + memory-fs "~0.4.1" + mime "^2.1.0" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + url-join "^4.0.0" + webpack-log "^1.0.1" + +webpack-dev-server@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.5.tgz#87477252e1ac6789303fb8cd3e585fa5d508a401" + dependencies: + ansi-html "0.0.7" + array-includes "^3.0.3" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.18.0" + import-local "^1.0.0" + internal-ip "1.2.0" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.1.5" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "3.1.3" + webpack-log "^1.1.2" + yargs "11.0.0" + +webpack-log@^1.0.1, webpack-log@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" + dependencies: + chalk "^2.1.0" + log-symbols "^2.1.0" + loglevelnext "^1.0.1" + uuid "^3.1.0" + +webpack-merge@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" + dependencies: + lodash "^4.17.5" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.16.0: + version "4.16.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-module-context" "1.5.13" + "@webassemblyjs/wasm-edit" "1.5.13" + "@webassemblyjs/wasm-opt" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.0.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.0.1" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@>=0.10.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171" + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.10, which@^1.2.12, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +winston@^2.4.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.3.tgz#7a9fdab371b6d3d9b63a592947846d856948c517" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + dependencies: + camelcase "^4.1.0" + +yargs@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^11.0.0: + version "11.1.0" + resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + 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" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" diff --git a/deans-notification b/deans-notification deleted file mode 160000 index 5df90db..0000000 --- a/deans-notification +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5df90db4b2c5500b6aaae1682e684c8e18a773e7 diff --git a/deans-notification/.gitignore b/deans-notification/.gitignore new file mode 100644 index 0000000..82145b4 --- /dev/null +++ b/deans-notification/.gitignore @@ -0,0 +1,174 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser +reports/ + +json_summary/* diff --git a/deans-notification/.idea/deans-notification.iml b/deans-notification/.idea/deans-notification.iml new file mode 100644 index 0000000..1de84ce --- /dev/null +++ b/deans-notification/.idea/deans-notification.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/deans-notification/.idea/misc.xml b/deans-notification/.idea/misc.xml new file mode 100644 index 0000000..2012045 --- /dev/null +++ b/deans-notification/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/deans-notification/.idea/modules.xml b/deans-notification/.idea/modules.xml new file mode 100644 index 0000000..c64041e --- /dev/null +++ b/deans-notification/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/deans-notification/.idea/vcs.xml b/deans-notification/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/deans-notification/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/deans-notification/Dockerfile b/deans-notification/Dockerfile new file mode 100644 index 0000000..a8656c4 --- /dev/null +++ b/deans-notification/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.6 + +ENV IN_DOCKER "1" +ENV BASEDIR /work +ENV FLASK_ROOT $BASEDIR/deans-notification +ENV DATA_ROOT /data +ENV ENTRY_DIR $FLASK_ROOT +ENV PATH "$FLASK_ROOT:$BASEDIR:$PATH" + +WORKDIR $BASEDIR +ADD requirements.txt $BASEDIR/ +RUN pip install -r requirements.txt + +ADD * $BASEDIR/ +RUN chmod +x start_server.sh \ No newline at end of file diff --git a/deans-notification/README.md b/deans-notification/README.md new file mode 100644 index 0000000..8ba6682 --- /dev/null +++ b/deans-notification/README.md @@ -0,0 +1,106 @@ +# Dean's Crisis Management System - Notification Subsystem +> This subsystem takes a message from the API subsystem, parses it, and redirects it to the relevant destination: Email, WhatsApp, or Facebook & Twitter. + + +## How to Start + +Windows: + +1. Clone the repository +```sh +git clone git://github.com/Deans-CMS/deans-notification.git +``` + +2. Install dependencies +```sh +pip install-r requirements.txt +``` + +3. Start server (the API server will start on **localhost:8000**) +```sh +python message_manager.py +``` + +4. Set up Twilio + +As WhatsApp for Twilio is still in Sandbox mode, please connect your WhatsApp number to Sandbox to receive messages through Twilio. +> Send a WhatsApp message to **+1 415 523 8886** with the code ```join coquelicot-labradoodle```. + +## API Endpoints + +1. Facebook & Twitter ```/socialmessages/``` + +Takes a JSON file of format ```{"message" : string}``` and posts the message to Dean CMS' Facebook & Twitter pages, returning a HTTP Response of status code ```201``` if successfully posted. + +**NOTE: Facebook App is still in development mode, only developers can see the posts posted. Still in process of App Review.** + +>Example: +```sh +POST /socialmessages/ HTTP/1.1 +Host: localhost +Content-Type: application/json +cache-control: no-cache +Postman-Token: 2f604143-450a-45e9-bf85-a5442d3173b0 +{"message" : "hello world!"} +``` + +2. WhatsApp ```/dispatchnotices/``` + +Takes a JSON file of format ```{"number" : phone number (with country code), "message" : string}``` and sends a WhatsApp message to the specified number pages, returning a HTTP Response of status code ```201``` if successfully sent. + +**NOTE: The number MUST be connected to Twilio's Sandbox in order to successfully receive messages, otherwise it will fail.** + +>Example: +```sh +POST /dispatchnotices/ HTTP/1.1 +Host: localhost +Content-Type: application/json +cache-control: no-cache +Postman-Token: fde35f4e-0cd6-4178-8b13-65c274d0bb9b +{"number":"+6586830963","message":"URGENT: Fire @ 38 Nanyang Cres, Singapore 636866. Block 24 #06-120."} +``` + +3. Email Reports ```/reports/``` + +Accepts a JSON file of ```{"email" : email address, "cases" : list of json records}```, uses Jasper Reports to generate a pdf version of the JSON data received, and emails it as an attachment to the specified email address. + +HTTP Response of status code ```201``` returned if successfully sent. + +>Example: +```sh +POST /reports/ HTTP/1.1 +Host: localhost +Content-Type: application/json +cache-control: no-cache +Postman-Token: eb29d4bb-3500-4155-b17b-e478f203dab4 +{ + "email":"michellelimsh@gmail.com", + "cases":[ + {"crisis_time" : "16:15:30", + "resolved_by" : "18:32:15", + "crisis_type": "Fire Breakout", + "crisis_description": "Fire!!!", + "crisis_assistance": "Fire Fighting", + "crisis_location": "24 Nanyang Crescent Block 24 #06-23" +}, + {"crisis_time" : "17:53:25", + "resolved_by" : "18:37:23", + "crisis_type": "Casualty", + "crisis_description": "Heart Attack", + "crisis_assistance": "Emergency Ambulance", + "crisis_location": "112 Boon Lay Avenue 6 Block 112 #06-23" +}, +{ + ... +}, ... +] +} +``` + +## Accounts: + +Email account: deanscms@gmail.com + +Facebook Page: https://www.facebook.com/deans.cms/ + +Twitter Account: https://twitter.com/dean_cms diff --git a/deans-notification/email_client.py b/deans-notification/email_client.py new file mode 100644 index 0000000..b2ecc75 --- /dev/null +++ b/deans-notification/email_client.py @@ -0,0 +1,110 @@ +''' +Written by Michelle Lim Shi Hui & Nicholas Phang +Dean's Crisis Management System - Notification Subsystem +For CZ3003 Software System Analysis & Design + +Email Manager - +Takes in email address list & message, formats it, and sends out the email +Leverages on smtplib +''' + +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.mime.base import MIMEBase +from email import encoders +from datetime import datetime + +import pprint + +#Get API keys +from configparser import ConfigParser +config = ConfigParser() +config.read('config.ini') +user = config.get('gmail', 'user') +password = config.get('gmail', 'password') + +def prettyPrintReport(data): + message = "" + message += "-------------------------------------------------------------------------------------------\n" + message += " New Crises Reported in Past 30 Minutes \n" + message += "-------------------------------------------------------------------------------------------\n\n" + + for crisis in data['new_crisis']: + message += "Report Time: " + crisis['crisis_time'] + "\n" + message += "Location: " + crisis['location'] + "\n" + message += "Location2: " + crisis['location2'] + "\n" + message += "Crisis Type: " + crisis['type'] + "\n" + message += "Assistance Requested: " + crisis['crisis_assistance'] + "\n" + message += "Description: " + crisis['crisis_description'] + "\n" + message += "\n" + message += "-------------------------------------------------------------------------------------------\n" + message += " Crises Resolved in Past 30 Minutes \n" + message += "-------------------------------------------------------------------------------------------\n\n" + for crisis in data['recent_resolved_crisis']: + message += "Report Time: " + crisis['crisis_time'] + "\n" + message += "Location: " + crisis['location'] + "\n" + message += "Location2: " + crisis['location2'] + "\n" + message += "Crisis Type: " + crisis['type'] + "\n" + message += "Assistance Requested: " + crisis['crisis_assistance'] + "\n" + message += "Description: " + crisis['crisis_description'] + "\n" + message += "\n" + + message += "-------------------------------------------------------------------------------------------\n" + message += " Current Unresolved Crisis \n" + message += "-------------------------------------------------------------------------------------------\n\n" + for crisis in data['active_crisis']: + message += "Report Time: " + crisis['crisis_time'] + "\n" + message += "Location: " + crisis['location'] + "\n" + message += "Location2: " + crisis['location2'] + "\n" + message += "Crisis Type: " + crisis['type'] + "\n" + message += "Assistance Requested: " + crisis['crisis_assistance'] + "\n" + message += "Description: " + crisis['crisis_description'] + "\n" + message += "\n" + + return message + + +def main(emailadd, subject, data): + msg = MIMEMultipart() + msg['From'] = user + msg['To'] = emailadd + msg['Subject'] = subject + body = """ +Dear Prime Minister, + +Here is the report as of %s. + +%s + +Best regards, +Dean's Crisis Management System + +This is an auto-generated message. Please do not reply. + """ % (datetime.now().strftime("%I:%M %p on %B %d, %Y"), prettyPrintReport(data)) + msg.attach(MIMEText(body, 'plain')) + + # filename = report + # attachment = open(filename, 'rb') + + # part = MIMEBase('application', 'octet-stream') + # part.set_payload(attachment.read()) + # encoders.encode_base64(part) + # part.add_header('Content-Disposition', "attachment; filename= "+filename[filename.index("/")+1:]) + + # msg.attach(part) + + text = msg.as_string() + + try: + server = smtplib.SMTP('smtp.gmail.com', 587) + server.starttls() + server.login(user, password) + print('Connection to Gmail Success!') + server.sendmail(user, emailadd, text) + server.quit() + print('Email sent!') + except: + #TODO: Exception Handling + print('Something went wrong...') + diff --git a/deans-notification/facebook_client.py b/deans-notification/facebook_client.py new file mode 100644 index 0000000..301bf6f --- /dev/null +++ b/deans-notification/facebook_client.py @@ -0,0 +1,35 @@ +''' +Written by Michelle Lim Shi Hui & Nicholas Phang +Dean's Crisis Management System - Notification Subsystem +For CZ3003 Software System Analysis & Design + +Facebook API - +Takes in Facebook credentials & message, formats the message & posts it +Leverages on Facebook's Graph API +''' + +import facebook + +#Get API keys +from configparser import ConfigParser +config = ConfigParser() +config.read('config.ini') +page_id = config.get('facebook', 'page_id') + +token = config.get('facebook', 'user_token') + +def main(data): + + graph = facebook.GraphAPI(access_token = token) + print("Connection to Facebook success") + formatted_text = format(data) + print("Facebook Received: " + formatted_text) + graph.put_object(parent_object='me', + connection_name='feed', + message=formatted_text, + link=data['deansURL']) + print("Post to Facebook success") + +def format(data): + formatted_text = data['text'] + return formatted_text \ No newline at end of file diff --git a/deans-notification/jasper/crisis_report_template.jasper b/deans-notification/jasper/crisis_report_template.jasper new file mode 100644 index 0000000..5897556 Binary files /dev/null and b/deans-notification/jasper/crisis_report_template.jasper differ diff --git a/deans-notification/jasper/crisis_report_template.jrxml b/deans-notification/jasper/crisis_report_template.jrxml new file mode 100644 index 0000000..7a8e9c6 --- /dev/null +++ b/deans-notification/jasper/crisis_report_template.jrxml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band height="99" splitType="Stretch"> + <staticText> + <reportElement x="111" y="13" width="333" height="40" uuid="ab708e8f-da48-4e7c-a46e-db29e87f3c9f"/> + <textElement textAlignment="Center"> + <font fontName="SansSerif" size="30"/> + </textElement> + <text><![CDATA[Crisis Summary Report]]></text> + </staticText> + <textField pattern="MMMMM dd, yyyy"> + <reportElement x="176" y="58" width="110" height="25" uuid="f3e39662-aba1-47a1-b2ea-f96ccd7d5aec"/> + <textElement textAlignment="Center"> + <font fontName="SansSerif" size="15"/> + </textElement> + <textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression> + </textField> + <textField pattern="HH:mm"> + <reportElement positionType="Float" x="280" y="58" width="110" height="26" uuid="929c8235-d1d2-499a-8e9c-dec31d32fbae"/> + <textElement textAlignment="Center"> + <font fontName="SansSerif" size="15"/> + </textElement> + <textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression> + </textField> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deans-notification/jasper/crisis_report_template_descriptor.properties b/deans-notification/jasper/crisis_report_template_descriptor.properties new file mode 100644 index 0000000..3c68408 --- /dev/null +++ b/deans-notification/jasper/crisis_report_template_descriptor.properties @@ -0,0 +1,5 @@ +# +#Tue Oct 30 17:57:43 SGT 2018 +template.name=crisis_report_template +template.category=normal\ntabular\nformat_a4\nformat_landscape\nbook +template.engine=default diff --git a/deans-notification/message_manager.py b/deans-notification/message_manager.py new file mode 100644 index 0000000..a584f8e --- /dev/null +++ b/deans-notification/message_manager.py @@ -0,0 +1,114 @@ +''' +Written by Michelle Lim Shi Hui & Nicholas Phang +Dean's Crisis Management System - Notification Subsystem +For CZ3003 Software System Analysis & Design + +Message Manager - +API Server that receives JSON requests through API endpoints & processes them +''' +from flask import Flask, request, Response +from datetime import datetime +import report_generation +import facebook_client +import sms_client +import twitter_client +import json +import traceback +import email_client + +app = Flask(__name__) +report_count = 1 + +@app.route('/') +def hello_world(): + return "hello world!" + +''' +JSON format: +{"message":{ + "twitterShare": String, + "facebookShare":{ + "shelterURL" : String, + "deansURL": String, + "text": String, + "recent_resolved_crisis":[], + "new_crisis":[], + "active_crisis":[] + } +} +} +''' + +# JSON format: {"message" : string} +@app.route('/socialmessages/', methods=['POST']) +def post_social_message(): + try : + data = request.get_json() + print(data) + message = data['message'] + print('Connecting to Twitter...') + twitter_client.main(message['twitterShare']) + print('Connecting to Facebook...') + facebook_client.main(message['facebookShare']) + json_response = {"result" : "Success!", "posted" : message} + + return Response(json.dumps(json_response), status=201, mimetype='application/json') + + except Exception as e: + traceback.print_tb(e.__traceback__) + +# JSON format: {"number" : string, "message" : string} +@app.route('/dispatchnotices/', methods=['POST']) +def post_dispatch_notice(): + data = request.get_json() + number = data['number'] + message = data['message'] + print('Connecting to Twilio...') + sms_client.main(number, message) + json_response = {"result": "Success!", "sent_to": number, "posted": message} + return Response(json.dumps(json_response), status=201, mimetype='application/json') + +''' +JSON format: +{"email" : email address, +"cases" : +[{ + "crisis_time" : datetime, + "resolved_by" : datetime, + "location" : location, + "crisis_type" : string, + "crisis_description" : string, + "crisis_assistance": string +}, +]} +''' +@app.route('/reports/', methods=['POST']) +def generate_report(): + print("Called") + # global report_count + data = request.get_json() + time_stamp = datetime.now().strftime("%Y%m%d-%H%M%S") + # json_file = "json_summary/report_" + time_stamp + ".json" + # with open(json_file, 'w+') as f: + # json.dump(data, f) + print("received data", data) + # report_generation.json_to_pdf(report_count) + print('Generating Report...') + # report = "reports/report"+str(report_count)+'.pdf' + # report_count += 1 + + print('Connecting to Gmail...') + emailadd = data['email'] + subject = "Crisis Summary Report for " + datetime.now().strftime("%I:%M%p on %B %d, %Y") + # email_client.main(emailadd, subject, report) + email_client.main(emailadd, subject, data) + json_response = {"result": "Success!", "sent_to": emailadd} + return Response(json.dumps(json_response), status=201, mimetype='application/json') + +if __name__ == '__main__': + import os + if('IN_DOCKER' in os.environ and os.environ['IN_DOCKER']=='1'): + DEBUG = not ('PRODUCTION' in os.environ and os.environ['PRODUCTION']=='1') + app.run(host='0.0.0.0', port=8000, debug=DEBUG) + else: + app.run(host='127.0.0.1', port=8000, debug=True) \ No newline at end of file diff --git a/deans-notification/report_generation.py b/deans-notification/report_generation.py new file mode 100644 index 0000000..74bdca0 --- /dev/null +++ b/deans-notification/report_generation.py @@ -0,0 +1,40 @@ +import os +from pyreportjasper import JasperPy + +def compiling(): + template = os.path.dirname(os.path.abspath(__file__)) + \ + '/jasper/crisis_report_template.jrxml' + jasper = JasperPy() + jasper.compile(template) + +def json_to_pdf(report_count): + template = os.path.dirname(os.path.abspath(__file__)) + \ + '/jasper/crisis_report_template.jrxml' + + output = os.path.dirname(os.path.abspath(__file__)) + '/reports/report'+str(report_count) + json_query = 'cases' + + data_file = os.path.dirname(os.path.abspath(__file__)) + \ + '/json_summary/json'+str(report_count)+'.json' + + jasper = JasperPy() + jasper.process( + template, + output_file=output, + format_list=["pdf"], + parameters={}, + db_connection={ + 'data_file': data_file, + 'driver': 'json', + 'json_query': json_query, + }, + locale='en_US' + ) + + print('Result is the file below.') + print(output + '.pdf') + +if __name__ == '__main__': + compiling() + print('compiling complete') + json_to_pdf() \ No newline at end of file diff --git a/deans-notification/requirements.txt b/deans-notification/requirements.txt new file mode 100644 index 0000000..bee894b --- /dev/null +++ b/deans-notification/requirements.txt @@ -0,0 +1,6 @@ +Flask==1.0.2 +facebook-sdk==3.0.0 +tweepy==3.6.0 +twilio==6.19.2 +configparser==3.5.0 +pyreportjasper==1.0.1 \ No newline at end of file diff --git a/deans-notification/sms_client.py b/deans-notification/sms_client.py new file mode 100644 index 0000000..66bad91 --- /dev/null +++ b/deans-notification/sms_client.py @@ -0,0 +1,31 @@ +''' +Written by Michelle Lim Shi Hui & Nicholas Phang +Dean's Crisis Management System - Notification Subsystem +For CZ3003 Software System Analysis & Design + +WhatsApp API - +Takes in a message & sends as a WhatsApp message +Leverages on Twilio package +''' + +from twilio.rest import Client + +#Get API keys +from configparser import ConfigParser +config = ConfigParser() +config.read('config.ini') +account_sid = config.get('twilio', 'account_sid') +token = config.get('twilio', 'token') + +def main(number, message): + client = Client(account_sid, token) + print('Twilio Connection Successful') + post(client, number, message) + print('Whatsapp Message Sent') + +def post(client, number, message): + message = client.messages.create( + to="whatsapp:"+number, + from_="whatsapp:+14155238886", + body=message) + print(message.sid) \ No newline at end of file diff --git a/deans-notification/start_server.sh b/deans-notification/start_server.sh new file mode 100644 index 0000000..e801fca --- /dev/null +++ b/deans-notification/start_server.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +cd $FLASK_ROOT +python message_manager.py; \ No newline at end of file diff --git a/deans-notification/twitter_client.py b/deans-notification/twitter_client.py new file mode 100644 index 0000000..db92073 --- /dev/null +++ b/deans-notification/twitter_client.py @@ -0,0 +1,35 @@ +''' +Written by Michelle Lim Shi Hui & Nicholas Phang +Dean's Crisis Management System - Notification Subsystem +For CZ3003 Software System Analysis & Design + +Twitter API - +Takes in twitter credentials & message, formats the message & posts it +Leverages on Tweepy package to connect to Twitter API endpoint +''' + +import tweepy + +#Get API keys +from configparser import ConfigParser +config = ConfigParser() +config.read('config.ini') +ckey = config.get('twitter', 'ckey') +csecret = config.get('twitter', 'csecret') +atoken = config.get('twitter', 'atoken') +asecret = config.get('twitter', 'asecret') + +## TODO: IMPLEMENT ERROR HANDLING IF EXCESS 140 CHAR + +def main(data): + auth = tweepy.OAuthHandler(ckey, csecret) + auth.set_access_token(atoken, asecret) + print('Twitter Authentication Complete') + api = tweepy.API(auth) + post(api, data) + +def post(api, data): + api.update_status(data) + print(data) + print("Twitter Post Successful") + diff --git a/docker-compose.yaml b/docker-compose.yaml index 912de88..7653a6a 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -15,27 +15,45 @@ networks: services: db: - image: postgres + image: postgres:9.6 ports: - "5432:5432" + # --- REENGINEERING CHANGE 1: FIX DB INITIALIZATION & DECOUPLE CREDENTIALS --- + # This block uses variables from the root .env file to configure the DB. + # This resolves the "Database is uninitialized, and superuser password is not specified" error. + environment: + - POSTGRES_DB=${POSTGRES_DB} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + # --------------------------------------------------------------------------- + # REENGINEERING CHANGE 2: Use .env for consistency across all services env_file: - default.env - networks: + - .env + networks: - db_network + redis: - image: redis:2.8 + image: redis:7-alpine command: redis-server ports: - "6379:6379" - networks: + # REENGINEERING CHANGE 2: Use .env for consistency + env_file: + - default.env + - .env + networks: - redis_network + web: build: context: ./deans-api image: django_image entrypoint: "start_django.sh" + # REENGINEERING CHANGE 2: Use .env for secure secret injection (DJANGO_SECRET_KEY, NOTIFICATION_SERVICE_URL) env_file: - default.env + - .env volumes: - ./deans-api/data:/data - ./deans-api/deans_api:/work/deans-api/deans_api @@ -43,11 +61,12 @@ services: depends_on: - db - redis - networks: + networks: - db_network - nginx_network - notification_network - redis_network + notification: build: context: ./deans-notification @@ -56,20 +75,32 @@ services: # command: "python -c \"while True: pass\"" # ports: # - "8000:3000" + # REENGINEERING CHANGE 2: Use .env for consistency (e.g., API keys for social media) env_file: - default.env + - .env volumes: - ./deans-notification:/work networks: - notification_network + # frontend: # build: - # context: ./deans-frontend - # image: frontend_image + # context: ./deans-notification + # image: notification_image + # entrypoint: "start_server.sh" + # # command: "python -c \"while True: pass\"" + # # ports: + # # - "8000:3000" + # env_file: + # - default.env + # volumes: + # - ./deans-notification:/work # networks: # - frontend_network # ports: # - 3000:3000 + nginx: build: context: ./nginx @@ -79,19 +110,24 @@ services: volumes: - ./nginx/conf.d:/etc/nginx/conf.d - static_volume:/static-django + # REENGINEERING CHANGE 2: Use .env for consistency env_file: - default.env + - .env depends_on: - web # - frontend # - node networks: - nginx_network + cron: image: django_image command: bash -c "python3 /cron/cron.py" + # REENGINEERING CHANGE 2: Use .env for consistency (Cron jobs may need API keys or DB credentials) env_file: - default.env + - .env volumes: - ./cron:/cron - ./deans-api/deans_api:/work/deans-api/deans_api @@ -105,18 +141,16 @@ volumes: static_volume: - - - # node: + # node: # build: ./deans-frontend # ports: # - "3000:3000" # expose: # - 3000 # volumes: - # - ./deans-frontend:/work/ + # - ./deans-frontend:/work/ # ports: # - "3000" # command: bash -c "yarn install; yarn start" - # networks: - # - nginx_network \ No newline at end of file + # networks: + # - nginx_network diff --git a/nginx/conf.d/local.conf b/nginx/conf.d/local.conf index bca87ea..3e9e434 100644 --- a/nginx/conf.d/local.conf +++ b/nginx/conf.d/local.conf @@ -15,7 +15,7 @@ server { server_name localhost; location /api/ { - proxy_pass http://api_server; + proxy_pass http://web:8000; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;