~cytrogen/masto-fe

2f95adc06fbfae22e8f9b4df212938108f5e295c — ThibG 6 years ago 9ef2587 + 6ab7051
Merge pull request #1142 from ThibG/glitch-soc/merge-upstream

Merge upstream changes
M Gemfile => Gemfile +1 -1
@@ 15,7 15,7 @@ gem 'makara', '~> 0.4'
gem 'pghero', '~> 2.2'
gem 'dotenv-rails', '~> 2.7'

gem 'aws-sdk-s3', '~> 1.42', require: false
gem 'aws-sdk-s3', '~> 1.43', require: false
gem 'fog-core', '<= 2.1.0'
gem 'fog-openstack', '~> 0.3', require: false
gem 'paperclip', '~> 6.0'

M Gemfile.lock => Gemfile.lock +12 -12
@@ 76,17 76,17 @@ GEM
    av (0.9.0)
      cocaine (~> 0.5.3)
    aws-eventstream (1.0.3)
    aws-partitions (1.175.0)
    aws-sdk-core (3.55.0)
    aws-partitions (1.177.0)
    aws-sdk-core (3.56.0)
      aws-eventstream (~> 1.0, >= 1.0.2)
      aws-partitions (~> 1.0)
      aws-sigv4 (~> 1.1)
      jmespath (~> 1.0)
    aws-sdk-kms (1.21.0)
      aws-sdk-core (~> 3, >= 3.53.0)
    aws-sdk-kms (1.22.0)
      aws-sdk-core (~> 3, >= 3.56.0)
      aws-sigv4 (~> 1.1)
    aws-sdk-s3 (1.42.0)
      aws-sdk-core (~> 3, >= 3.53.0)
    aws-sdk-s3 (1.43.0)
      aws-sdk-core (~> 3, >= 3.56.0)
      aws-sdk-kms (~> 1)
      aws-sigv4 (~> 1.1)
    aws-sigv4 (1.1.0)


@@ 159,7 159,7 @@ GEM
    css_parser (1.6.0)
      addressable
    debug_inspector (0.0.3)
    derailed_benchmarks (1.3.5)
    derailed_benchmarks (1.3.6)
      benchmark-ips (~> 2)
      get_process_mem (~> 0)
      heapy (~> 0)


@@ 188,9 188,9 @@ GEM
      unf (>= 0.0.5, < 1.0.0)
    doorkeeper (5.1.0)
      railties (>= 5)
    dotenv (2.7.2)
    dotenv-rails (2.7.2)
      dotenv (= 2.7.2)
    dotenv (2.7.4)
    dotenv-rails (2.7.4)
      dotenv (= 2.7.4)
      railties (>= 3.2, < 6.1)
    elasticsearch (6.0.2)
      elasticsearch-api (= 6.0.2)


@@ 395,7 395,7 @@ GEM
      av (~> 0.9.0)
      paperclip (>= 2.5.2)
    parallel (1.17.0)
    parallel_tests (2.29.0)
    parallel_tests (2.29.1)
      parallel
    parser (2.6.3.0)
      ast (~> 2.4.0)


@@ 650,7 650,7 @@ DEPENDENCIES
  active_record_query_trace (~> 1.6)
  addressable (~> 2.6)
  annotate (~> 2.7)
  aws-sdk-s3 (~> 1.42)
  aws-sdk-s3 (~> 1.43)
  better_errors (~> 2.5)
  binding_of_caller (~> 0.7)
  blurhash (~> 0.1)

M app/chewy/statuses_index.rb => app/chewy/statuses_index.rb +1 -1
@@ 51,7 51,7 @@ class StatusesIndex < Chewy::Index
      field :id, type: 'long'
      field :account_id, type: 'long'

      field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do
      field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).concat(status.preloadable_poll ? status.preloadable_poll.options : []).join("\n\n") } do
        field :stemmed, type: 'text', analyzer: 'content'
      end


M app/controllers/application_controller.rb => app/controllers/application_controller.rb +6 -2
@@ 161,11 161,15 @@ class ApplicationController < ActionController::Base
  end

  def current_account
    @current_account ||= current_user.try(:account)
    return @current_account if defined?(@current_account)

    @current_account = current_user&.account
  end

  def current_session
    @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id'])
    return @current_session if defined?(@current_session)

    @current_session = SessionActivation.find_by(session_id: cookies.signed['_session_id']) if cookies.signed['_session_id'].present?
  end

  def current_flavour

M app/controllers/settings/preferences_controller.rb => app/controllers/settings/preferences_controller.rb +1 -0
@@ 52,6 52,7 @@ class Settings::PreferencesController < Settings::BaseController
      :setting_show_application,
      :setting_advanced_layout,
      :setting_default_content_type,
      :setting_use_blurhash,
      notification_emails: %i(follow follow_request reblog favourite mention digest report pending_account),
      interactions: %i(must_be_follower must_be_following must_be_following_dm)
    )

M app/javascript/flavours/glitch/actions/importer/normalizer.js => app/javascript/flavours/glitch/actions/importer/normalizer.js +1 -1
@@ 55,7 55,7 @@ export function normalizeStatus(status, normalOldStatus) {
    normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml');
  } else {
    const spoilerText   = normalStatus.spoiler_text || '';
    const searchContent = [spoilerText, status.content].join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
    const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
    const emojiMap      = makeEmojiMap(normalStatus);

    normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;

M app/javascript/flavours/glitch/components/media_gallery.js => app/javascript/flavours/glitch/components/media_gallery.js +3 -1
@@ 6,7 6,7 @@ import IconButton from './icon_button';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { isIOS } from 'flavours/glitch/util/is_mobile';
import classNames from 'classnames';
import { autoPlayGif, displayMedia } from 'flavours/glitch/util/initial_state';
import { autoPlayGif, displayMedia, useBlurhash } from 'flavours/glitch/util/initial_state';
import { decode } from 'blurhash';

const messages = defineMessages({


@@ 101,6 101,8 @@ class Item extends React.PureComponent {
  }

  _decode () {
    if (!useBlurhash) return;

    const hash   = this.props.attachment.get('blurhash');
    const pixels = decode(hash, 32, 32);


M app/javascript/flavours/glitch/features/video/index.js => app/javascript/flavours/glitch/features/video/index.js +2 -2
@@ 5,7 5,7 @@ import { fromJS, is } from 'immutable';
import { throttle } from 'lodash';
import classNames from 'classnames';
import { isFullscreen, requestFullscreen, exitFullscreen } from 'flavours/glitch/util/fullscreen';
import { displayMedia } from 'flavours/glitch/util/initial_state';
import { displayMedia, useBlurhash } from 'flavours/glitch/util/initial_state';
import { decode } from 'blurhash';

const messages = defineMessages({


@@ 312,7 312,7 @@ export default class Video extends React.PureComponent {
  }

  _decode () {
    if (!this.canvas) return;
    if (!this.canvas || !useBlurhash) return;

    const hash   = this.props.blurhash;
    const pixels = decode(hash, 32, 32);

M app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js => app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js +1 -1
@@ 74,7 74,7 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo
      return [emojisList['-1']];
    }

    let values = value.toLowerCase().split(/[\s|,|\-|_]+/),
    let values = value.toLowerCase().split(/[\s|,\-_]+/),
      allResults = [];

    if (values.length > 2) {

M app/javascript/flavours/glitch/util/initial_state.js => app/javascript/flavours/glitch/util/initial_state.js +1 -0
@@ 29,5 29,6 @@ export const mascot = getMeta('mascot');
export const isStaff = getMeta('is_staff');
export const defaultContentType = getMeta('default_content_type');
export const forceSingleColumn = getMeta('advanced_layout') === false;
export const useBlurhash = getMeta('use_blurhash');

export default initialState;

M app/javascript/mastodon/actions/importer/normalizer.js => app/javascript/mastodon/actions/importer/normalizer.js +1 -1
@@ 56,7 56,7 @@ export function normalizeStatus(status, normalOldStatus) {
    normalStatus.hidden = normalOldStatus.get('hidden');
  } else {
    const spoilerText   = normalStatus.spoiler_text || '';
    const searchContent = [spoilerText, status.content].join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
    const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
    const emojiMap      = makeEmojiMap(normalStatus);

    normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;

M app/javascript/mastodon/components/media_gallery.js => app/javascript/mastodon/components/media_gallery.js +3 -1
@@ 6,7 6,7 @@ import IconButton from './icon_button';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { isIOS } from '../is_mobile';
import classNames from 'classnames';
import { autoPlayGif, displayMedia } from '../initial_state';
import { autoPlayGif, displayMedia, useBlurhash } from '../initial_state';
import { decode } from 'blurhash';

const messages = defineMessages({


@@ 81,6 81,8 @@ class Item extends React.PureComponent {
  }

  _decode () {
    if (!useBlurhash) return;

    const hash   = this.props.attachment.get('blurhash');
    const pixels = decode(hash, 32, 32);


M app/javascript/mastodon/features/compose/components/compose_form.js => app/javascript/mastodon/features/compose/components/compose_form.js +2 -2
@@ 189,12 189,12 @@ class ComposeForm extends ImmutablePureComponent {
    }

    return (
      <div className='compose-form' ref={this.setRef}>
      <div className='compose-form'>
        <WarningContainer />

        <ReplyIndicatorContainer />

        <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`}>
        <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef}>
          <AutosuggestInput
            placeholder={intl.formatMessage(messages.spoiler_placeholder)}
            value={this.props.spoilerText}

M app/javascript/mastodon/features/emoji/emoji_mart_search_light.js => app/javascript/mastodon/features/emoji/emoji_mart_search_light.js +1 -1
@@ 74,7 74,7 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo
      return [emojisList['-1']];
    }

    let values = value.toLowerCase().split(/[\s|,|\-|_]+/),
    let values = value.toLowerCase().split(/[\s|,\-_]+/),
      allResults = [];

    if (values.length > 2) {

M app/javascript/mastodon/features/video/index.js => app/javascript/mastodon/features/video/index.js +3 -1
@@ 5,7 5,7 @@ import { fromJS, is } from 'immutable';
import { throttle } from 'lodash';
import classNames from 'classnames';
import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';
import { displayMedia } from '../../initial_state';
import { displayMedia, useBlurhash } from '../../initial_state';
import Icon from 'mastodon/components/icon';
import { decode } from 'blurhash';



@@ 298,6 298,8 @@ class Video extends React.PureComponent {
  }

  _decode () {
    if (!useBlurhash) return;

    const hash   = this.props.blurhash;
    const pixels = decode(hash, 32, 32);


M app/javascript/mastodon/initial_state.js => app/javascript/mastodon/initial_state.js +1 -0
@@ 21,5 21,6 @@ export const mascot = getMeta('mascot');
export const profile_directory = getMeta('profile_directory');
export const isStaff = getMeta('is_staff');
export const forceSingleColumn = !getMeta('advanced_layout');
export const useBlurhash = getMeta('use_blurhash');

export default initialState;

M app/lib/activitypub/activity.rb => app/lib/activitypub/activity.rb +1 -1
@@ 5,7 5,7 @@ class ActivityPub::Activity
  include Redisable

  SUPPORTED_TYPES = %w(Note Question).freeze
  CONVERTED_TYPES = %w(Image Video Article Page).freeze
  CONVERTED_TYPES = %w(Image Audio Video Article Page).freeze

  def initialize(json, account, **options)
    @json    = json

M app/lib/feed_manager.rb => app/lib/feed_manager.rb +2 -1
@@ 221,7 221,8 @@ class FeedManager
    status         = status.reblog if status.reblog?

    !combined_regex.match(Formatter.instance.plaintext(status)).nil? ||
      (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?)
      (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?) ||
      (status.preloadable_poll && !combined_regex.match(status.preloadable_poll.options.join("\n\n")).nil?)
  end

  # Adds a status to an account's feed, returning true if a status was

M app/lib/user_settings_decorator.rb => app/lib/user_settings_decorator.rb +5 -0
@@ 38,6 38,7 @@ class UserSettingsDecorator
    user.settings['show_application']    = show_application_preference if change?('setting_show_application')
    user.settings['advanced_layout']     = advanced_layout_preference if change?('setting_advanced_layout')
    user.settings['default_content_type']= default_content_type_preference if change?('setting_default_content_type')
    user.settings['use_blurhash']        = use_blurhash_preference if change?('setting_use_blurhash')
  end

  def merged_notification_emails


@@ 132,6 133,10 @@ class UserSettingsDecorator
    settings['setting_default_content_type']
  end

  def use_blurhash_preference
    boolean_cast_setting 'setting_use_blurhash'
  end

  def boolean_cast_setting(key)
    ActiveModel::Type::Boolean.new.cast(settings[key])
  end

M app/models/user.rb => app/models/user.rb +1 -1
@@ 106,7 106,7 @@ class User < ApplicationRecord
  delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :favourite_modal, :delete_modal,
           :reduce_motion, :system_font_ui, :noindex, :flavour, :skin, :display_media, :hide_network, :hide_followers_count,
           :expand_spoilers, :default_language, :aggregate_reblogs, :show_application,
           :advanced_layout, :default_content_type, to: :settings, prefix: :setting, allow_nil: false
           :advanced_layout, :default_content_type, :use_blurhash, to: :settings, prefix: :setting, allow_nil: false

  attr_reader :invite_code
  attr_writer :external

M app/serializers/initial_state_serializer.rb => app/serializers/initial_state_serializer.rb +1 -0
@@ 47,6 47,7 @@ class InitialStateSerializer < ActiveModel::Serializer
      store[:expand_spoilers] = object.current_account.user.setting_expand_spoilers
      store[:reduce_motion]   = object.current_account.user.setting_reduce_motion
      store[:advanced_layout] = object.current_account.user.setting_advanced_layout
      store[:use_blurhash]    = object.current_account.user.setting_use_blurhash
      store[:is_staff]        = object.current_account.user.staff?
      store[:default_content_type] = object.current_account.user.setting_default_content_type
    end

M app/services/resolve_url_service.rb => app/services/resolve_url_service.rb +2 -2
@@ 18,9 18,9 @@ class ResolveURLService < BaseService
  private

  def process_url
    if equals_or_includes_any?(type, %w(Application Group Organization Person Service))
    if equals_or_includes_any?(type, ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES)
      FetchRemoteAccountService.new.call(atom_url, body, protocol)
    elsif equals_or_includes_any?(type, %w(Note Article Image Video Page Question))
    elsif equals_or_includes_any?(type, ActivityPub::Activity::Create::SUPPORTED_TYPES + ActivityPub::Activity::Create::CONVERTED_TYPES)
      FetchRemoteStatusService.new.call(atom_url, body, protocol)
    end
  end

M app/views/settings/preferences/appearance/show.html.haml => app/views/settings/preferences/appearance/show.html.haml +3 -0
@@ 33,6 33,9 @@
    = f.input :setting_display_media, collection: ['default', 'show_all', 'hide_all'],label_method: lambda { |item| t("simple_form.hints.defaults.setting_display_media_#{item}") }, hint: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', wrapper: :with_floating_label

  .fields-group
    = f.input :setting_use_blurhash, as: :boolean, wrapper: :with_label

  .fields-group
    = f.input :setting_expand_spoilers, as: :boolean, wrapper: :with_label

  .actions

M config/locales/simple_form.en.yml => config/locales/simple_form.en.yml +2 -0
@@ 39,6 39,7 @@ en:
        setting_noindex: Affects your public profile and status pages
        setting_show_application: The application you use to toot will be displayed in the detailed view of your toots
        setting_skin: Reskins the selected Mastodon flavour
        setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details
        username: Your username will be unique on %{domain}
        whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word
      featured_tag:


@@ 120,6 121,7 @@ en:
        setting_skin: Skin
        setting_system_font_ui: Use system's default font
        setting_unfollow_modal: Show confirmation dialog before unfollowing someone
        setting_use_blurhash: Show colorful gradients for hidden media
        severity: Severity
        type: Import type
        username: Username

M config/settings.yml => config/settings.yml +1 -0
@@ 36,6 36,7 @@ defaults: &defaults
  skin: 'default'
  aggregate_reblogs: true
  advanced_layout: false
  use_blurhash: true
  notification_emails:
    follow: false
    reblog: false

M package.json => package.json +5 -5
@@ 77,7 77,7 @@
    "atrament": "^0.2.3",
    "autoprefixer": "^9.6.0",
    "axios": "^0.19.0",
    "babel-loader": "^8.0.5",
    "babel-loader": "^8.0.6",
    "babel-plugin-lodash": "^3.3.4",
    "babel-plugin-preval": "^3.0.1",
    "babel-plugin-react-intl": "^3.1.3",


@@ 112,7 112,7 @@
    "lodash": "^4.7.11",
    "mark-loader": "^0.1.6",
    "marky": "^1.2.1",
    "mini-css-extract-plugin": "^0.5.0",
    "mini-css-extract-plugin": "^0.7.0",
    "mkdirp": "^0.5.1",
    "npmlog": "^4.1.2",
    "object-assign": "^4.1.1",


@@ 155,7 155,7 @@
    "rimraf": "^2.6.3",
    "sass": "^1.20.3",
    "sass-loader": "^7.0.3",
    "stringz": "^1.0.0",
    "stringz": "^2.0.0",
    "substring-trie": "^1.0.2",
    "terser-webpack-plugin": "^1.3.0",
    "throng": "^4.0.0",


@@ 173,7 173,7 @@
    "babel-jest": "^24.8.0",
    "enzyme": "^3.10.0",
    "enzyme-adapter-react-16": "^1.14.0",
    "eslint": "^5.11.1",
    "eslint": "^5.16.0",
    "eslint-plugin-import": "~2.17.3",
    "eslint-plugin-jsx-a11y": "~6.2.1",
    "eslint-plugin-promise": "~4.1.1",


@@ 183,7 183,7 @@
    "react-intl-translations-manager": "^5.0.3",
    "react-test-renderer": "^16.8.6",
    "sass-lint": "^1.13.1",
    "webpack-dev-server": "^3.5.1",
    "webpack-dev-server": "^3.7.2",
    "yargs": "^12.0.5"
  }
}

M spec/lib/feed_manager_spec.rb => spec/lib/feed_manager_spec.rb +8 -0
@@ 156,6 156,14 @@ RSpec.describe FeedManager do
          status = Fabricate(:status, text: 'shiitake', account: jeff)
          expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
        end

        it 'returns true if phrase is contained in a poll option' do
          alice.custom_filters.create!(phrase: 'farts', context: %w(home public), irreversible: true)
          alice.custom_filters.create!(phrase: 'pop tarts', context: %w(home), irreversible: true)
          alice.follow!(jeff)
          status = Fabricate(:status, text: 'what do you prefer', poll: Fabricate(:poll, options: %w(farts POP TARts)), account: jeff)
          expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
        end
      end
    end


M spec/services/activitypub/fetch_remote_status_service_spec.rb => spec/services/activitypub/fetch_remote_status_service_spec.rb +33 -0
@@ 71,6 71,39 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
      end
    end

    context 'with Audio object' do
      let(:object) do
        {
          '@context': 'https://www.w3.org/ns/activitystreams',
          id: "https://#{valid_domain}/@foo/1234",
          type: 'Audio',
          name: 'Nyan Cat 10 hours remix',
          attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
          url: [
            {
              type: 'Link',
              mimeType: 'application/x-bittorrent',
              href: "https://#{valid_domain}/12345.torrent",
            },

            {
              type: 'Link',
              mimeType: 'text/html',
              href: "https://#{valid_domain}/watch?v=12345",
            },
          ],
        }
      end

      it 'creates status' do
        status = sender.statuses.first

        expect(status).to_not be_nil
        expect(status.url).to eq "https://#{valid_domain}/watch?v=12345"
        expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remix https://#{valid_domain}/watch?v=12345"
      end
    end

    context 'with wrong id' do
      let(:note) do
        {

M yarn.lock => yarn.lock +213 -116
@@ 1384,7 1384,7 @@ acorn@^5.5.0, acorn@^5.5.3:
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
  integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==

acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.5, acorn@^6.0.7:
acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7:
  version "6.1.1"
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
  integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==


@@ 1428,10 1428,10 @@ ajv@^4.7.0:
    co "^4.6.0"
    json-stable-stringify "^1.0.1"

ajv@^6.1.0, ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1:
  version "6.6.2"
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d"
  integrity sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==
ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1:
  version "6.10.0"
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
  integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
  dependencies:
    fast-deep-equal "^2.0.1"
    fast-json-stable-stringify "^2.0.0"


@@ 1458,6 1458,11 @@ ansi-escapes@^3.0.0:
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
  integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==

ansi-escapes@^3.2.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
  integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==

ansi-html@0.0.7:
  version "0.0.7"
  resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"


@@ 1478,6 1483,11 @@ ansi-regex@^4.0.0:
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9"
  integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==

ansi-regex@^4.1.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
  integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==

ansi-styles@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"


@@ 1755,15 1765,15 @@ babel-jest@^24.8.0:
    chalk "^2.4.2"
    slash "^2.0.0"

babel-loader@^8.0.5:
  version "8.0.5"
  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33"
  integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==
babel-loader@^8.0.6:
  version "8.0.6"
  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
  integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==
  dependencies:
    find-cache-dir "^2.0.0"
    loader-utils "^1.0.2"
    mkdirp "^0.5.1"
    util.promisify "^1.0.0"
    pify "^4.0.1"

babel-plugin-emotion@^9.2.11:
  version "9.2.11"


@@ 3242,6 3252,13 @@ doctrine@^2.1.0:
  dependencies:
    esutils "^2.0.2"

doctrine@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
  dependencies:
    esutils "^2.0.2"

dom-helpers@^3.2.1, dom-helpers@^3.3.1:
  version "3.4.0"
  resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"


@@ 3374,7 3391,7 @@ emoji-mart@Gargron/emoji-mart#build:
  version "2.6.2"
  resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9"

emoji-regex@^7.0.2:
emoji-regex@^7.0.1, emoji-regex@^7.0.2:
  version "7.0.3"
  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
  integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==


@@ 3697,10 3714,10 @@ eslint-scope@3.7.1:
    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"
  integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==
eslint-scope@^4.0.0, eslint-scope@^4.0.3:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
  dependencies:
    esrecurse "^4.1.0"
    estraverse "^4.1.1"


@@ 3754,47 3771,46 @@ eslint@^2.7.0:
    text-table "~0.2.0"
    user-home "^2.0.0"

eslint@^5.11.1:
  version "5.11.1"
  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.11.1.tgz#8deda83db9f354bf9d3f53f9677af7e0e13eadda"
  integrity sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg==
eslint@^5.16.0:
  version "5.16.0"
  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
  integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
  dependencies:
    "@babel/code-frame" "^7.0.0"
    ajv "^6.5.3"
    ajv "^6.9.1"
    chalk "^2.1.0"
    cross-spawn "^6.0.5"
    debug "^4.0.1"
    doctrine "^2.1.0"
    eslint-scope "^4.0.0"
    doctrine "^3.0.0"
    eslint-scope "^4.0.3"
    eslint-utils "^1.3.1"
    eslint-visitor-keys "^1.0.0"
    espree "^5.0.0"
    espree "^5.0.1"
    esquery "^1.0.1"
    esutils "^2.0.2"
    file-entry-cache "^2.0.0"
    file-entry-cache "^5.0.1"
    functional-red-black-tree "^1.0.1"
    glob "^7.1.2"
    globals "^11.7.0"
    ignore "^4.0.6"
    import-fresh "^3.0.0"
    imurmurhash "^0.1.4"
    inquirer "^6.1.0"
    js-yaml "^3.12.0"
    inquirer "^6.2.2"
    js-yaml "^3.13.0"
    json-stable-stringify-without-jsonify "^1.0.1"
    levn "^0.3.0"
    lodash "^4.17.5"
    lodash "^4.17.11"
    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.1"
    require-uncached "^1.0.3"
    semver "^5.5.1"
    strip-ansi "^4.0.0"
    strip-json-comments "^2.0.1"
    table "^5.0.2"
    table "^5.2.3"
    text-table "^0.2.0"

espree@^3.1.6:


@@ 3805,12 3821,12 @@ espree@^3.1.6:
    acorn "^5.5.0"
    acorn-jsx "^3.0.0"

espree@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c"
  integrity sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==
espree@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
  integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
  dependencies:
    acorn "^6.0.2"
    acorn "^6.0.7"
    acorn-jsx "^5.0.0"
    eslint-visitor-keys "^1.0.0"



@@ 4007,7 4023,7 @@ extend@~3.0.2:
  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==

external-editor@^3.0.0:
external-editor@^3.0.3:
  version "3.0.3"
  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27"
  integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==


@@ 4121,13 4137,12 @@ file-entry-cache@^1.1.1:
    flat-cache "^1.2.1"
    object-assign "^4.0.1"

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"
  integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
file-entry-cache@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
  dependencies:
    flat-cache "^1.2.1"
    object-assign "^4.0.1"
    flat-cache "^2.0.1"

file-loader@^4.0.0:
  version "4.0.0"


@@ 4213,6 4228,20 @@ flat-cache@^1.2.1:
    rimraf "~2.6.2"
    write "^0.2.1"

flat-cache@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
  dependencies:
    flatted "^2.0.0"
    rimraf "2.6.3"
    write "1.0.3"

flatted@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916"
  integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==

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"


@@ 4435,7 4464,7 @@ glob-parent@^3.1.0:
    is-glob "^3.1.0"
    path-dirname "^1.0.0"

glob@^7.0.0, glob@~7.1.1:
glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
  version "7.1.4"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
  integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==


@@ 4447,18 4476,6 @@ glob@^7.0.0, glob@~7.1.1:
    once "^1.3.0"
    path-is-absolute "^1.0.0"

glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3:
  version "7.1.3"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
  integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
  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@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"


@@ 4479,16 4496,11 @@ global-prefix@^1.0.1:
    is-windows "^1.0.1"
    which "^1.2.14"

globals@^11.1.0:
globals@^11.1.0, globals@^11.7.0:
  version "11.12.0"
  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==

globals@^11.7.0:
  version "11.9.0"
  resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249"
  integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==

globals@^9.2.0:
  version "9.18.0"
  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"


@@ 4894,6 4906,14 @@ import-fresh@^2.0.0:
    caller-path "^2.0.0"
    resolve-from "^3.0.0"

import-fresh@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390"
  integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==
  dependencies:
    parent-module "^1.0.0"
    resolve-from "^4.0.0"

import-from@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"


@@ 4974,23 4994,23 @@ inquirer@^0.12.0:
    strip-ansi "^3.0.0"
    through "^2.3.6"

inquirer@^6.1.0:
  version "6.2.1"
  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52"
  integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==
inquirer@^6.2.2:
  version "6.4.1"
  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b"
  integrity sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==
  dependencies:
    ansi-escapes "^3.0.0"
    chalk "^2.0.0"
    ansi-escapes "^3.2.0"
    chalk "^2.4.2"
    cli-cursor "^2.1.0"
    cli-width "^2.0.0"
    external-editor "^3.0.0"
    external-editor "^3.0.3"
    figures "^2.0.0"
    lodash "^4.17.10"
    lodash "^4.17.11"
    mute-stream "0.0.7"
    run-async "^2.2.0"
    rxjs "^6.1.0"
    rxjs "^6.4.0"
    string-width "^2.1.0"
    strip-ansi "^5.0.0"
    strip-ansi "^5.1.0"
    through "^2.3.6"

internal-ip@^4.3.0:


@@ 5303,6 5323,11 @@ is-path-inside@^2.1.0:
  dependencies:
    path-is-inside "^1.0.2"

is-plain-obj@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
  integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=

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"


@@ 5833,7 5858,7 @@ js-string-escape@1.0.1:
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==

js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0:
js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0:
  version "3.13.1"
  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==


@@ 6194,10 6219,10 @@ lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11,
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
  integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==

loglevel@^1.6.2:
  version "1.6.2"
  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.2.tgz#668c77948a03dbd22502a3513ace1f62a80cc372"
  integrity sha512-Jt2MHrCNdtIe1W6co3tF5KXGRkzF+TYffiQstfXa04mrss9IKXzAAXYWak8LbZseAQY03sH2GzMCMU0ZOUc9bg==
loglevel@^1.6.3:
  version "1.6.3"
  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280"
  integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==

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"


@@ 6390,12 6415,13 @@ mimic-fn@^1.0.0:
  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
  integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==

mini-css-extract-plugin@^0.5.0:
  version "0.5.0"
  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
  integrity sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==
mini-css-extract-plugin@^0.7.0:
  version "0.7.0"
  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz#5ba8290fbb4179a43dd27cca444ba150bee743a0"
  integrity sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==
  dependencies:
    loader-utils "^1.1.0"
    normalize-url "1.9.1"
    schema-utils "^1.0.0"
    webpack-sources "^1.1.0"



@@ 6739,6 6765,16 @@ normalize-range@^0.1.2:
  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
  integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=

normalize-url@1.9.1:
  version "1.9.1"
  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
  integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
  dependencies:
    object-assign "^4.0.1"
    prepend-http "^1.0.0"
    query-string "^4.1.0"
    sort-keys "^1.0.0"

normalize-url@^3.0.0:
  version "3.3.0"
  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"


@@ 7080,6 7116,13 @@ p-reduce@^1.0.0:
  resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
  integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=

p-retry@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
  integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==
  dependencies:
    retry "^0.12.0"

p-try@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"


@@ 7109,6 7152,13 @@ parallel-transform@^1.1.0:
    inherits "^2.0.3"
    readable-stream "^2.1.5"

parent-module@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
  dependencies:
    callsites "^3.0.0"

parse-asn1@^5.0.0:
  version "5.1.1"
  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"


@@ 7367,11 7417,6 @@ pluralize@^1.2.1:
  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
  integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=

pluralize@^7.0.0:
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
  integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==

pn@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"


@@ 7781,6 7826,11 @@ prelude-ls@~1.1.2:
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
  integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=

prepend-http@^1.0.0:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
  integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=

prettier@^1.17.0:
  version "1.18.2"
  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"


@@ 7952,6 8002,14 @@ qs@~6.5.2:
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
  integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==

query-string@^4.1.0:
  version "4.3.4"
  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
  integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
  dependencies:
    object-assign "^4.1.0"
    strict-uri-encode "^1.0.0"

querystring-es3@^0.2.0:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"


@@ 8597,7 8655,7 @@ require-package-name@^2.0.1:
  resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9"
  integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk=

require-uncached@^1.0.2, require-uncached@^1.0.3:
require-uncached@^1.0.2:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
  integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=


@@ 8640,6 8698,11 @@ resolve-from@^3.0.0:
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
  integrity sha1-six699nWiBvItuZTM17rywoYh0g=

resolve-from@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==

resolve-pathname@^2.2.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879"


@@ 8683,6 8746,11 @@ ret@~0.1.10:
  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==

retry@^0.12.0:
  version "0.12.0"
  resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
  integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=

rgb-regex@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"


@@ 8693,7 8761,7 @@ rgba-regex@^1.0.0:
  resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
  integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=

rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2:
rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2:
  version "2.6.3"
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==


@@ 8747,10 8815,10 @@ rx-lite@^3.1.2:
  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
  integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=

rxjs@^6.1.0:
  version "6.3.3"
  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55"
  integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==
rxjs@^6.4.0:
  version "6.5.2"
  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7"
  integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==
  dependencies:
    tslib "^1.9.0"



@@ 9045,10 9113,10 @@ slice-ansi@0.0.4:
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
  integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=

slice-ansi@2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.0.0.tgz#5373bdb8559b45676e8541c66916cdd6251612e7"
  integrity sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==
slice-ansi@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
  dependencies:
    ansi-styles "^3.2.0"
    astral-regex "^1.0.0"


@@ 9104,6 9172,13 @@ sockjs@0.3.19:
    faye-websocket "^0.10.0"
    uuid "^3.0.1"

sort-keys@^1.0.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
  integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
  dependencies:
    is-plain-obj "^1.0.0"

source-list-map@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"


@@ 9306,6 9381,11 @@ stream-shift@^1.0.0:
  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
  integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=

strict-uri-encode@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
  integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=

string-length@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"


@@ 9331,6 9411,15 @@ string-width@^1.0.1:
    is-fullwidth-code-point "^2.0.0"
    strip-ansi "^4.0.0"

string-width@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
  integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
  dependencies:
    emoji-regex "^7.0.1"
    is-fullwidth-code-point "^2.0.0"
    strip-ansi "^5.1.0"

string.prototype.trim@^1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"


@@ 9354,10 9443,10 @@ string_decoder@~1.1.1:
  dependencies:
    safe-buffer "~5.1.0"

stringz@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/stringz/-/stringz-1.0.0.tgz#d2acba994e4ce3c725ee15c86fff4281280d2025"
  integrity sha512-oaqFaIAmw1MJmdPNiBqocHHrC0VzJTL3CI1z5uXm3NQSE3AyDU152ZPTSJSOKk+9z1Cm3LZzgLFjCTb8SXZvag==
stringz@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/stringz/-/stringz-2.0.0.tgz#0a092bc64ed9b42eff2936d0401d2398393d54e9"
  integrity sha512-pRWc5RGpedKEDvQ/ukYs8kS8tKj+cKu5ayOoyOvsavbpiLBcm1dGX6p1o5IagaN11cbfN8tKGpgQ4fHdEq5LBA==
  dependencies:
    unicode-astral-regex "^1.0.1"



@@ 9375,12 9464,12 @@ strip-ansi@^4.0.0:
  dependencies:
    ansi-regex "^3.0.0"

strip-ansi@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f"
  integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==
strip-ansi@^5.0.0, strip-ansi@^5.1.0:
  version "5.2.0"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
  integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
  dependencies:
    ansi-regex "^4.0.0"
    ansi-regex "^4.1.0"

strip-bom@^3.0.0:
  version "3.0.0"


@@ 9494,15 9583,15 @@ table@^3.7.8:
    slice-ansi "0.0.4"
    string-width "^2.0.0"

table@^5.0.2:
  version "5.1.1"
  resolved "https://registry.yarnpkg.com/table/-/table-5.1.1.tgz#92030192f1b7b51b6eeab23ed416862e47b70837"
  integrity sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==
table@^5.2.3:
  version "5.4.1"
  resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8"
  integrity sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==
  dependencies:
    ajv "^6.6.1"
    ajv "^6.9.1"
    lodash "^4.17.11"
    slice-ansi "2.0.0"
    string-width "^2.1.1"
    slice-ansi "^2.1.0"
    string-width "^3.0.0"

tapable@^1.0.0, tapable@^1.1.0:
  version "1.1.1"


@@ 10081,10 10170,10 @@ webpack-dev-middleware@^3.7.0:
    range-parser "^1.2.1"
    webpack-log "^2.0.0"

webpack-dev-server@^3.5.1:
  version "3.5.1"
  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.5.1.tgz#4290ac709bb989dc7382c912899f79fd5677dabf"
  integrity sha512-0IdMGddJcnK9zesZOeHWl4uAOVfypn7DSrdNWtclROkVBXy/TcBN+6eEG1wNfLT9dXVfaRZZsLTJt0mJtgTQgw==
webpack-dev-server@^3.7.2:
  version "3.7.2"
  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz#f79caa5974b7f8b63268ef5421222a8486d792f5"
  integrity sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==
  dependencies:
    ansi-html "0.0.7"
    bonjour "^3.5.0"


@@ 10100,8 10189,9 @@ webpack-dev-server@^3.5.1:
    internal-ip "^4.3.0"
    ip "^1.1.5"
    killable "^1.0.1"
    loglevel "^1.6.2"
    loglevel "^1.6.3"
    opn "^5.5.0"
    p-retry "^3.0.1"
    portfinder "^1.0.20"
    schema-utils "^1.0.0"
    selfsigned "^1.10.4"


@@ 10283,6 10373,13 @@ write-file-atomic@2.4.1:
    imurmurhash "^0.1.4"
    signal-exit "^3.0.2"

write@1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
  dependencies:
    mkdirp "^0.5.1"

write@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"