From 93c6ea683ddb00440365993897de0ad158a7eeb9 Mon Sep 17 00:00:00 2001 From: Tobias Springer Date: Sat, 9 May 2020 16:45:23 +0200 Subject: [PATCH] Initial commit --- .gitattributes | 1 + .gitignore | 111 + .prettierrc.yaml | 11 + .vscode/settings.json | 3 + README.md | 2 + buildutils.js | 44 + gulp/.gitattributes | 1 + gulp/.gitignore | 1 + gulp/babel-es6.config.js | 48 + gulp/babel.config.js | 41 + gulp/buildutils.js | 50 + gulp/bundle-loader.js | 112 + gulp/convert_atlas.js | 96 + gulp/cordova.js | 153 + gulp/css.js | 101 + gulp/docs.js | 38 + gulp/ftp.js | 104 + gulp/gulpfile.js | 274 + gulp/html.js | 360 + gulp/image-resources.js | 138 + gulp/js.js | 182 + gulp/jsconfig.json | 6 + gulp/loader.compressjson.js | 11 + gulp/loader.strip_block.js | 21 + gulp/package.json | 115 + gulp/sounds.js | 107 + gulp/standalone.js | 215 + gulp/tsconfig.json | 59 + gulp/webpack.config.js | 116 + gulp/webpack.production.config.js | 258 + gulp/yarn.lock | 14195 ++++++++++++++++ jsconfig.json | 7 + package.json | 84 + res/fonts/LouisGeorgeCafe.woff2 | Bin 0 -> 13164 bytes res/logo.png | Bin 0 -> 63839 bytes res/ui/building_tutorials/belt.png | Bin 0 -> 43921 bytes res/ui/building_tutorials/cutter.png | Bin 0 -> 63140 bytes res/ui/building_tutorials/miner.png | Bin 0 -> 72988 bytes res/ui/building_tutorials/mixer.png | Bin 0 -> 33184 bytes res/ui/building_tutorials/painter.png | Bin 0 -> 38027 bytes res/ui/building_tutorials/rotater.png | Bin 0 -> 26948 bytes res/ui/building_tutorials/splitter.png | Bin 0 -> 82980 bytes res/ui/building_tutorials/stacker.png | Bin 0 -> 56549 bytes res/ui/building_tutorials/trash.png | Bin 0 -> 23075 bytes .../building_tutorials/underground_belt.png | Bin 0 -> 89037 bytes res/ui/dialog_bg_pattern.png | Bin 0 -> 3085 bytes res/ui/icons/close.png | Bin 0 -> 3885 bytes res/ui/icons/mouse_left.png | Bin 0 -> 2309 bytes res/ui/icons/mouse_right.png | Bin 0 -> 2104 bytes res/ui/icons/shop.png | Bin 0 -> 877 bytes res/ui/icons/statistics.png | Bin 0 -> 1425 bytes res/ui/loading.svg | 6 + res/ui/locked_building.png | Bin 0 -> 5920 bytes res/ui/menu_bg.noinline.jpg | Bin 0 -> 521881 bytes res/ui/sad_ghost.png | Bin 0 -> 6789 bytes res/ui/upgrades/belt.png | Bin 0 -> 3172 bytes res/ui/upgrades/miner.png | Bin 0 -> 940 bytes res/ui/upgrades/painting.png | Bin 0 -> 1319 bytes res/ui/upgrades/processors.png | Bin 0 -> 1827 bytes res_raw/atlas.tps | 417 + res_raw/sounds/music/main_menu.wav | 3 + res_raw/sounds/music/theme_full.wav | 3 + res_raw/sounds/ui/dialog_error.wav | 3 + res_raw/sounds/ui/dialog_ok.wav | 3 + res_raw/sounds/ui/ui_click.wav | 3 + res_raw/sounds/ui/ui_error.wav | 3 + res_raw/sounds/ui/ui_swish_hide.wav | 3 + res_raw/sounds/ui/ui_swish_show.wav | 3 + res_raw/sprites/belt/forward_0.png | Bin 0 -> 3575 bytes res_raw/sprites/belt/forward_1.png | Bin 0 -> 3575 bytes res_raw/sprites/belt/forward_2.png | Bin 0 -> 3587 bytes res_raw/sprites/belt/forward_3.png | Bin 0 -> 3595 bytes res_raw/sprites/belt/forward_4.png | Bin 0 -> 3589 bytes res_raw/sprites/belt/forward_5.png | Bin 0 -> 3575 bytes res_raw/sprites/belt/left_0.png | Bin 0 -> 5707 bytes res_raw/sprites/belt/left_1.png | Bin 0 -> 5900 bytes res_raw/sprites/belt/left_2.png | Bin 0 -> 6005 bytes res_raw/sprites/belt/left_3.png | Bin 0 -> 6072 bytes res_raw/sprites/belt/left_4.png | Bin 0 -> 6109 bytes res_raw/sprites/belt/left_5.png | Bin 0 -> 6089 bytes res_raw/sprites/belt/right_0.png | Bin 0 -> 5433 bytes res_raw/sprites/belt/right_1.png | Bin 0 -> 5759 bytes res_raw/sprites/belt/right_2.png | Bin 0 -> 5858 bytes res_raw/sprites/belt/right_3.png | Bin 0 -> 5879 bytes res_raw/sprites/belt/right_4.png | Bin 0 -> 5844 bytes res_raw/sprites/belt/right_5.png | Bin 0 -> 5812 bytes res_raw/sprites/buildings/belt_left.png | Bin 0 -> 5707 bytes res_raw/sprites/buildings/belt_right.png | Bin 0 -> 5433 bytes res_raw/sprites/buildings/belt_top.png | Bin 0 -> 3575 bytes res_raw/sprites/buildings/cutter.png | Bin 0 -> 18389 bytes res_raw/sprites/buildings/hub.png | Bin 0 -> 62175 bytes res_raw/sprites/buildings/miner.png | Bin 0 -> 10333 bytes res_raw/sprites/buildings/mixer.png | Bin 0 -> 18208 bytes res_raw/sprites/buildings/painter.png | Bin 0 -> 19574 bytes res_raw/sprites/buildings/rotater.png | Bin 0 -> 13562 bytes res_raw/sprites/buildings/splitter.png | Bin 0 -> 19071 bytes res_raw/sprites/buildings/stacker.png | Bin 0 -> 18150 bytes res_raw/sprites/buildings/trash.png | Bin 0 -> 10543 bytes .../buildings/underground_belt_entry.png | Bin 0 -> 10041 bytes .../buildings/underground_belt_exit.png | Bin 0 -> 9963 bytes res_raw/sprites/debug/acceptor_slot.png | Bin 0 -> 3063 bytes res_raw/sprites/debug/ejector_slot.png | Bin 0 -> 3064 bytes res_raw/sprites/map_overview/belt_forward.png | Bin 0 -> 1646 bytes res_raw/sprites/map_overview/belt_left.png | Bin 0 -> 1669 bytes res_raw/sprites/map_overview/belt_right.png | Bin 0 -> 1664 bytes res_raw/sprites/misc/slot_bad_arrow.png | Bin 0 -> 4745 bytes res_raw/sprites/misc/slot_good_arrow.png | Bin 0 -> 4344 bytes shapez.code-workspace | 18 + src/css/adinplay.scss | 107 + src/css/animations.scss | 13 + src/css/application_error.scss | 67 + src/css/common.scss | 662 + src/css/dynamic_ui.scss | 43 + src/css/game_state.scss | 31 + src/css/icons.scss | 22 + src/css/ingame_hud/beta_overlay.scss | 8 + src/css/ingame_hud/blur_overlay.scss | 8 + src/css/ingame_hud/building_placer.scss | 35 + src/css/ingame_hud/buildings_toolbar.scss | 181 + src/css/ingame_hud/dialogs.scss | 63 + src/css/ingame_hud/game_menu.scss | 59 + src/css/ingame_hud/keybindings_overlay.scss | 78 + src/css/ingame_hud/shop.scss | 180 + src/css/ingame_hud/unlock_notification.scss | 134 + src/css/main.scss | 50 + src/css/material_colors.scss | 319 + src/css/mixins.scss | 379 + src/css/states/ingame.scss | 16 + src/css/states/main_menu.scss | 27 + src/css/states/preload.scss | 100 + src/css/textual_game_state.scss | 267 + src/css/trigonometry.scss | 66 + src/css/variables.scss | 195 + src/html/index.html | 43 + src/js/application.js | 362 + src/js/core/animation_frame.js | 71 + src/js/core/assert.js | 26 + src/js/core/async_compression.js | 143 + src/js/core/atlas_definitions.js | 38 + src/js/core/background_resources_loader.js | 216 + src/js/core/buffer_maintainer.js | 146 + src/js/core/buffer_utils.js | 201 + src/js/core/builtins.js | 34 + src/js/core/cachebust.js | 10 + src/js/core/click_detector.js | 431 + src/js/core/config.js | 104 + src/js/core/dpi_manager.js | 117 + src/js/core/draw_parameters.js | 25 + src/js/core/draw_utils.js | 321 + src/js/core/error_handler.js | 126 + src/js/core/explained_result.js | 40 + src/js/core/factory.js | 81 + src/js/core/game_state.js | 365 + src/js/core/global_registries.js | 35 + src/js/core/globals.js | 17 + src/js/core/input_distributor.js | 235 + src/js/core/input_receiver.js | 25 + src/js/core/loader.js | 243 + src/js/core/logging.js | 249 + src/js/core/lzstring.js | 493 + src/js/core/perlin_noise.js | 175 + src/js/core/perlin_noise_data.js | 258 + src/js/core/polyfills.js | 69 + src/js/core/query_parameters.js | 10 + src/js/core/read_write_proxy.js | 300 + src/js/core/rectangle.js | 287 + src/js/core/request_channel.js | 72 + src/js/core/rng.js | 133 + src/js/core/sensitive_utils.encrypt.js | 62 + src/js/core/signal.js | 66 + src/js/core/singleton_factory.js | 78 + src/js/core/sprites.js | 351 + src/js/core/state_manager.js | 121 + src/js/core/tracked_state.js | 39 + src/js/core/utils.js | 889 + src/js/core/vector.js | 665 + src/js/game/automatic_save.js | 80 + src/js/game/base_item.js | 33 + src/js/game/buildings/belt_base.js | 204 + src/js/game/buildings/cutter.js | 71 + src/js/game/buildings/hub.js | 125 + src/js/game/buildings/miner.js | 36 + src/js/game/buildings/mixer.js | 73 + src/js/game/buildings/painter.js | 73 + src/js/game/buildings/rotater.js | 64 + src/js/game/buildings/splitter.js | 80 + src/js/game/buildings/stacker.js | 73 + src/js/game/buildings/trash.js | 73 + src/js/game/buildings/underground_belt.js | 158 + src/js/game/camera.js | 870 + src/js/game/canvas_click_interceptor.js | 70 + src/js/game/colors.js | 167 + src/js/game/component.js | 38 + src/js/game/component_registry.js | 38 + src/js/game/components/belt.js | 92 + src/js/game/components/hub.js | 25 + src/js/game/components/item_acceptor.js | 129 + src/js/game/components/item_ejector.js | 162 + src/js/game/components/item_processor.js | 106 + src/js/game/components/miner.js | 23 + .../game/components/replaceable_map_entity.js | 11 + src/js/game/components/static_map_entity.js | 184 + src/js/game/components/underground_belt.js | 88 + src/js/game/components/unremovable.js | 7 + src/js/game/core.js | 434 + src/js/game/entity.js | 222 + src/js/game/entity_components.js | 57 + src/js/game/entity_manager.js | 239 + src/js/game/game_loading_overlay.js | 57 + src/js/game/game_system.js | 43 + src/js/game/game_system_manager.js | 104 + src/js/game/game_system_with_filter.js | 175 + src/js/game/hub_goals.js | 330 + src/js/game/hud/base_hud_part.js | 175 + src/js/game/hud/dynamic_dom_attach.js | 79 + src/js/game/hud/hud.js | 187 + src/js/game/hud/parts/beta_overlay.js | 10 + src/js/game/hud/parts/building_placer.js | 492 + src/js/game/hud/parts/buildings_toolbar.js | 128 + src/js/game/hud/parts/game_menu.js | 37 + src/js/game/hud/parts/keybinding_overlay.js | 73 + src/js/game/hud/parts/processing_overlay.js | 117 + src/js/game/hud/parts/shop.js | 181 + src/js/game/hud/parts/unlock_notification.js | 122 + src/js/game/item_registry.js | 6 + src/js/game/items/color_item.js | 90 + src/js/game/items/shape_item.js | 42 + src/js/game/key_action_mapper.js | 383 + src/js/game/logic.js | 209 + src/js/game/map.js | 207 + src/js/game/map_chunk.js | 359 + src/js/game/map_chunk_view.js | 226 + src/js/game/map_view.js | 249 + src/js/game/meta_building.js | 155 + src/js/game/meta_building_registry.js | 26 + src/js/game/root.js | 214 + src/js/game/shape_definition.js | 447 + src/js/game/shape_definition_manager.js | 142 + src/js/game/sound_proxy.js | 83 + src/js/game/systems/belt.js | 201 + src/js/game/systems/hub.js | 83 + src/js/game/systems/item_ejector.js | 173 + src/js/game/systems/item_processor.js | 341 + src/js/game/systems/map_resources.js | 56 + src/js/game/systems/miner.js | 87 + src/js/game/systems/static_map_entity.js | 72 + src/js/game/systems/underground_belt.js | 129 + src/js/game/time/base_game_speed.js | 55 + src/js/game/time/fast_forward_game_speed.js | 16 + src/js/game/time/game_time.js | 233 + src/js/game/time/paused_game_speed.js | 15 + src/js/game/time/regular_game_speed.js | 11 + src/js/game/tutorial_goals.js | 163 + src/js/game/upgrades.js | 326 + src/js/game_analytics.d.ts | 737 + src/js/globals.d.ts | 191 + src/js/main.js | 61 + src/js/platform/ad_provider.js | 45 + src/js/platform/ad_providers/adinplay.js | 188 + .../platform/ad_providers/no_ad_provider.js | 11 + src/js/platform/analytics.js | 43 + src/js/platform/browser/embed_provider.js | 47 + .../browser/embed_providers/armorgames.js | 16 + .../browser/embed_providers/crazygames.js | 11 + .../embed_providers/gamedistribution.js | 20 + .../browser/embed_providers/iogames_space.js | 15 + .../browser/embed_providers/kongregate.js | 24 + .../browser/embed_providers/miniclip.js | 11 + .../embed_providers/shapezio_website.js | 24 + src/js/platform/browser/game_analytics.js | 69 + src/js/platform/browser/google_analytics.js | 101 + src/js/platform/browser/sound.js | 146 + src/js/platform/browser/storage.js | 97 + src/js/platform/browser/wrapper.js | 242 + src/js/platform/game_analytics.js | 38 + src/js/platform/sound.js | 277 + src/js/platform/storage.js | 62 + src/js/platform/wrapper.js | 131 + src/js/profile/application_settings.js | 191 + src/js/profile/setting_types.js | 208 + src/js/savegame/savegame.js | 237 + src/js/savegame/savegame_interface.js | 108 + .../savegame/savegame_interface_registry.js | 35 + src/js/savegame/savegame_manager.js | 211 + src/js/savegame/savegame_serializer.js | 216 + src/js/savegame/savegame_typedefs.js | 35 + src/js/savegame/schemas/1000.js | 13 + src/js/savegame/schemas/1000.json | 5 + src/js/savegame/serialization.js | 330 + src/js/savegame/serialization_data_types.js | 1204 ++ src/js/savegame/serializer_internal.js | 180 + src/js/states/ingame.js | 443 + src/js/states/main_menu.js | 52 + src/js/states/preload.js | 238 + ...kground_animation_frame_emittter.worker.js | 16 + src/js/webworkers/compression.worker.js | 48 + tools/shape_generator/index.html | 72 + tools/shape_generator/index.js | 125 + tools/shape_generator/package.json | 13 + tools/shape_generator/yarn.lock | 152 + tsconfig.json | 62 + tslint.json | 23 + version | 1 + yarn.lock | 9580 +++++++++++ 304 files changed, 56031 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .prettierrc.yaml create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 buildutils.js create mode 100644 gulp/.gitattributes create mode 100644 gulp/.gitignore create mode 100644 gulp/babel-es6.config.js create mode 100644 gulp/babel.config.js create mode 100644 gulp/buildutils.js create mode 100644 gulp/bundle-loader.js create mode 100644 gulp/convert_atlas.js create mode 100644 gulp/cordova.js create mode 100644 gulp/css.js create mode 100644 gulp/docs.js create mode 100644 gulp/ftp.js create mode 100644 gulp/gulpfile.js create mode 100644 gulp/html.js create mode 100644 gulp/image-resources.js create mode 100644 gulp/js.js create mode 100644 gulp/jsconfig.json create mode 100644 gulp/loader.compressjson.js create mode 100644 gulp/loader.strip_block.js create mode 100644 gulp/package.json create mode 100644 gulp/sounds.js create mode 100644 gulp/standalone.js create mode 100644 gulp/tsconfig.json create mode 100644 gulp/webpack.config.js create mode 100644 gulp/webpack.production.config.js create mode 100644 gulp/yarn.lock create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 res/fonts/LouisGeorgeCafe.woff2 create mode 100644 res/logo.png create mode 100644 res/ui/building_tutorials/belt.png create mode 100644 res/ui/building_tutorials/cutter.png create mode 100644 res/ui/building_tutorials/miner.png create mode 100644 res/ui/building_tutorials/mixer.png create mode 100644 res/ui/building_tutorials/painter.png create mode 100644 res/ui/building_tutorials/rotater.png create mode 100644 res/ui/building_tutorials/splitter.png create mode 100644 res/ui/building_tutorials/stacker.png create mode 100644 res/ui/building_tutorials/trash.png create mode 100644 res/ui/building_tutorials/underground_belt.png create mode 100644 res/ui/dialog_bg_pattern.png create mode 100644 res/ui/icons/close.png create mode 100644 res/ui/icons/mouse_left.png create mode 100644 res/ui/icons/mouse_right.png create mode 100644 res/ui/icons/shop.png create mode 100644 res/ui/icons/statistics.png create mode 100644 res/ui/loading.svg create mode 100644 res/ui/locked_building.png create mode 100644 res/ui/menu_bg.noinline.jpg create mode 100644 res/ui/sad_ghost.png create mode 100644 res/ui/upgrades/belt.png create mode 100644 res/ui/upgrades/miner.png create mode 100644 res/ui/upgrades/painting.png create mode 100644 res/ui/upgrades/processors.png create mode 100644 res_raw/atlas.tps create mode 100644 res_raw/sounds/music/main_menu.wav create mode 100644 res_raw/sounds/music/theme_full.wav create mode 100644 res_raw/sounds/ui/dialog_error.wav create mode 100644 res_raw/sounds/ui/dialog_ok.wav create mode 100644 res_raw/sounds/ui/ui_click.wav create mode 100644 res_raw/sounds/ui/ui_error.wav create mode 100644 res_raw/sounds/ui/ui_swish_hide.wav create mode 100644 res_raw/sounds/ui/ui_swish_show.wav create mode 100644 res_raw/sprites/belt/forward_0.png create mode 100644 res_raw/sprites/belt/forward_1.png create mode 100644 res_raw/sprites/belt/forward_2.png create mode 100644 res_raw/sprites/belt/forward_3.png create mode 100644 res_raw/sprites/belt/forward_4.png create mode 100644 res_raw/sprites/belt/forward_5.png create mode 100644 res_raw/sprites/belt/left_0.png create mode 100644 res_raw/sprites/belt/left_1.png create mode 100644 res_raw/sprites/belt/left_2.png create mode 100644 res_raw/sprites/belt/left_3.png create mode 100644 res_raw/sprites/belt/left_4.png create mode 100644 res_raw/sprites/belt/left_5.png create mode 100644 res_raw/sprites/belt/right_0.png create mode 100644 res_raw/sprites/belt/right_1.png create mode 100644 res_raw/sprites/belt/right_2.png create mode 100644 res_raw/sprites/belt/right_3.png create mode 100644 res_raw/sprites/belt/right_4.png create mode 100644 res_raw/sprites/belt/right_5.png create mode 100644 res_raw/sprites/buildings/belt_left.png create mode 100644 res_raw/sprites/buildings/belt_right.png create mode 100644 res_raw/sprites/buildings/belt_top.png create mode 100644 res_raw/sprites/buildings/cutter.png create mode 100644 res_raw/sprites/buildings/hub.png create mode 100644 res_raw/sprites/buildings/miner.png create mode 100644 res_raw/sprites/buildings/mixer.png create mode 100644 res_raw/sprites/buildings/painter.png create mode 100644 res_raw/sprites/buildings/rotater.png create mode 100644 res_raw/sprites/buildings/splitter.png create mode 100644 res_raw/sprites/buildings/stacker.png create mode 100644 res_raw/sprites/buildings/trash.png create mode 100644 res_raw/sprites/buildings/underground_belt_entry.png create mode 100644 res_raw/sprites/buildings/underground_belt_exit.png create mode 100644 res_raw/sprites/debug/acceptor_slot.png create mode 100644 res_raw/sprites/debug/ejector_slot.png create mode 100644 res_raw/sprites/map_overview/belt_forward.png create mode 100644 res_raw/sprites/map_overview/belt_left.png create mode 100644 res_raw/sprites/map_overview/belt_right.png create mode 100644 res_raw/sprites/misc/slot_bad_arrow.png create mode 100644 res_raw/sprites/misc/slot_good_arrow.png create mode 100644 shapez.code-workspace create mode 100644 src/css/adinplay.scss create mode 100644 src/css/animations.scss create mode 100644 src/css/application_error.scss create mode 100644 src/css/common.scss create mode 100644 src/css/dynamic_ui.scss create mode 100644 src/css/game_state.scss create mode 100644 src/css/icons.scss create mode 100644 src/css/ingame_hud/beta_overlay.scss create mode 100644 src/css/ingame_hud/blur_overlay.scss create mode 100644 src/css/ingame_hud/building_placer.scss create mode 100644 src/css/ingame_hud/buildings_toolbar.scss create mode 100644 src/css/ingame_hud/dialogs.scss create mode 100644 src/css/ingame_hud/game_menu.scss create mode 100644 src/css/ingame_hud/keybindings_overlay.scss create mode 100644 src/css/ingame_hud/shop.scss create mode 100644 src/css/ingame_hud/unlock_notification.scss create mode 100644 src/css/main.scss create mode 100644 src/css/material_colors.scss create mode 100644 src/css/mixins.scss create mode 100644 src/css/states/ingame.scss create mode 100644 src/css/states/main_menu.scss create mode 100644 src/css/states/preload.scss create mode 100644 src/css/textual_game_state.scss create mode 100644 src/css/trigonometry.scss create mode 100644 src/css/variables.scss create mode 100644 src/html/index.html create mode 100644 src/js/application.js create mode 100644 src/js/core/animation_frame.js create mode 100644 src/js/core/assert.js create mode 100644 src/js/core/async_compression.js create mode 100644 src/js/core/atlas_definitions.js create mode 100644 src/js/core/background_resources_loader.js create mode 100644 src/js/core/buffer_maintainer.js create mode 100644 src/js/core/buffer_utils.js create mode 100644 src/js/core/builtins.js create mode 100644 src/js/core/cachebust.js create mode 100644 src/js/core/click_detector.js create mode 100644 src/js/core/config.js create mode 100644 src/js/core/dpi_manager.js create mode 100644 src/js/core/draw_parameters.js create mode 100644 src/js/core/draw_utils.js create mode 100644 src/js/core/error_handler.js create mode 100644 src/js/core/explained_result.js create mode 100644 src/js/core/factory.js create mode 100644 src/js/core/game_state.js create mode 100644 src/js/core/global_registries.js create mode 100644 src/js/core/globals.js create mode 100644 src/js/core/input_distributor.js create mode 100644 src/js/core/input_receiver.js create mode 100644 src/js/core/loader.js create mode 100644 src/js/core/logging.js create mode 100644 src/js/core/lzstring.js create mode 100644 src/js/core/perlin_noise.js create mode 100644 src/js/core/perlin_noise_data.js create mode 100644 src/js/core/polyfills.js create mode 100644 src/js/core/query_parameters.js create mode 100644 src/js/core/read_write_proxy.js create mode 100644 src/js/core/rectangle.js create mode 100644 src/js/core/request_channel.js create mode 100644 src/js/core/rng.js create mode 100644 src/js/core/sensitive_utils.encrypt.js create mode 100644 src/js/core/signal.js create mode 100644 src/js/core/singleton_factory.js create mode 100644 src/js/core/sprites.js create mode 100644 src/js/core/state_manager.js create mode 100644 src/js/core/tracked_state.js create mode 100644 src/js/core/utils.js create mode 100644 src/js/core/vector.js create mode 100644 src/js/game/automatic_save.js create mode 100644 src/js/game/base_item.js create mode 100644 src/js/game/buildings/belt_base.js create mode 100644 src/js/game/buildings/cutter.js create mode 100644 src/js/game/buildings/hub.js create mode 100644 src/js/game/buildings/miner.js create mode 100644 src/js/game/buildings/mixer.js create mode 100644 src/js/game/buildings/painter.js create mode 100644 src/js/game/buildings/rotater.js create mode 100644 src/js/game/buildings/splitter.js create mode 100644 src/js/game/buildings/stacker.js create mode 100644 src/js/game/buildings/trash.js create mode 100644 src/js/game/buildings/underground_belt.js create mode 100644 src/js/game/camera.js create mode 100644 src/js/game/canvas_click_interceptor.js create mode 100644 src/js/game/colors.js create mode 100644 src/js/game/component.js create mode 100644 src/js/game/component_registry.js create mode 100644 src/js/game/components/belt.js create mode 100644 src/js/game/components/hub.js create mode 100644 src/js/game/components/item_acceptor.js create mode 100644 src/js/game/components/item_ejector.js create mode 100644 src/js/game/components/item_processor.js create mode 100644 src/js/game/components/miner.js create mode 100644 src/js/game/components/replaceable_map_entity.js create mode 100644 src/js/game/components/static_map_entity.js create mode 100644 src/js/game/components/underground_belt.js create mode 100644 src/js/game/components/unremovable.js create mode 100644 src/js/game/core.js create mode 100644 src/js/game/entity.js create mode 100644 src/js/game/entity_components.js create mode 100644 src/js/game/entity_manager.js create mode 100644 src/js/game/game_loading_overlay.js create mode 100644 src/js/game/game_system.js create mode 100644 src/js/game/game_system_manager.js create mode 100644 src/js/game/game_system_with_filter.js create mode 100644 src/js/game/hub_goals.js create mode 100644 src/js/game/hud/base_hud_part.js create mode 100644 src/js/game/hud/dynamic_dom_attach.js create mode 100644 src/js/game/hud/hud.js create mode 100644 src/js/game/hud/parts/beta_overlay.js create mode 100644 src/js/game/hud/parts/building_placer.js create mode 100644 src/js/game/hud/parts/buildings_toolbar.js create mode 100644 src/js/game/hud/parts/game_menu.js create mode 100644 src/js/game/hud/parts/keybinding_overlay.js create mode 100644 src/js/game/hud/parts/processing_overlay.js create mode 100644 src/js/game/hud/parts/shop.js create mode 100644 src/js/game/hud/parts/unlock_notification.js create mode 100644 src/js/game/item_registry.js create mode 100644 src/js/game/items/color_item.js create mode 100644 src/js/game/items/shape_item.js create mode 100644 src/js/game/key_action_mapper.js create mode 100644 src/js/game/logic.js create mode 100644 src/js/game/map.js create mode 100644 src/js/game/map_chunk.js create mode 100644 src/js/game/map_chunk_view.js create mode 100644 src/js/game/map_view.js create mode 100644 src/js/game/meta_building.js create mode 100644 src/js/game/meta_building_registry.js create mode 100644 src/js/game/root.js create mode 100644 src/js/game/shape_definition.js create mode 100644 src/js/game/shape_definition_manager.js create mode 100644 src/js/game/sound_proxy.js create mode 100644 src/js/game/systems/belt.js create mode 100644 src/js/game/systems/hub.js create mode 100644 src/js/game/systems/item_ejector.js create mode 100644 src/js/game/systems/item_processor.js create mode 100644 src/js/game/systems/map_resources.js create mode 100644 src/js/game/systems/miner.js create mode 100644 src/js/game/systems/static_map_entity.js create mode 100644 src/js/game/systems/underground_belt.js create mode 100644 src/js/game/time/base_game_speed.js create mode 100644 src/js/game/time/fast_forward_game_speed.js create mode 100644 src/js/game/time/game_time.js create mode 100644 src/js/game/time/paused_game_speed.js create mode 100644 src/js/game/time/regular_game_speed.js create mode 100644 src/js/game/tutorial_goals.js create mode 100644 src/js/game/upgrades.js create mode 100644 src/js/game_analytics.d.ts create mode 100644 src/js/globals.d.ts create mode 100644 src/js/main.js create mode 100644 src/js/platform/ad_provider.js create mode 100644 src/js/platform/ad_providers/adinplay.js create mode 100644 src/js/platform/ad_providers/no_ad_provider.js create mode 100644 src/js/platform/analytics.js create mode 100644 src/js/platform/browser/embed_provider.js create mode 100644 src/js/platform/browser/embed_providers/armorgames.js create mode 100644 src/js/platform/browser/embed_providers/crazygames.js create mode 100644 src/js/platform/browser/embed_providers/gamedistribution.js create mode 100644 src/js/platform/browser/embed_providers/iogames_space.js create mode 100644 src/js/platform/browser/embed_providers/kongregate.js create mode 100644 src/js/platform/browser/embed_providers/miniclip.js create mode 100644 src/js/platform/browser/embed_providers/shapezio_website.js create mode 100644 src/js/platform/browser/game_analytics.js create mode 100644 src/js/platform/browser/google_analytics.js create mode 100644 src/js/platform/browser/sound.js create mode 100644 src/js/platform/browser/storage.js create mode 100644 src/js/platform/browser/wrapper.js create mode 100644 src/js/platform/game_analytics.js create mode 100644 src/js/platform/sound.js create mode 100644 src/js/platform/storage.js create mode 100644 src/js/platform/wrapper.js create mode 100644 src/js/profile/application_settings.js create mode 100644 src/js/profile/setting_types.js create mode 100644 src/js/savegame/savegame.js create mode 100644 src/js/savegame/savegame_interface.js create mode 100644 src/js/savegame/savegame_interface_registry.js create mode 100644 src/js/savegame/savegame_manager.js create mode 100644 src/js/savegame/savegame_serializer.js create mode 100644 src/js/savegame/savegame_typedefs.js create mode 100644 src/js/savegame/schemas/1000.js create mode 100644 src/js/savegame/schemas/1000.json create mode 100644 src/js/savegame/serialization.js create mode 100644 src/js/savegame/serialization_data_types.js create mode 100644 src/js/savegame/serializer_internal.js create mode 100644 src/js/states/ingame.js create mode 100644 src/js/states/main_menu.js create mode 100644 src/js/states/preload.js create mode 100644 src/js/webworkers/background_animation_frame_emittter.worker.js create mode 100644 src/js/webworkers/compression.worker.js create mode 100644 tools/shape_generator/index.html create mode 100644 tools/shape_generator/index.js create mode 100644 tools/shape_generator/package.json create mode 100644 tools/shape_generator/yarn.lock create mode 100644 tsconfig.json create mode 100644 tslint.json create mode 100644 version create mode 100644 yarn.lock diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..d899f655 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.wav filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..230ccaf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,111 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + + +# Buildfiles +build + + +res_built diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 00000000..643afe72 --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,11 @@ +# .prettierrc or .prettierrc.yaml +trailingComma: "es5" +tabWidth: 4 +semi: true +singleQuote: false +printWidth: 110 +useTabs: false +quoteProps: "consistent" +bracketSpacing: true +arrowParens: avoid +endOfLine: "lf" diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..335f886a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode" +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..ce84173c --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# shapez.io +shapez.io source code diff --git a/buildutils.js b/buildutils.js new file mode 100644 index 00000000..5342650f --- /dev/null +++ b/buildutils.js @@ -0,0 +1,44 @@ +const glob = require("glob"); +const execSync = require("child_process").execSync; +const trim = require("trim"); +const fs = require("fs"); +const path = require("path"); + +module.exports = { + getRevision: function (useLast = false) { + const commitHash = execSync("git rev-parse --short " + (useLast ? "HEAD^1" : "HEAD")).toString("ascii"); + return commitHash.replace(/^\s+|\s+$/g, ""); + }, + getAllResourceImages() { + return glob + .sync("res/**/*.@(png|svg|jpg)", { cwd: ".." }) + .map((f) => f.replace(/^res\//gi, "")) + .filter((f) => { + if (f.indexOf("ui") >= 0) { + // We drop all ui images except for the noinline ones + return f.indexOf("noinline") >= 0; + } + return true; + }); + }, + + getAllAtlasImages() { + return glob.sync("res_built/atlas/*.png", { cwd: ".." }).map((s) => s.replace("res_built/atlas/", "res/")); + }, + + getAllSounds() { + return glob.sync("res_built/sounds/**/*.mp3", { cwd: ".." }).map((s) => s.replace("res_built/sounds/", "res/sounds/")); + }, + + getVersion() { + return trim(fs.readFileSync(path.join(__dirname, "version")).toString()); + }, + + /** + * @param {string} url + * @param {string} commitHash + */ + cachebust(url, commitHash) { + return "/v/" + commitHash + "/" + url; + }, +}; diff --git a/gulp/.gitattributes b/gulp/.gitattributes new file mode 100644 index 00000000..d899f655 --- /dev/null +++ b/gulp/.gitattributes @@ -0,0 +1 @@ +*.wav filter=lfs diff=lfs merge=lfs -text diff --git a/gulp/.gitignore b/gulp/.gitignore new file mode 100644 index 00000000..efd974cc --- /dev/null +++ b/gulp/.gitignore @@ -0,0 +1 @@ +additional_build_files diff --git a/gulp/babel-es6.config.js b/gulp/babel-es6.config.js new file mode 100644 index 00000000..e687f070 --- /dev/null +++ b/gulp/babel-es6.config.js @@ -0,0 +1,48 @@ +module.exports = function (api) { + api.cache(true); + const presets = [ + [ + "@babel/preset-env", + { + targets: "> 5%", + useBuiltIns: "usage", + corejs: 3, + loose: true, + spec: false, + modules: "auto", + // debug: true + }, + ], + ]; + const plugins = [ + "closure-elimination", + // var is faster than let and const! + [ + "@babel/plugin-transform-block-scoping", + { + throwIfClosureRequired: false, + }, + ], + [ + "@babel/plugin-transform-classes", + { + loose: true, + }, + ], + ]; + return { + presets, + plugins, + highlightCode: true, + sourceType: "module", + sourceMaps: false, + parserOpts: {}, + only: ["../src/js"], + generatorOpts: { + retainLines: false, + compact: true, + minified: true, + comments: true, + }, + }; +}; diff --git a/gulp/babel.config.js b/gulp/babel.config.js new file mode 100644 index 00000000..0552a94b --- /dev/null +++ b/gulp/babel.config.js @@ -0,0 +1,41 @@ +module.exports = function (api) { + api.cache(true); + const presets = [ + [ + "@babel/preset-env", + { + targets: "android >= 4.4.4", + useBuiltIns: "usage", + corejs: 3, + loose: true, + spec: false, + modules: "auto", + // debug: true + }, + ], + ]; + const plugins = [ + "closure-elimination", + [ + "@babel/plugin-transform-classes", + { + loose: true, + }, + ], + ]; + return { + presets, + plugins, + highlightCode: true, + sourceType: "module", + sourceMaps: false, + parserOpts: {}, + only: ["../src/js"], + generatorOpts: { + retainLines: false, + compact: true, + minified: true, + comments: true, + }, + }; +}; diff --git a/gulp/buildutils.js b/gulp/buildutils.js new file mode 100644 index 00000000..1fb2a9a3 --- /dev/null +++ b/gulp/buildutils.js @@ -0,0 +1,50 @@ +const glob = require("glob"); +const execSync = require("child_process").execSync; +const trim = require("trim"); +const fs = require("fs"); +const path = require("path"); + +module.exports = { + getRevision: function (useLast = false) { + const commitHash = execSync("git rev-parse --short " + (useLast ? "HEAD^1" : "HEAD")).toString( + "ascii" + ); + return commitHash.replace(/^\s+|\s+$/g, ""); + }, + getAllResourceImages() { + return glob + .sync("res/**/*.@(png|svg|jpg)", { cwd: ".." }) + .map(f => f.replace(/^res\//gi, "")) + .filter(f => { + if (f.indexOf("ui") >= 0) { + // We drop all ui images except for the noinline ones + return f.indexOf("noinline") >= 0; + } + return true; + }); + }, + + getAllAtlasImages() { + return glob + .sync("res_built/atlas/*.png", { cwd: ".." }) + .map(s => s.replace("res_built/atlas/", "res/")); + }, + + getAllSounds() { + return glob + .sync("res_built/sounds/**/*.mp3", { cwd: ".." }) + .map(s => s.replace("res_built/sounds/", "res/sounds/")); + }, + + getVersion() { + return trim(fs.readFileSync(path.join(__dirname, "..", "version")).toString()); + }, + + /** + * @param {string} url + * @param {string} commitHash + */ + cachebust(url, commitHash) { + return "/v/" + commitHash + "/" + url; + }, +}; diff --git a/gulp/bundle-loader.js b/gulp/bundle-loader.js new file mode 100644 index 00000000..d8bb8c24 --- /dev/null +++ b/gulp/bundle-loader.js @@ -0,0 +1,112 @@ +/** + * ES6 Bundle Loader + * + * Attempts to load the game code, and if that fails tries with the transpiled + * version. Also handles errors during load. + */ + +(function () { + var loadTimeout = null; + var callbackDone = false; + + // Catch load errors + + function errorHandler(event, source, lineno, colno, error) { + console.error("👀 Init Error:", event, source, lineno, colno, error); + var element = document.createElement("div"); + element.style.position = "fixed"; + element.style.top = "0"; + element.style.right = "0"; + element.style.bottom = "0"; + element.style.left = "0"; + element.style.zIndex = "29999"; + element.style.backgroundColor = "#222429"; + element.style.display = "flex"; + element.style.justifyContent = "center"; + element.style.alignItems = "center"; + + var inner = document.createElement("div"); + inner.style.color = "#fff"; + inner.style.fontFamily = "GameFont, sans-serif"; + inner.style.fontSize = "15px"; + inner.style.padding = "30px"; + inner.style.textAlign = "center"; + element.appendChild(inner); + + var heading = document.createElement("h3"); + heading.style.color = "#ef5072"; + heading.innerText = "Error"; + heading.style.marginBottom = "40px"; + heading.style.fontSize = "45px"; + inner.appendChild(heading); + + var content = document.createElement("p"); + content.style.color = "#eee"; + content.innerText = error || (event && event.message) || event || "Unknown Error"; + inner.appendChild(content); + + if (source) { + var sourceElement = document.createElement("p"); + sourceElement.style.color = "#777"; + sourceElement.innerText = sourceElement + ":" + lineno + ":" + colno; + inner.appendChild(sourceElement); + } + + document.documentElement.appendChild(element); + } + window.addEventListener("error", errorHandler); + window.addEventListener("unhandledrejection", errorHandler); + + function makeJsTag(src, integrity) { + var script = document.createElement("script"); + script.src = src; + script.type = "text/javascript"; + script.charset = "utf-8"; + script.defer = true; + if (integrity) { + script.setAttribute("integrity", integrity); + } + return script; + } + + function loadFallbackJs(error) { + console.warn("👀 ES6 Script not supported, loading transpiled code."); + console.warn("👀 Error was:", error); + var scriptTransp = makeJsTag(bundleSrcTranspiled, bundleIntegrityTranspiled); + scriptTransp.addEventListener("error", scriptFail); + scriptTransp.addEventListener("load", onJsLoaded); + document.head.appendChild(scriptTransp); + } + + function scriptFail(error) { + console.error("👀 Failed to load bundle!"); + console.error("👀 Error was:", error); + throw new Error("Core load failed."); + } + + function expectJsParsed() { + if (!callbackDone) { + console.error("👀 Got no core callback"); + throw new Error("Core thread failed to respond within time."); + } + } + + function onJsLoaded() { + console.log("👀 Core loaded at", Math.floor(performance.now()), "ms"); + loadTimeout = setTimeout(expectJsParsed, 15000); + window.removeEventListener("error", errorHandler); + window.removeEventListener("unhandledrejection", errorHandler); + } + + window.coreThreadLoadedCb = function () { + console.log("👀 Core responded at", Math.floor(performance.now()), "ms"); + clearTimeout(loadTimeout); + loadTimeout = null; + callbackDone = true; + }; + + var scriptEs6 = makeJsTag(bundleSrc, bundleIntegrity); + scriptEs6.addEventListener("error", loadFallbackJs); + scriptEs6.addEventListener("load", onJsLoaded); + document.head.appendChild(scriptEs6); +})(); diff --git a/gulp/convert_atlas.js b/gulp/convert_atlas.js new file mode 100644 index 00000000..8e0ba990 --- /dev/null +++ b/gulp/convert_atlas.js @@ -0,0 +1,96 @@ +// Converts the atlas description to a JSON file + +String.prototype.replaceAll = function (search, replacement) { + var target = this; + return target.split(search).join(replacement); +}; + +const fs = require("fs"); +const path = require("path"); + +const folder = path.join(__dirname, "res_built", "atlas"); +const files = fs.readdirSync(folder); + +const metadata = []; + +files.forEach(filename => { + if (filename.endsWith(".atlas")) { + // Read content + + const content = fs.readFileSync(path.join(folder, filename), "ascii"); + + const lines = content.replaceAll("\r", "").replaceAll("\t", "").split("\n"); + + const readLine = () => lines.splice(0, 1)[0]; + const readValue = () => readLine().replaceAll(" ", "").split(":")[1]; + const readVector = () => + readValue() + .split(",") + .map(d => parseInt(d, 10)); + + let maxAtlas = 100; + + atlasLoop: while (maxAtlas-- > 0 && lines.length >= 7) { + const result = { + entries: [], + }; + + // Extract header + const header_fileStart = readLine(); + const header_fileName = readLine(); + const header_size = readVector(); + const header_format = readLine(); + const header_filter = readLine(); + const header_repeat = readLine(); + const baseAtlasName = header_fileName.replace(".png", ""); + + // Store size + result.size = header_size; + + lineLoop: while (lines.length >= 7) { + const entryResult = {}; + + const nextLine = lines[0]; + if (nextLine.length === 0) { + break; + } + + const entry_fileName = readLine() + ".png"; + + const entry_rotate = readValue(); + const entry_xy = readVector(); + const entry_size = readVector(); + const entry_orig = readVector(); + const entry_offset = readVector(); + const entry_index = readValue(); + + entryResult.filename = entry_fileName; + entryResult.xy = entry_xy; + entryResult.size = entry_size; + // entryResult.offset = entry_offset; + + entryResult.origSize = entry_orig; + + let offset = [0, 0]; + + // GDX Atlas packer uses 1 - y coordinates. This sucks, and we have to convert it + offset[0] = entry_offset[0]; + offset[1] = entry_orig[1] - entry_offset[1] - entry_size[1]; + + entryResult.offset = offset; + + result.entries.push(entryResult); + } + + console.log("[Atlas]", "'" + baseAtlasName + "'", "has", result.entries.length, "entries"); + // fs.writeFileSync(path.join(folder, baseAtlasName + ".gen.json"), JSON.stringify(result)); + + metadata.push({ + filename: baseAtlasName + ".png", + entries: result, + }); + } + } +}); + +fs.writeFileSync(path.join(folder, "meta.gen.json"), JSON.stringify(metadata, null, 4)); diff --git a/gulp/cordova.js b/gulp/cordova.js new file mode 100644 index 00000000..408691cf --- /dev/null +++ b/gulp/cordova.js @@ -0,0 +1,153 @@ +const path = require("path"); +const fs = require("fs"); +const buildUtils = require("./buildutils"); + +export function gulptasksCordova($, gulp, buildFolder) { + const cdvRes = path.join("..", "..", "res"); + + // Cleans up the app assets + // Removes all temporary folders used while optimizing the assets + gulp.task("cleanupAppAssetsBuiltFolder", () => { + return gulp.src(path.join(cdvRes, "built"), { read: false }).pipe($.clean({ force: true })); + }); + + // Optimizes all built assets + gulp.task("optimizeBuiltAppAssets", () => { + return gulp + .src(path.join(cdvRes, "built", "**", "*.png")) + .pipe($.flatten()) + .pipe($.imagemin([$.imagemin.optipng({ optimizationLevel: 1 })])) + .pipe(gulp.dest(path.join(cdvRes, "built"))); + }); + + // Scales the icon resources + gulp.task("scaleIconIos", async () => { + const sizes = [ + 180, + 60, + 120, + 76, + 152, + 40, + 80, + 57, + 114, + 72, + 144, + 167, + 29, + 58, + 87, + 50, + 100, + 167, + 20, + 1024, + 24, + 48, + 55, + 172, + 196, + ]; + for (let i = 0; i < sizes.length; ++i) { + const size = sizes[i]; + console.log("Scaling icon to", size, "x", size); + const img = await $.jimp.read(path.join(cdvRes, "ios", "icon-prefab.png")); + await img.resize(size, size).write(path.join(cdvRes, "built", "ios", "icon@" + size + ".png")); + } + }); + + gulp.task("copyOtherIosResources", () => { + return gulp + .src(path.join(cdvRes, "ios", "splash-prefab.png")) + .pipe($.rename("Default@2x~universal~anyany.png")) + .pipe(gulp.dest(path.join(cdvRes, "built", "ios"))); + }); + + gulp.task("prepareIosRes", ["scaleIconIos", "copyOtherIosResources"]); + + gulp.task("copyAndroidResources", () => { + return gulp + .src(path.join(cdvRes, "android", "**", "*.*")) + .pipe(gulp.dest(path.join(cdvRes, "built", "android"))); + }); + + gulp.task("prepareAndroidRes", ["copyAndroidResources"]); + + gulp.task("prepareCordovaAssets", cb => { + return $.sequence( + "cleanupAppAssetsBuiltFolder", + ["prepareIosRes", "prepareAndroidRes"], + "optimizeBuiltAppAssets" + )(cb); + }); + + // Patches the config.xml by replacing the app id to app_beta + + gulp.task("patchConfigXML", () => { + const configUrl = path.join("..", "..", "config.xml"); + let configContent = fs.readFileSync(configUrl).toString(); + const version = buildUtils.getVersion(); + configContent = configContent.replace("%VERSION%", version); + configContent = configContent.replace(' id="io.shapez.app" ', ' id="io.shapez.app_beta" '); + configContent = configContent.replace("Shapez.io", "Shapez.io BETA"); + fs.writeFileSync(configUrl, configContent); + }); + + gulp.task("patchConfigXMLChangeStagingToProd", () => { + const configUrl = path.join("..", "..", "config.xml"); + let configContent = fs.readFileSync(configUrl).toString(); + configContent = configContent.replace(' id="io.shapez.app_beta" ', ' id="io.shapez.app" '); + configContent = configContent.replace("Shapez.io BETA", "Shapez.io"); + fs.writeFileSync(configUrl, configContent); + }); + + // Triggers a new build on phonegap + gulp.task("triggerPhonegapBuild", () => { + return gulp + .src("src/html/", { dot: false }) + .pipe( + $.phonegapBuild({ + isRepository: true, + appId: "3339820", + platforms: ["android", "ios"], + user: { + token: process.env.SHAPEZ_CLI_PHONEGAP_KEY, + }, + }) + ) + .pipe( + $.phonegapBuild({ + isRepository: true, + appId: "3537816", + platforms: ["android", "ios"], + user: { + token: process.env.SHAPEZ_CLI_PHONEGAP_KEY, + }, + }) + ); + }); + + // gulp.task("pushToStagingRepo", (cb) => { + // var cmd = spawn('../push-pgb.sh', ['https://TOKEN@github.com/tobspr/shapezapp-cordova-buildslave.git'], + // { stdio: 'inherit', stdout: 'inherit', stderr: 'inherit', shell: true }); + // cmd.on('close', function (code) { + // console.log('push staging exited with code ' + code + " / " + cmd.stdout + " / " + cmd.stderr); + // cb(code); + // }); + + // }); + + // gulp.task("pushToProdRepo", (cb) => { + // var cmd = spawn('../push-pgb.sh', ['https://TOKEN@github.com/tobspr/shapezapp-cordova-buildslave-release.git'], + // { stdio: 'inherit', stdout: 'inherit', stderr: 'inherit', shell: true }); + // cmd.on('close', function (code) { + // console.log('push prod exited with code ' + code + " / " + cmd.stdout + " / " + cmd.stderr); + // cb(code); + // }); + // }); +} + +module.exports = { + gulptasksCordova, +}; diff --git a/gulp/css.js b/gulp/css.js new file mode 100644 index 00000000..729d0432 --- /dev/null +++ b/gulp/css.js @@ -0,0 +1,101 @@ +const path = require("path"); +const buildUtils = require("./buildutils"); + +function gulptasksCSS($, gulp, buildFolder, browserSync) { + // The assets plugin copies the files + const commitHash = buildUtils.getRevision(); + const postcssAssetsPlugin = cachebust => + $.postcssAssets({ + loadPaths: [path.join(buildFolder, "res", "ui")], + basePath: buildFolder, + baseUrl: ".", + cachebuster: cachebust + ? (filePath, urlPathname) => ({ + pathname: buildUtils.cachebust(urlPathname, commitHash), + }) + : "", + }); + + // Postcss configuration + const postcssPlugins = (prod, { cachebust = false }) => { + const plugins = [postcssAssetsPlugin(cachebust)]; + if (prod) { + plugins.unshift( + $.postcssUnprefix(), + $.postcssPresetEnv({ + browsers: ["> 0.1%"], + }) + ); + + plugins.push( + $.cssMqpacker({ + sort: true, + }), + $.cssnano({ + preset: [ + "advanced", + { + cssDeclarationSorter: false, + discardUnused: true, + mergeIdents: false, + reduceIdents: true, + zindex: true, + }, + ], + }), + $.postcssRoundSubpixels() + ); + } + return plugins; + }; + + // Performs linting on css + gulp.task("css.lint", () => { + return gulp + .src(["../src/css/**/*.scss"]) + .pipe($.sassLint({ configFile: ".sasslint.yml" })) + .pipe($.sassLint.format()) + .pipe($.sassLint.failOnError()); + }); + + // Builds the css in dev mode + gulp.task("css.dev", () => { + return gulp + .src(["../src/css/main.scss"]) + .pipe($.plumber()) + .pipe($.sass.sync().on("error", $.sass.logError)) + .pipe($.postcss(postcssPlugins(false, {}))) + .pipe(gulp.dest(buildFolder)) + .pipe(browserSync.stream()); + }); + + // Builds the css in production mode (=minified) + gulp.task("css.prod", () => { + return ( + gulp + .src("../src/css/main.scss", { cwd: __dirname }) + .pipe($.plumber()) + .pipe($.sass.sync({ outputStyle: "compressed" }).on("error", $.sass.logError)) + .pipe($.postcss(postcssPlugins(true, { cachebust: true }))) + // .pipe($.cssbeautify()) + .pipe(gulp.dest(buildFolder)) + ); + }); + + // Builds the css in production mode (=minified), without cachebusting + gulp.task("css.prod-standalone", () => { + return ( + gulp + .src("../src/css/main.scss", { cwd: __dirname }) + .pipe($.plumber()) + .pipe($.sass.sync({ outputStyle: "compressed" }).on("error", $.sass.logError)) + .pipe($.postcss(postcssPlugins(true, { cachebust: false }))) + // .pipe($.cssbeautify()) + .pipe(gulp.dest(buildFolder)) + ); + }); +} + +module.exports = { + gulptasksCSS, +}; diff --git a/gulp/docs.js b/gulp/docs.js new file mode 100644 index 00000000..68e3f0ea --- /dev/null +++ b/gulp/docs.js @@ -0,0 +1,38 @@ +const path = require("path"); +const fs = require("fs"); + +function gulptasksDocs($, gulp, buildFolder) { + gulp.task("docs.convertJsToTs", () => { + return gulp + .src(path.join("..", "src", "js", "**", "*.js")) + .pipe( + $.rename(path => { + path.extname = ".ts"; + }) + ) + .pipe(gulp.dest(path.join("..", "tsc_temp"))); + }); + + gulp.task("docs.copyTsconfigForHints", () => { + const src = fs.readFileSync(path.join("..", "src", "js", "tsconfig.json")).toString(); + const baseConfig = JSON.parse($.stripJsonComments(src)); + + baseConfig.allowJs = false; + baseConfig.checkJs = false; + baseConfig.declaration = true; + baseConfig.noEmit = false; + baseConfig.strict = false; + baseConfig.strictFunctionTypes = false; + baseConfig.strictBindCallApply = false; + baseConfig.alwaysStrict = false; + baseConfig.composite = true; + baseConfig.outFile = "bundled-ts.js"; + fs.writeFileSync(path.join("..", "tsc_temp", "tsconfig.json"), JSON.stringify(baseConfig)); + }); + + gulp.task("main.prepareDocs", $.sequence("docs.convertJsToTs", "docs.copyTsconfigForHints")); +} + +module.exports = { + gulptasksDocs, +}; diff --git a/gulp/ftp.js b/gulp/ftp.js new file mode 100644 index 00000000..2ab905e2 --- /dev/null +++ b/gulp/ftp.js @@ -0,0 +1,104 @@ +const path = require("path"); +const fs = require("fs"); + +const buildUtils = require("./buildutils"); + +function gulptasksFTP($, gulp, buildFolder) { + const commitHash = buildUtils.getRevision(); + + // Write the "commit.txt" file + gulp.task("ftp.writeVersion", () => { + fs.writeFileSync( + path.join(buildFolder, "version.json"), + JSON.stringify( + { + commit: buildUtils.getRevision(), + appVersion: buildUtils.getVersion(), + buildTime: new Date().getTime(), + }, + null, + 4 + ) + ); + }); + + // Copies additional files (like .htaccess) which should be deployed when running + // on the ftp server + // gulp.task("ftp.copyServerFiles", () => { + // return gulp.src(["../ftp_upload/*.*", "../ftp_upload/.*", "../ftp_upload/*"]) + // .pipe(gulp.dest(buildFolder)); + // }); + + const gameSrcGlobs = [ + path.join(buildFolder, "**/*.*"), + path.join(buildFolder, "**/.*"), + path.join(buildFolder, "**/*"), + path.join(buildFolder, "!**/index.html"), + ]; + + gulp.task("ftp.upload.staging.game", () => { + return gulp + .src(gameSrcGlobs, { base: buildFolder }) + .pipe( + $.rename(pth => { + pth.dirname = path.join("v", commitHash, pth.dirname); + }) + ) + .pipe( + $.sftp({ + host: process.env.SHAPEZ_CLI_SERVER_HOST, + user: process.env.SHAPEZ_CLI_STAGING_FTP_USER, + pass: process.env.SHAPEZ_CLI_STAGING_FTP_PW, + }) + ); + }); + + gulp.task("ftp.upload.staging.indexHtml", () => { + return gulp.src(path.join(buildFolder, "index.html"), { base: buildFolder }).pipe( + $.sftp({ + host: process.env.SHAPEZ_CLI_SERVER_HOST, + user: process.env.SHAPEZ_CLI_STAGING_FTP_USER, + pass: process.env.SHAPEZ_CLI_STAGING_FTP_PW, + }) + ); + }); + + gulp.task("ftp.upload.staging", cb => { + $.sequence("ftp.writeVersion", "ftp.upload.staging.game", "ftp.upload.staging.indexHtml")(cb); + }); + + gulp.task("ftp.upload.prod.game", () => { + return gulp + .src(gameSrcGlobs, { base: buildFolder }) + .pipe( + $.rename(pth => { + pth.dirname = path.join("v", commitHash, pth.dirname); + }) + ) + .pipe( + $.sftp({ + host: process.env.SHAPEZ_CLI_SERVER_HOST, + user: process.env.SHAPEZ_CLI_LIVE_FTP_USER, + pass: process.env.SHAPEZ_CLI_LIVE_FTP_PW, + }) + ); + }); + + gulp.task("ftp.upload.prod.indexHtml", () => { + return gulp.src(path.join(buildFolder, "index.html"), { base: buildFolder }).pipe( + $.sftp({ + host: process.env.SHAPEZ_CLI_SERVER_HOST, + user: process.env.SHAPEZ_CLI_LIVE_FTP_USER, + pass: process.env.SHAPEZ_CLI_LIVE_FTP_PW, + }) + ); + }); + + gulp.task("ftp.upload.prod", cb => { + $.sequence("ftp.writeVersion", "ftp.upload.prod.game", "ftp.upload.prod.indexHtml")(cb); + }); +} + +module.exports = { + gulptasksFTP, +}; diff --git a/gulp/gulpfile.js b/gulp/gulpfile.js new file mode 100644 index 00000000..72d5b699 --- /dev/null +++ b/gulp/gulpfile.js @@ -0,0 +1,274 @@ +/* eslint-disable */ + +require("colors"); + +const gulp = require("gulp"); +const browserSync = require("browser-sync").create({}); +const path = require("path"); +const deleteEmpty = require("delete-empty"); +const execSync = require("child_process").execSync; + +// Load other plugins dynamically +const $ = require("gulp-load-plugins")({ + scope: ["devDependencies"], + pattern: "*", +}); + +// Check environment variables + +const envVars = [ + "SHAPEZ_CLI_SERVER_HOST", + // "SHAPEZ_CLI_PHONEGAP_KEY", + "SHAPEZ_CLI_STAGING_FTP_USER", + "SHAPEZ_CLI_STAGING_FTP_PW", + "SHAPEZ_CLI_LIVE_FTP_USER", + "SHAPEZ_CLI_LIVE_FTP_PW", + // "SHAPEZ_CLI_TRANSREPORT_FTP_USER", + // "SHAPEZ_CLI_TRANSREPORT_FTP_PW", +]; + +for (let i = 0; i < envVars.length; ++i) { + if (!process.env[envVars[i]]) { + console.warn("Please set", envVars[i]); + // process.exit(1); + } +} + +const baseDir = path.join(__dirname, ".."); +const buildFolder = path.join(baseDir, "build"); + +const imgres = require("./image-resources"); +imgres.gulptasksImageResources($, gulp, buildFolder); + +const css = require("./css"); +css.gulptasksCSS($, gulp, buildFolder, browserSync); + +const sounds = require("./sounds"); +sounds.gulptasksSounds($, gulp, buildFolder); + +const js = require("./js"); +js.gulptasksJS($, gulp, buildFolder, browserSync); + +const html = require("./html"); +html.gulptasksHTML($, gulp, buildFolder, browserSync); + +const ftp = require("./ftp"); +ftp.gulptasksFTP($, gulp, buildFolder); + +const docs = require("./docs"); +docs.gulptasksDocs($, gulp, buildFolder); + +const standalone = require("./standalone"); +standalone.gulptasksStandalone($, gulp, buildFolder); + +// FIXME +// const cordova = require("./cordova"); +// cordova.gulptasksCordova($, gulp, buildFolder); + +///////////////////// BUILD TASKS ///////////////////// + +// Cleans up everything +gulp.task("utils.cleanup", () => { + return gulp.src(buildFolder, { read: false }).pipe($.clean({ force: true })); +}); + +// Requires no uncomitted files +gulp.task("utils.requireCleanWorkingTree", cb => { + const output = $.trim(execSync("git status -su").toString("ascii")); + if (output.length > 0) { + console.error("\n\nYou have unstaged changes, please commit everything first!"); + process.exit(1); + } + cb(); +}); + +gulp.task("utils.copyAdditionalBuildFiles", cb => { + const additionalFolder = path.join("additional_build_files"); + const additionalSrcGlobs = [ + path.join(additionalFolder, "**/*.*"), + path.join(additionalFolder, "**/.*"), + path.join(additionalFolder, "**/*"), + ]; + + return gulp.src(additionalSrcGlobs).pipe(gulp.dest(buildFolder)); +}); + +// Starts a webserver on the built directory (useful for testing prod build) +gulp.task("main.webserver", () => { + return gulp.src(buildFolder).pipe( + $.webserver({ + livereload: { + enable: true, + }, + directoryListing: false, + open: true, + port: 3005, + }) + ); +}); + +function serve({ standalone }) { + browserSync.init({ + server: buildFolder, + port: 3005, + ghostMode: { + clicks: false, + scroll: false, + location: false, + forms: false, + }, + logLevel: "info", + logPrefix: "BS", + online: false, + xip: false, + notify: false, + reloadDebounce: 100, + reloadOnRestart: true, + watchEvents: ["add", "change"], + }); + + // Watch .scss files, those trigger a css rebuild + gulp.watch(["../src/**/*.scss"], ["css.dev"]); + + // Watch .html files, those trigger a html rebuild + gulp.watch("../src/**/*.html", [standalone ? "html.standalone-dev" : "html.dev"]); + + // Watch sound files + // gulp.watch(["../res_raw/sounds/**/*.mp3", "../res_raw/sounds/**/*.wav"], ["sounds.dev"]); + + gulp.watch( + ["../res_raw/sounds/ui/*.mp3", "../res_raw/sounds/ui/*.wav"], + $.sequence("sounds.encodeUi", "sounds.copy") + ); + gulp.watch( + ["../res_raw/sounds/game/*.mp3", "../res_raw/sounds/game/*.wav"], + $.sequence("sounds.encodeGame", "sounds.copy") + ); + gulp.watch( + ["../res_raw/sounds/music/*.mp3", "../res_raw/sounds/music/*.wav"], + $.sequence("sounds.encodeMusic", "sounds.copy") + ); + + // Watch resource files and copy them on change + gulp.watch(imgres.nonImageResourcesGlobs, ["imgres.copyNonImageResources"]); + gulp.watch(imgres.imageResourcesGlobs, ["imgres.copyImageResources"]); + + // Watch .atlas files and recompile the atlas on change + gulp.watch("../res_built/atlas/*.json", ["imgres.atlas"]); + + // Watch the build folder and reload when anything changed + const extensions = ["html", "js", "png", "jpg", "svg", "mp3", "ico", "woff2"]; + gulp.watch(extensions.map(ext => path.join(buildFolder, "**", "*." + ext))).on("change", function (e) { + return gulp.src(e.path).pipe(browserSync.reload({ stream: true })); + }); + + // Start the webpack watching server (Will never return) + if (standalone) { + $.sequence("js.standalone-dev.watch")(() => true); + } else { + $.sequence("js.dev.watch")(() => true); + } +} + +// Live-development +gulp.task("main.serveDev", ["build.dev"], () => serve({ standalone: false })); +gulp.task("main.serveStandalone", ["build.standalone.dev"], () => serve({ standalone: true })); + +gulp.task("default", ["main.serveDev"]); + +///////////////////// RUNNABLE TASKS ///////////////////// + +// Pre and postbuild +gulp.task("step.baseResources", cb => $.multiProcess(["sounds.fullbuild", "imgres.allOptimized"], cb, false)); +gulp.task("step.deleteEmpty", cb => { + deleteEmpty.sync(buildFolder); + cb(); +}); + +gulp.task("step.postbuild", $.sequence("imgres.cleanupUnusedCssInlineImages", "step.deleteEmpty")); + +// Builds everything (dev) +gulp.task("build.dev", cb => { + $.sequence( + "utils.cleanup", + "utils.copyAdditionalBuildFiles", + "imgres.atlas", + "sounds.dev", + "imgres.copyImageResources", + "imgres.copyNonImageResources", + "js.dev", + "css.dev", + "html.dev" + )(cb); +}); + +// Builds everything (standalone -dev) +gulp.task("build.standalone.dev", cb => { + $.sequence( + "utils.cleanup", + "imgres.atlas", + "sounds.dev", + "imgres.copyImageResources", + "imgres.copyNonImageResources", + "js.standalone-dev", + "css.dev", + "html.standalone-dev" + )(cb); +}); + +// Builds everything (staging) +gulp.task("step.staging.code", $.sequence("js.staging")); +gulp.task("step.staging.mainbuild", cb => + $.multiProcess(["utils.copyAdditionalBuildFiles", "step.baseResources", "step.staging.code"], cb, false) +); +gulp.task("step.staging.all", $.sequence("step.staging.mainbuild", "css.prod", "html.staging")); +gulp.task("build.staging", $.sequence("utils.cleanup", "step.staging.all", "step.postbuild")); + +// Builds everything (prod) +gulp.task("step.prod.code", $.sequence("js.prod")); +gulp.task("step.prod.mainbuild", cb => + $.multiProcess(["utils.copyAdditionalBuildFiles", "step.baseResources", "step.prod.code"], cb, false) +); +gulp.task("step.prod.all", $.sequence("step.prod.mainbuild", "css.prod", "html.prod")); +gulp.task("build.prod", $.sequence("utils.cleanup", "step.prod.all", "step.postbuild")); + +// Builds everything (standalone-beta) +gulp.task("step.standalone-beta.code", $.sequence("js.standalone-beta")); +gulp.task("step.standalone-beta.mainbuild", cb => + $.multiProcess( + ["utils.copyAdditionalBuildFiles", "step.baseResources", "step.standalone-beta.code"], + cb, + false + ) +); +gulp.task( + "step.standalone-beta.all", + $.sequence("step.standalone-beta.mainbuild", "css.prod-standalone", "html.standalone-beta") +); +gulp.task("build.standalone-beta", $.sequence("utils.cleanup", "step.standalone-beta.all", "step.postbuild")); + +// Builds everything (standalone-prod) +gulp.task("step.standalone-prod.code", $.sequence("js.standalone-prod")); +gulp.task("step.standalone-prod.mainbuild", cb => + $.multiProcess( + ["utils.copyAdditionalBuildFiles", "step.baseResources", "step.standalone-prod.code"], + cb, + false + ) +); +gulp.task( + "step.standalone-prod.all", + $.sequence("step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod") +); +gulp.task("build.standalone-prod", $.sequence("utils.cleanup", "step.standalone-prod.all", "step.postbuild")); + +// Deploying! +gulp.task( + "main.deploy.staging", + $.sequence("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.staging") +); +gulp.task("main.deploy.prod", $.sequence("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod")); +gulp.task("main.deploy.all", $.sequence("main.deploy.staging", "main.deploy.prod")); + +// gulp.task("main.standalone.beta", $.sequence("build.standalone-beta", "standalone.package.beta")); +gulp.task("main.standalone", $.sequence("build.standalone-prod", "standalone.package.prod")); diff --git a/gulp/html.js b/gulp/html.js new file mode 100644 index 00000000..48c5547a --- /dev/null +++ b/gulp/html.js @@ -0,0 +1,360 @@ +const buildUtils = require("./buildutils"); +const fs = require("fs"); +const path = require("path"); +const crypto = require("crypto"); + +function computeIntegrityHash(fullPath, algorithm = "sha256") { + const file = fs.readFileSync(fullPath); + const hash = crypto.createHash(algorithm).update(file).digest("base64"); + return algorithm + "-" + hash; +} + +function gulptasksHTML($, gulp, buildFolder, browserSync) { + const commitHash = buildUtils.getRevision(); + async function buildHtml( + apiUrl, + { + analytics = false, + standalone = false, + app = false, + integrity = true, + enableCachebust = true, + gameAnalyticsKey = null, + gameAnalyticsSecret = null, + } + ) { + function cachebust(url) { + if (enableCachebust) { + return buildUtils.cachebust(url, commitHash); + } + return url; + } + + const hasLocalFiles = standalone || app; + + return gulp + .src("../src/html/" + (standalone ? "index.standalone.html" : "index.html")) + .pipe( + $.dom(function () { + // @ts-ignore + const document = /** @type {Document} */ (this); + + // Preconnect to api + const prefetchLink = document.createElement("link"); + prefetchLink.rel = "preconnect"; + prefetchLink.href = apiUrl; + prefetchLink.setAttribute("crossorigin", "anonymous"); + document.head.appendChild(prefetchLink); + + // // Append css preload + // const cssPreload = document.createElement("link"); + // cssPreload.rel = "preload"; + // cssPreload.href = cachebust("main.css"); + // cssPreload.setAttribute("as", "style"); + // document.head.appendChild(cssPreload); + // document.head.appendChild(prefetchLink); + + // // Append js preload + // const jsPreload = document.createElement("link"); + // jsPreload.rel = "preload"; + // jsPreload.href = cachebust("bundle.js"); + // jsPreload.setAttribute("as", "script"); + // document.head.appendChild(jsPreload); + + // Append css + const css = document.createElement("link"); + css.rel = "stylesheet"; + css.type = "text/css"; + css.media = "none"; + css.setAttribute("onload", "this.media='all'"); + css.href = cachebust("main.css"); + if (integrity) { + css.setAttribute( + "integrity", + computeIntegrityHash(path.join(buildFolder, "main.css")) + ); + } + document.head.appendChild(css); + + if (analytics) { + // Logrocket + // const logrocketScript = document.createElement("script"); + // logrocketScript.src = "https://cdn.lr-ingest.io/LogRocket.min.js"; + // logrocketScript.setAttribute("crossorigin", "anonymous"); + // document.head.appendChild(logrocketScript); + // const logrocketInit = document.createElement("script"); + // logrocketInit.textContent = "window.LogRocket && window.LogRocket.init('TODO: GET LOGROCKET ID');"; + // document.head.appendChild(logrocketInit); + } + + if (gameAnalyticsKey && gameAnalyticsSecret) { + const gaLoader = document.createElement("script"); + gaLoader.textContent = ` + window.GameAnalytics=window.GameAnalytics||function(){(GameAnalytics.q=GameAnalytics.q||[]).push(arguments)}; + window.ga_comKey = "${gameAnalyticsKey}"; + window.ga_comToken = "${gameAnalyticsSecret}"; + `; + document.head.appendChild(gaLoader); + + const gaScript = document.createElement("script"); + gaScript.src = "https://download.gameanalytics.com/js/GameAnalytics-4.0.10.min.js"; + gaScript.setAttribute("async", ""); + document.head.appendChild(gaScript); + } + + if (app) { + // Append cordova link + const cdv = document.createElement("script"); + cdv.src = "cordova.js"; + cdv.type = "text/javascript"; + document.head.appendChild(cdv); + } + + // Google analytics + if (analytics) { + const tagManagerScript = document.createElement("script"); + tagManagerScript.src = "https://www.googletagmanager.com/gtag/js?id=UA-165342524-1"; + tagManagerScript.setAttribute("async", ""); + document.head.appendChild(tagManagerScript); + + const initScript = document.createElement("script"); + initScript.textContent = ` + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'UA-165342524-1', { anonymize_ip: true }); + `; + document.head.appendChild(initScript); + } + + // Do not need to preload in app or standalone + if (!hasLocalFiles) { + // Preload images + const images = buildUtils.getAllResourceImages(); + + // Preload essentials + const preloads = ["fonts/LouisGeorgeCafe.woff2"]; + + // for (let i = 0; i < images.length; ++i) { + // if (preloads.indexOf(images[i]) < 0) { + // preloads.push(images[i]); + // } + // } + + preloads.forEach(src => { + const preloadLink = document.createElement("link"); + preloadLink.rel = "preload"; + preloadLink.href = cachebust("res/" + src); + if (src.endsWith(".woff2")) { + preloadLink.setAttribute("crossorigin", "anonymous"); + preloadLink.setAttribute("as", "font"); + } else { + preloadLink.setAttribute("as", "image"); + } + document.head.appendChild(preloadLink); + }); + + // Sound preloads + // const sounds = buildUtils.getAllSounds(); + // sounds.forEach((src) => { + + // if (src.indexOf("sounds/music/") >= 0) { + // // skip music + // return; + // } + + // const preloadLink = document.createElement("link"); + // preloadLink.rel = "preload"; + // preloadLink.href = cachebust(src); + // // preloadLink.setAttribute("crossorigin", "anonymous"); + // preloadLink.setAttribute("as", "fetch"); + // document.head.appendChild(preloadLink); + // }); + } + + const loadingSvg = `background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCIgZGlzcGxheT0iYmxvY2siPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzM5Mzc0NyIgc3Ryb2tlLXdpZHRoPSIzIiByPSI0MiIgc3Ryb2tlLWRhc2hhcnJheT0iMTk3LjkyMDMzNzE3NjE1Njk4IDY3Ljk3MzQ0NTcyNTM4NTY2IiB0cmFuc2Zvcm09InJvdGF0ZSg0OC4yNjUgNTAgNTApIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIGR1cj0iNS41NTU1NTU1NTU1NTU1NTVzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+")`; + + const loadingCss = ` + @font-face { + font-family: 'GameFont'; + font-style: normal; + font-weight: normal; + font-display: swap; + src: url('${cachebust("res/fonts/LouisGeorgeCafe.woff2")}') format('woff2'); + } + + #ll_fp { + font-family: GameFont; + font-size: 14px; + position: fixed; + z-index: -1; + top: 0; + left: 0; + opacity: 0.05; + } + + #ll_p { + display: flex; + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + justify-content: + center; + align-items: center; + } + + #ll_p > div { + position: absolute; + text-align: center; + bottom: 40px; + left: 20px; + right: 20px; + color: #393747; + font-family: 'GameFont', sans-serif; + font-size: 20px; + } + + #ll_p > span { + width: 60px; + height: 60px; + display: inline-flex; + background: center center / contain no-repeat; + ${loadingSvg}; + } + `; + + const style = document.createElement("style"); + style.setAttribute("type", "text/css"); + style.textContent = loadingCss; + document.head.appendChild(style); + + // Append loader, but not in standalone (directly include bundle there) + if (standalone) { + const bundleScript = document.createElement("script"); + bundleScript.type = "text/javascript"; + bundleScript.src = "bundle.js"; + if (integrity) { + bundleScript.setAttribute( + "integrity", + computeIntegrityHash(path.join(buildFolder, "bundle.js")) + ); + } + document.head.appendChild(bundleScript); + } else { + const loadJs = document.createElement("script"); + loadJs.type = "text/javascript"; + let scriptContent = ""; + scriptContent += `var bundleSrc = '${cachebust("bundle.js")}';\n`; + scriptContent += `var bundleSrcTranspiled = '${cachebust( + "bundle-transpiled.js" + )}';\n`; + + if (integrity) { + scriptContent += + "var bundleIntegrity = '" + + computeIntegrityHash(path.join(buildFolder, "bundle.js")) + + "';\n"; + scriptContent += + "var bundleIntegrityTranspiled = '" + + computeIntegrityHash(path.join(buildFolder, "bundle-transpiled.js")) + + "';\n"; + } else { + scriptContent += "var bundleIntegrity = null;\n"; + scriptContent += "var bundleIntegrityTranspiled = null;\n"; + } + + scriptContent += fs.readFileSync("./bundle-loader.js").toString(); + loadJs.textContent = scriptContent; + document.head.appendChild(loadJs); + } + + const bodyContent = ` +
_
+
+ +
${hasLocalFiles ? "Loading" : "Downloading"} Game Files
+
+ `; + + document.body.innerHTML = bodyContent; + }) + ) + .pipe( + $.htmlmin({ + caseSensitive: true, + collapseBooleanAttributes: true, + collapseInlineTagWhitespace: true, + collapseWhitespace: true, + preserveLineBreaks: true, + minifyJS: true, + minifyCSS: true, + quoteCharacter: '"', + useShortDoctype: true, + }) + ) + .pipe($.htmlBeautify()) + .pipe($.rename("index.html")) + .pipe(gulp.dest(buildFolder)); + } + + gulp.task("html.dev", () => { + return buildHtml("http://localhost:5005", { + analytics: false, + integrity: false, + enableCachebust: false, + gameAnalyticsKey: "c8d77921633d5c32a7134e5d5cfcdf12", + // Not an actual "secret" since its built into the JS code + gameAnalyticsSecret: "6d23b40a70199bff0e7a7d8a073543772cf07097", + }); + }); + + gulp.task("html.staging", () => { + return buildHtml("https://api-staging.shapez.io", { + analytics: true, + gameAnalyticsKey: "903fa0dd2d2e23b07e66ea96ddc4c10c", + // Not an actual "secret" since its built into the JS code + gameAnalyticsSecret: "9417fc391d7142b9d73a3861ba6046cafa9df6cb", + }); + }); + + gulp.task("html.prod", () => { + return buildHtml("https://api.shapez.io", { + analytics: true, + gameAnalyticsKey: "16c7f9d352e40c92f6a750fc1a4f0443", + // Not an actual "secret" since its built into the JS code + gameAnalyticsSecret: "4202d7adf154c325ff91731e8be6912e6c0d10e5", + }); + }); + + gulp.task("html.standalone-dev", () => { + return buildHtml("https://localhost:5005", { + analytics: false, + standalone: true, + integrity: false, + enableCachebust: false, + }); + }); + + gulp.task("html.standalone-beta", () => { + return buildHtml("https://api-staging.shapez.io", { + analytics: true, + standalone: true, + enableCachebust: false, + }); + }); + + gulp.task("html.standalone-prod", () => { + return buildHtml("https://api.shapez.io", { + analytics: true, + standalone: true, + enableCachebust: false, + }); + }); +} + +module.exports = { + gulptasksHTML, +}; diff --git a/gulp/image-resources.js b/gulp/image-resources.js new file mode 100644 index 00000000..09511bc3 --- /dev/null +++ b/gulp/image-resources.js @@ -0,0 +1,138 @@ +// @ts-ignore +const path = require("path"); + +// Globs for non-ui resources +const nonImageResourcesGlobs = ["../res/**/*.woff2", "../res/*.ico"]; + +// Globs for ui resources +const imageResourcesGlobs = ["../res/**/*.png", "../res/**/*.svg", "../res/**/*.jpg"]; + +function gulptasksImageResources($, gulp, buildFolder) { + // Lossless options + const minifyImagesOptsLossless = () => [ + $.imagemin.jpegtran({ + progressive: true, + }), + $.imagemin.svgo({}), + $.imagemin.optipng({ + optimizationLevel: 3, + }), + ]; + + // Lossy options + const minifyImagesOpts = () => [ + $.imageminMozjpeg({ + quality: 80, + maxMemory: 1024 * 1024 * 8, + }), + $.imagemin.svgo({}), + $.imageminPngquant({ + speed: 1, + strip: true, + quality: [0.65, 0.9], + dithering: false, + verbose: false, + }), + $.imagemin.optipng({ + optimizationLevel: 3, + }), + ]; + + // Where the resources folder are + const resourcesDestFolder = path.join(buildFolder, "res"); + + /** + * Determines if an atlas must use lossless compression + * @param {string} fname + */ + function fileMustBeLossless(fname) { + return fname.indexOf("lossless") >= 0; + } + + /////////////// ATLAS ///////////////////// + + // Copies the atlas to the final destination + gulp.task("imgres.atlas", () => { + return gulp + .src(["../res_built/atlas/*.png"]) + .pipe($.cached("imgres.atlas")) + .pipe(gulp.dest(resourcesDestFolder)); + }); + + // Copies the atlas to the final destination after optimizing it (lossy compression) + gulp.task("imgres.atlasOptimized", () => { + return gulp + .src(["../res_built/atlas/*.png"]) + .pipe($.cached("imgres.atlasOptimized")) + .pipe( + $.if( + fname => fileMustBeLossless(fname.history[0]), + $.imagemin(minifyImagesOptsLossless()), + $.imagemin(minifyImagesOpts()) + ) + ) + .pipe(gulp.dest(resourcesDestFolder)); + }); + + //////////////////// RESOURCES ////////////////////// + + // Copies all resources which are no ui resources + gulp.task("imgres.copyNonImageResources", () => { + return gulp + .src(nonImageResourcesGlobs) + .pipe($.cached("imgres.copyNonImageResources")) + .pipe(gulp.dest(resourcesDestFolder)); + }); + + // Copies all ui resources + gulp.task("imgres.copyImageResources", () => { + return gulp + .src(imageResourcesGlobs) + .pipe($.cached("copyImageResources")) + .pipe(gulp.dest(path.join(resourcesDestFolder))); + }); + + // Copies all ui resources and optimizes them + gulp.task("imgres.copyImageResourcesOptimized", () => { + return gulp + .src(imageResourcesGlobs) + .pipe($.cached("imgres.copyImageResourcesOptimized")) + .pipe( + $.if( + fname => fileMustBeLossless(fname.history[0]), + $.imagemin(minifyImagesOptsLossless()), + $.imagemin(minifyImagesOpts()) + ) + ) + .pipe(gulp.dest(path.join(resourcesDestFolder))); + }); + + // Copies all resources and optimizes them + gulp.task("imgres.allOptimized", cb => + $.multiProcess( + ["imgres.atlasOptimized", "imgres.copyNonImageResources", "imgres.copyImageResourcesOptimized"], + cb, + false + ) + ); + + // Cleans up unused images which are instead inline into the css + gulp.task("imgres.cleanupUnusedCssInlineImages", () => { + return gulp + .src( + [ + path.join(buildFolder, "res", "ui", "**", "*.png"), + path.join(buildFolder, "res", "ui", "**", "*.jpg"), + path.join(buildFolder, "res", "ui", "**", "*.svg"), + ], + { read: false } + ) + .pipe($.if(fname => fname.history[0].indexOf("noinline") < 0, $.clean({ force: true }))); + }); +} + +module.exports = { + nonImageResourcesGlobs, + imageResourcesGlobs, + gulptasksImageResources, +}; diff --git a/gulp/js.js b/gulp/js.js new file mode 100644 index 00000000..a8f39c1e --- /dev/null +++ b/gulp/js.js @@ -0,0 +1,182 @@ +const path = require("path"); + +function requireUncached(module) { + delete require.cache[require.resolve(module)]; + return require(module); +} + +function gulptasksJS($, gulp, buildFolder, browserSync) { + gulp.task("js.prettify", () => { + return gulp + .src(path.join(buildFolder, "bundle.js")) + .pipe($.jsbeautifier(require("./jsbeautify.json"))) + .pipe(gulp.dest(buildFolder)); + }); + + //// DEV + + gulp.task("js.dev.watch", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.config.js")({ + watch: true, + }) + ) + ) + .pipe(gulp.dest(buildFolder)) + .pipe(browserSync.stream()); + }); + + gulp.task("js.dev", () => { + return gulp + .src("../src/js/main.js") + .pipe($.webpackStream(requireUncached("./webpack.config.js")({}))) + .pipe(gulp.dest(buildFolder)); + }); + + //// STAGING + + gulp.task("js.staging.transpiled", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.production.config.js")({ + enableAssert: true, + environment: "staging", + apiEndpoint: "https://api-staging.shapez.io/v1", + es6: false, + }) + ) + ) + .pipe($.rename("bundle-transpiled.js")) + .pipe(gulp.dest(buildFolder)); + }); + + gulp.task("js.staging.latest", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.production.config.js")({ + enableAssert: true, + environment: "staging", + apiEndpoint: "https://api-staging.shapez.io/v1", + es6: true, + }) + ) + ) + .pipe(gulp.dest(buildFolder)); + }); + gulp.task("js.staging", cb => $.multiProcess(["js.staging.transpiled", "js.staging.latest"], cb, false)); + + //// PROD + gulp.task("js.prod.transpiled", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.production.config.js")({ + enableAssert: false, + environment: "prod", + apiEndpoint: "https://api.shapez.io/v1", + es6: false, + }) + ) + ) + .pipe($.rename("bundle-transpiled.js")) + .pipe(gulp.dest(buildFolder)) + .pipe(browserSync.stream()); + }); + + gulp.task("js.prod.latest", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.production.config.js")({ + enableAssert: false, + environment: "prod", + es6: true, + apiEndpoint: "https://api.shapez.io/v1", + }) + ) + ) + .pipe(gulp.dest(buildFolder)) + .pipe(browserSync.stream()); + }); + + gulp.task("js.prod", cb => $.multiProcess(["js.prod.transpiled", "js.prod.latest"], cb, false)); + + //// STANDALONE + + gulp.task("js.standalone-dev.watch", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.config.js")({ + watch: true, + standalone: true, + }) + ) + ) + .pipe(gulp.dest(buildFolder)) + .pipe(browserSync.stream()); + }); + + gulp.task("js.standalone-dev", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.config.js")({ + standalone: true, + }) + ) + ) + .pipe(gulp.dest(buildFolder)); + }); + + gulp.task("js.standalone-beta", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.production.config.js")({ + enableAssert: true, + environment: "staging", + apiEndpoint: "https://api-staging.shapez.io/v1", + es6: true, + standalone: true, + }) + ) + ) + .pipe(gulp.dest(buildFolder)); + }); + + gulp.task("js.standalone-prod", () => { + return gulp + .src("../src/js/main.js") + .pipe( + $.webpackStream( + requireUncached("./webpack.production.config.js")({ + enableAssert: false, + environment: "prod", + apiEndpoint: "https://api.shapez.io/v1", + es6: true, + standalone: true, + }) + ) + ) + .pipe(gulp.dest(buildFolder)); + }); + + // TODO: Tasks for te app +} + +module.exports = { + gulptasksJS, +}; diff --git a/gulp/jsconfig.json b/gulp/jsconfig.json new file mode 100644 index 00000000..e28a1c04 --- /dev/null +++ b/gulp/jsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "es6", + "checkJs": true + } +} diff --git a/gulp/loader.compressjson.js b/gulp/loader.compressjson.js new file mode 100644 index 00000000..9e80298f --- /dev/null +++ b/gulp/loader.compressjson.js @@ -0,0 +1,11 @@ +"use strict"; + +const lzString = require("lz-string"); + +module.exports = function (source) { + const compressed = lzString.compressToEncodedURIComponent(source); + const sourcecode = `module.exports = (function() { + return JSON.parse(require("global-compression").decompressX64("${compressed}")); + })()`; + return sourcecode; +}; diff --git a/gulp/loader.strip_block.js b/gulp/loader.strip_block.js new file mode 100644 index 00000000..31ae5432 --- /dev/null +++ b/gulp/loader.strip_block.js @@ -0,0 +1,21 @@ +/*jslint node:true */ +"use strict"; + +const startComment = "typehints:start"; +const endComment = "typehints:end"; +const regexPattern = new RegExp( + "[\\t ]*\\/\\* ?" + startComment + " ?\\*\\/[\\s\\S]*?\\/\\* ?" + endComment + " ?\\*\\/[\\t ]*\\n?", + "g" +); + +function StripBlockLoader(content) { + if (content.indexOf(startComment) >= 0) { + content = content.replace(regexPattern, ""); + } + if (this.cacheable) { + this.cacheable(true); + } + return content; +} + +module.exports = StripBlockLoader; diff --git a/gulp/package.json b/gulp/package.json new file mode 100644 index 00000000..3cb8ae15 --- /dev/null +++ b/gulp/package.json @@ -0,0 +1,115 @@ +{ + "name": "builder", + "version": "1.0.0", + "description": "builder", + "private": true, + "main": "main.js", + "scripts": { + "gulp": "gulp" + }, + "author": "tobspr", + "license": "private", + "dependencies": { + "@babel/core": "^7.9.0", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/preset-env": "^7.5.4", + "@types/cordova": "^0.0.34", + "@types/filesystem": "^0.0.29", + "@types/node": "^12.7.5", + "ajv": "^6.10.2", + "babel-loader": "^8.1.0", + "browser-sync": "^2.24.6", + "circular-dependency-plugin": "^5.0.2", + "circular-json": "^0.5.9", + "colors": "^1.3.3", + "core-js": "3", + "crypto": "^1.0.1", + "cssnano-preset-advanced": "^4.0.7", + "delete-empty": "^3.0.0", + "email-validator": "^2.0.4", + "eslint": "^5.9.0", + "fastdom": "^1.0.9", + "flatted": "^2.0.1", + "fs-extra": "^8.1.0", + "howler": "^2.1.2", + "html-loader": "^0.5.5", + "ignore-loader": "^0.1.2", + "lz-string": "^1.4.4", + "markdown-loader": "^5.1.0", + "node-sri": "^1.1.1", + "obfuscator-loader": "^1.1.2", + "phonegap-plugin-mobile-accessibility": "^1.0.5", + "promise-polyfill": "^8.1.0", + "query-string": "^6.8.1", + "rusha": "^0.8.13", + "serialize-error": "^3.0.0", + "sloc": "^0.2.1", + "strictdom": "^1.0.1", + "string-replace-webpack-plugin": "^0.1.3", + "terser-webpack-plugin": "^1.1.0", + "uglify-template-string-loader": "^1.1.0", + "unused-files-webpack-plugin": "^3.4.0", + "webpack": "^4.31.0", + "webpack-bundle-analyzer": "^3.0.3", + "webpack-cli": "^3.1.0", + "webpack-deep-scope-plugin": "^1.6.0", + "webpack-plugin-replace": "^1.1.1", + "webpack-strip-block": "^0.2.0", + "whatwg-fetch": "^3.0.0", + "worker-loader": "^2.0.0" + }, + "devDependencies": { + "autoprefixer": "^9.4.3", + "babel-plugin-closure-elimination": "^1.3.0", + "babel-plugin-console-source": "^2.0.2", + "babel-plugin-danger-remove-unused-import": "^1.1.2", + "css-mqpacker": "^7.0.0", + "cssnano": "^4.1.10", + "electron-packager": "^14.0.6", + "faster.js": "^1.1.0", + "glob": "^7.1.3", + "gulp": "^3.9.1", + "gulp-cache": "^1.1.3", + "gulp-cached": "^1.1.1", + "gulp-clean": "^0.4.0", + "gulp-cssbeautify": "^1.0.1", + "gulp-csslint": "^1.0.1", + "gulp-dom": "^1.0.0", + "gulp-flatten": "^0.4.0", + "gulp-fluent-ffmpeg": "^1.0.2", + "gulp-html-beautify": "^1.0.1", + "gulp-htmlmin": "^5.0.1", + "gulp-if": "^2.0.2", + "gulp-imagemin": "^5.0.3", + "gulp-javascript-obfuscator": "^1.1.5", + "gulp-jsbeautifier": "^3.0.0", + "gulp-load-plugins": "^1.5.0", + "gulp-multi-process": "^1.3.1", + "gulp-phonegap-build": "^0.1.5", + "gulp-plumber": "^1.2.1", + "gulp-pngquant": "^1.0.12", + "gulp-postcss": "^8.0.0", + "gulp-rename": "^1.4.0", + "gulp-sass": "^4.0.1", + "gulp-sass-lint": "^1.4.0", + "gulp-sequence": "^1.0.0", + "gulp-sftp": "^0.1.5", + "gulp-terser": "^1.2.0", + "gulp-webserver": "^0.9.1", + "imagemin-mozjpeg": "^8.0.0", + "imagemin-pngquant": "^8.0.0", + "jimp": "^0.6.1", + "js-yaml": "^3.13.1", + "onesky-fetch": "^0.0.7", + "postcss-assets": "^5.0.0", + "postcss-preset-env": "^6.5.0", + "postcss-round-subpixels": "^1.2.0", + "postcss-unprefix": "^2.1.3", + "sass-unused": "^0.3.0", + "speed-measure-webpack-plugin": "^1.3.1", + "strip-json-comments": "^3.0.1", + "trim": "^0.0.1", + "webpack-stream": "^5.1.0" + } +} diff --git a/gulp/sounds.js b/gulp/sounds.js new file mode 100644 index 00000000..3233162b --- /dev/null +++ b/gulp/sounds.js @@ -0,0 +1,107 @@ +const path = require("path"); + +function gulptasksSounds($, gulp, buildFolder) { + // Gather some basic infos + const soundsDir = path.join("..", "res_raw", "sounds"); + const builtSoundsDir = path.join("..", "res_built", "sounds"); + + gulp.task("sounds.clear", () => { + return gulp.src(builtSoundsDir).pipe($.clean({ force: true })); + }); + + const filters = ["loudnorm", "volume=0.2"]; + + const fileCache = new $.cache.Cache({ + cacheDirName: "shapezio-precompiled-sounds", + }); + + // Encodes the game music + gulp.task("sounds.encodeMusic", () => { + return gulp + .src([path.join(soundsDir, "music", "**", "*.wav"), path.join(soundsDir, "music", "**", "*.mp3")]) + .pipe( + $.cache( + $.fluentFfmpeg("mp3", function (cmd) { + return cmd + .audioBitrate(48) + .audioChannels(1) + .audioFrequency(22050) + .audioCodec("libmp3lame"); + // .audioFilters(["volume=0.25"]) + }), + { + name: "music", + fileCache, + } + ) + ) + .pipe(gulp.dest(path.join(builtSoundsDir, "music"))); + }); + + // Encodes the ui sounds + gulp.task("sounds.encodeUi", () => { + return gulp + .src([path.join(soundsDir, "ui", "**", "*.wav"), path.join(soundsDir, "ui", "**", "*.mp3")]) + .pipe( + $.cache( + $.fluentFfmpeg("mp3", function (cmd) { + return cmd + .audioBitrate(128) + .audioChannels(1) + .audioFrequency(22050) + .audioCodec("libmp3lame") + .audioFilters(filters); + }) + ), + { + name: "uisounds", + fileCache, + } + ) + .pipe(gulp.dest(path.join(builtSoundsDir, "ui"))); + }); + + // Encodes the game sounds + gulp.task("sounds.encodeGame", () => { + return gulp + .src([path.join(soundsDir, "game", "**", "*.wav"), path.join(soundsDir, "game", "**", "*.mp3")]) + .pipe( + $.cache( + $.fluentFfmpeg("mp3", function (cmd) { + return cmd + .audioBitrate(128) + .audioChannels(1) + .audioFrequency(22050) + .audioCodec("libmp3lame") + .audioFilters(filters); + }), + { + nane: "gamesounds", + fileCache, + } + ) + ) + .pipe(gulp.dest(path.join(builtSoundsDir, "game"))); + }); + + gulp.task("sounds.copy", () => { + return gulp + .src(path.join(builtSoundsDir, "**", "*.mp3")) + .pipe($.cached("sounds.copy")) + .pipe(gulp.dest(path.join(buildFolder, "res", "sounds"))); + }); + + gulp.task("sounds.buildall", cb => + $.multiProcess(["sounds.encodeMusic", "sounds.encodeUi", "sounds.encodeGame"], cb, true) + ); + + gulp.task("sounds.fullbuild", cb => $.sequence("sounds.clear", "sounds.buildall", "sounds.copy")(cb)); + + gulp.task("sounds.dev", cb => { + return $.sequence("sounds.buildall", "sounds.copy")(cb); + }); +} + +module.exports = { + gulptasksSounds, +}; diff --git a/gulp/standalone.js b/gulp/standalone.js new file mode 100644 index 00000000..26bc0043 --- /dev/null +++ b/gulp/standalone.js @@ -0,0 +1,215 @@ +const packager = require("electron-packager"); +const path = require("path"); +const buildutils = require("./buildutils"); +const fs = require("fs"); +const fse = require("fs-extra"); +const execSync = require("child_process").execSync; + +function gulptasksStandalone($, gulp, buildFolder) { + const electronBaseDir = path.join("../electron"); + + const tempDestDir = path.join("..", "tmp_standalone_files"); + const tempDestBuildDir = path.join(tempDestDir, "built"); + + gulp.task("standalone.prepare.cleanup", () => { + return gulp.src(tempDestDir, { read: false }).pipe($.clean({ force: true })); + }); + + gulp.task("standalone.prepare.copyPrefab", () => { + // const requiredFiles = $.glob.sync("../electron/"); + const requiredFiles = [ + path.join(electronBaseDir, "lib", "**", "*.node"), + path.join(electronBaseDir, "node_modules", "**", "*.*"), + path.join(electronBaseDir, "node_modules", "**", ".*"), + path.join(electronBaseDir, "node_modules", "**", "*"), + path.join(electronBaseDir, "favicon*"), + ]; + return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir)); + }); + + gulp.task("standalone.prepare.writePackageJson", () => { + fs.writeFileSync( + path.join(tempDestBuildDir, "package.json"), + JSON.stringify( + { + devDependencies: { + electron: "6.0.10", + }, + }, + null, + 4 + ) + ); + }); + + gulp.task("standalone.prepare.minifyCode", () => { + return gulp + .src(path.join(electronBaseDir, "*.js")) + .pipe( + $.terser({ + ecma: 6, + parse: {}, + module: false, + toplevel: true, + keep_classnames: false, + keep_fnames: false, + safari10: false, + compress: { + arguments: false, // breaks + drop_console: false, + // keep_fargs: false, + keep_infinity: true, + passes: 2, + module: false, + toplevel: true, + unsafe_math: true, + unsafe_arrows: false, + warnings: true, + }, + mangle: { + eval: true, + keep_classnames: false, + keep_fnames: false, + module: false, + toplevel: true, + safari10: false, + }, + output: { + comments: false, + ascii_only: true, + beautify: false, + braces: false, + ecma: 6, + }, + }) + ) + .pipe(gulp.dest(tempDestBuildDir)); + }); + + gulp.task("standalone.prepare.copyGamefiles", () => { + return gulp.src("../../www/**/*.*", { base: "../../www" }).pipe(gulp.dest(tempDestBuildDir)); + }); + + gulp.task("standalone.killRunningInstances", () => { + try { + execSync("taskkill /F /IM shapezio.exe"); + } catch (ex) { + console.warn("Failed to kill running instances, maybe none are up."); + } + }); + + gulp.task( + "standalone.prepare", + $.sequence( + "standalone.killRunningInstances", + "standalone.prepare.cleanup", + "standalone.prepare.copyPrefab", + "standalone.prepare.writePackageJson", + "standalone.prepare.minifyCode", + "standalone.prepare.copyGamefiles" + ) + ); + + /** + * + * @param {'win32'|'linux'|'darwin'} platform + * @param {'x64'|'ia32'} arch + * @param {function():void} cb + * @param {boolean=} isRelease + */ + function packageStandalone(platform, arch, cb, isRelease = false) { + const libDirName = (platform === "win32" ? "win" : platform) + (arch === "x64" ? "64" : "32"); + + const libDir = path.join(electronBaseDir, "lib", libDirName); + if (!fs.existsSync(libDir)) { + console.error("FATAL ERROR: LIB DIR does not exist:", libDir); + cb(); + return; + } + + packager({ + dir: tempDestBuildDir, + appCopyright: "Tobias Springer IT Solutions", + appVersion: buildutils.getVersion(), + buildVersion: "1.0.0", + arch, + platform, + asar: true, + executableName: "shapezio", + icon: path.join(electronBaseDir, "favicon"), + name: "Shapez.io Standalone", + out: tempDestDir, + overwrite: true, + appBundleId: "io.shapez.standalone", + appCategoryType: "public.app-category.games", + }).then( + appPaths => { + console.log("Packages created:", appPaths); + appPaths.forEach(appPath => { + if (!fs.existsSync(appPath)) { + console.error("Bad app path gotten:", appPath); + return; + } + + console.log("Copying lib files to", appPath); + const libFiles = $.glob.sync(path.join("**", "*.+(dylib|so|dll|lib)"), { cwd: libDir }); + libFiles.forEach(f => { + console.log(" -> Copying", f); + fs.copyFileSync(path.join(libDir, f), path.join(appPath, f)); + }); + + const playablePath = appPath + "_PLAYABLE"; + fse.copySync(appPath, playablePath); + fs.writeFileSync(path.join(playablePath, "steam_appid.txt"), "1134480"); + fs.writeFileSync( + path.join(playablePath, "play.bat"), + "start shapezio --dev --disable-direct-composition --in-process-gpu\r\n" + ); + fs.writeFileSync( + path.join(playablePath, "play_local.bat"), + "start shapezio --local --dev --disable-direct-composition --in-process-gpu\r\n" + ); + }); + + cb(); + }, + err => { + console.error("Packaging error:", err); + cb(); + } + ); + } + + // gulp.task("standalone.package.beta.win64", (cb) => packageStandalone("win32", "x64", cb)); + // gulp.task("standalone.package.beta.win32", (cb) => packageStandalone("win32", "ia32", cb)); + // gulp.task("standalone.package.beta.linux64", (cb) => packageStandalone("linux", "x64", cb)); + // gulp.task("standalone.package.beta.linux32", (cb) => packageStandalone("linux", "ia32", cb)); + // gulp.task("standalone.package.beta.darwin64", (cb) => packageStandalone("darwin", "x64", cb)); + + // gulp.task("standalone.package.beta", $.sequence("standalone.prepare", [ + // "standalone.package.beta.win64", + // "standalone.package.beta.win32", + // "standalone.package.beta.linux64", + // "standalone.package.beta.linux32", + // "standalone.package.beta.darwin64" + // ])); + + gulp.task("standalone.package.prod.win64", cb => packageStandalone("win32", "x64", cb, true)); + gulp.task("standalone.package.prod.win32", cb => packageStandalone("win32", "ia32", cb, true)); + gulp.task("standalone.package.prod.linux64", cb => packageStandalone("linux", "x64", cb, true)); + gulp.task("standalone.package.prod.linux32", cb => packageStandalone("linux", "ia32", cb, true)); + gulp.task("standalone.package.prod.darwin64", cb => packageStandalone("darwin", "x64", cb, true)); + + gulp.task( + "standalone.package.prod", + $.sequence("standalone.prepare", [ + "standalone.package.prod.win64", + // "standalone.package.prod.win32", + // "standalone.package.prod.linux64", + // "standalone.package.prod.linux32", + // "standalone.package.prod.darwin64" + ]) + ); +} + +module.exports = { gulptasksStandalone }; diff --git a/gulp/tsconfig.json b/gulp/tsconfig.json new file mode 100644 index 00000000..0de5c39f --- /dev/null +++ b/gulp/tsconfig.json @@ -0,0 +1,59 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + "allowJs": true /* Allow javascript files to be compiled. */, + "checkJs": true /* Report errors in .js files. */, + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./typedefs_gen", /* Concatenate and emit output to single file. */ + // "outDir": "./typedefs_gen", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "incremental": true, /* Enable incremental compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + "noEmit": true /* Do not emit outputs. */, + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + // "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + "strictFunctionTypes": true /* Enable strict checking of function types. */, + "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, + "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + /* Module Resolution Options */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "resolveJsonModule": true + }, + "exclude": ["backend/shared/gameserver_base_impl"] +} diff --git a/gulp/webpack.config.js b/gulp/webpack.config.js new file mode 100644 index 00000000..31d2d7f5 --- /dev/null +++ b/gulp/webpack.config.js @@ -0,0 +1,116 @@ +const path = require("path"); +const webpack = require("webpack"); +const utils = require("./buildutils"); +const lzString = require("lz-string"); +// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const CircularDependencyPlugin = require("circular-dependency-plugin"); + +module.exports = ({ watch = false, standalone = false }) => { + return { + mode: "development", + devtool: "cheap-source-map", + entry: { + "bundle.js": [path.resolve(__dirname, "../src/js/main.js")], + }, + watch, + node: { + fs: "empty", + }, + resolve: { + alias: { + "global-compression": path.resolve(__dirname, "..", "src", "js", "core", "lzstring.js"), + }, + }, + context: path.resolve(__dirname, ".."), + plugins: [ + new webpack.DefinePlugin({ + assert: "window.assert", + assertAlways: "window.assert", + abstract: + "window.assert(false, 'abstract method called of: ' + (this.name || (this.constructor && this.constructor.name)));", + G_HAVE_ASSERT: "true", + G_APP_ENVIRONMENT: JSON.stringify("dev"), + G_API_ENDPOINT: JSON.stringify( + lzString.compressToEncodedURIComponent("http://localhost:5005/v1") + ), + G_TRACKING_ENDPOINT: JSON.stringify( + lzString.compressToEncodedURIComponent("http://localhost:10005/v1") + ), + G_IS_DEV: "true", + G_IS_PROD: "false", + G_IS_RELEASE: "false", + G_IS_MOBILE_APP: "false", + G_IS_BROWSER: "true", + G_IS_STANDALONE: standalone ? "true" : "false", + G_BUILD_TIME: "" + new Date().getTime(), + G_BUILD_COMMIT_HASH: JSON.stringify(utils.getRevision()), + G_BUILD_VERSION: JSON.stringify(utils.getVersion()), + G_ALL_UI_IMAGES: JSON.stringify(utils.getAllResourceImages()), + }), + + new CircularDependencyPlugin({ + // exclude detection of files based on a RegExp + exclude: /node_modules/, + + // add errors to webpack instead of warnings + failOnError: true, + + // allow import cycles that include an asyncronous import, + // e.g. via import(/* webpackMode: "weak" */ './file.js') + allowAsyncCycles: false, + + // set the current working directory for displaying module paths + cwd: path.join(__dirname, "..", "src", "js"), + }), + // new BundleAnalyzerPlugin() + ], + module: { + rules: [ + { + test: /\.json$/, + enforce: "pre", + use: ["./gulp/loader.compressjson"], + type: "javascript/auto", + }, + { test: /\.(png|jpe?g|svg)$/, loader: "ignore-loader" }, + { + test: /\.md$/, + use: [ + { + loader: "html-loader", + }, + "markdown-loader", + ], + }, + { + test: /\.js$/, + enforce: "pre", + exclude: /node_modules/, + use: [ + { + loader: "webpack-strip-block", + options: { + start: "typehints:start", + end: "typehints:end", + }, + }, + ], + }, + { + test: /\.worker\.js$/, + use: { + loader: "worker-loader", + options: { + fallback: false, + inline: true, + }, + }, + }, + ], + }, + output: { + filename: "bundle.js", + path: path.resolve(__dirname, "..", "build"), + }, + }; +}; diff --git a/gulp/webpack.production.config.js b/gulp/webpack.production.config.js new file mode 100644 index 00000000..a48f20e5 --- /dev/null +++ b/gulp/webpack.production.config.js @@ -0,0 +1,258 @@ +const path = require("path"); +const webpack = require("webpack"); +const utils = require("./buildutils"); +const lzString = require("lz-string"); + +const TerserPlugin = require("terser-webpack-plugin"); +const StringReplacePlugin = require("string-replace-webpack-plugin"); +// const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; +const UnusedFilesPlugin = require("unused-files-webpack-plugin").UnusedFilesWebpackPlugin; +// const SpeedMeasurePlugin = require("speed-measure-webpack-plugin"); + +module.exports = ({ + enableAssert = false, + apiEndpoint, + environment, + es6 = false, + standalone = false, + isBrowser = true, + mobileApp = false, +}) => { + const globalDefs = { + assert: enableAssert ? "window.assert" : "false && window.assert", + assertAlways: "window.assert", + abstract: "window.assert(false, 'abstract method called');", + G_IS_DEV: "false", + G_IS_PROD: "true", + G_IS_RELEASE: environment === "prod" ? "true" : "false", + G_IS_STANDALONE: standalone ? "true" : "false", + G_IS_BROWSER: isBrowser ? "true" : "false", + G_IS_MOBILE_APP: mobileApp ? "true" : "false", + G_API_ENDPOINT: JSON.stringify(lzString.compressToEncodedURIComponent(apiEndpoint)), + G_TRACKING_ENDPOINT: JSON.stringify( + lzString.compressToEncodedURIComponent("https://tracking.shapez.io/v1") + ), + G_APP_ENVIRONMENT: JSON.stringify(environment), + G_HAVE_ASSERT: enableAssert ? "true" : "false", + G_BUILD_TIME: "" + new Date().getTime(), + G_BUILD_COMMIT_HASH: JSON.stringify(utils.getRevision()), + G_BUILD_VERSION: JSON.stringify(utils.getVersion()), + G_ALL_UI_IMAGES: JSON.stringify(utils.getAllResourceImages()), + }; + + return { + mode: "production", + devtool: false, + entry: { + "bundle.js": [path.resolve(__dirname, "..", "src", "js", "main.js")], + }, + node: { + fs: "empty", + }, + output: { + filename: "bundle.js", + path: path.resolve(__dirname, "..", "build"), + }, + context: path.resolve(__dirname, ".."), + stats: { + // Examine all modules + maxModules: Infinity, + // Display bailout reasons + optimizationBailout: true, + }, + resolve: { + alias: { + "global-compression": path.resolve(__dirname, "..", "src", "js", "core", "lzstring.js"), + }, + }, + optimization: { + minimize: true, + // namedModules: true, + + noEmitOnErrors: true, + removeAvailableModules: true, + removeEmptyChunks: true, + mergeDuplicateChunks: true, + flagIncludedChunks: true, + occurrenceOrder: true, + providedExports: true, + usedExports: true, + concatenateModules: true, + sideEffects: true, + + minimizer: [ + new TerserPlugin({ + parallel: true, + sourceMap: false, + cache: false, + terserOptions: { + ecma: es6 ? 6 : 5, + parse: {}, + module: true, + toplevel: true, + keep_classnames: false, + keep_fnames: false, + keep_fargs: false, + safari10: true, + compress: { + arguments: false, // breaks + drop_console: false, + global_defs: globalDefs, + keep_fargs: false, + keep_infinity: true, + passes: 2, + module: true, + pure_funcs: [ + "Math.round", + "Math.ceil", + "Math.floor", + "Math.sqrt", + "Math.hypot", + "Math.abs", + "Math.max", + "Math.min", + "Math.sin", + "Math.cos", + "Math.tan", + "Math.sign", + "Math.pow", + "Math.atan2", + + "Math_round", + "Math_ceil", + "Math_floor", + "Math_sqrt", + "Math_hypot", + "Math_abs", + "Math_max", + "Math_min", + "Math_sin", + "Math_cos", + "Math_tan", + "Math_sign", + "Math_pow", + "Math_atan2", + ], + toplevel: true, + unsafe_math: true, + unsafe_arrows: false, + warnings: true, + }, + mangle: { + eval: true, + keep_classnames: false, + keep_fnames: false, + module: true, + toplevel: true, + safari10: true, + }, + output: { + comments: false, + ascii_only: true, + beautify: false, + braces: false, + ecma: es6 ? 6 : 5, + preamble: + "/* Shapez.io Codebase - Copyright 2020 Tobias Springer - " + + utils.getVersion() + + " @ " + + utils.getRevision() + + " */", + }, + }, + }), + ], + }, + performance: { + maxEntrypointSize: 5120000, + maxAssetSize: 5120000, + }, + plugins: [ + new webpack.DefinePlugin(globalDefs), + + new UnusedFilesPlugin({ + failOnUnused: false, + cwd: path.join(__dirname, "..", "src", "js"), + patterns: ["../src/js/**/*.js"], + }), + + // new ReplaceCompressBlocks() + // new webpack.optimize.ModuleConcatenationPlugin() + // new WebpackDeepScopeAnalysisPlugin() + // new BundleAnalyzerPlugin() + ], + module: { + rules: [ + { + test: /\.json$/, + enforce: "pre", + use: ["./gulp/loader.compressjson"], + type: "javascript/auto", + }, + { test: /\.(png|jpe?g|svg)$/, loader: "ignore-loader" }, + { + test: /\.js$/, + enforce: "pre", + exclude: /node_modules/, + use: [ + { + loader: "webpack-strip-block", + options: { + start: "typehints:start", + end: "typehints:end", + }, + }, + { + loader: "webpack-strip-block", + options: { + start: "dev:start", + end: "dev:end", + }, + }, + ], + }, + { + test: /\.js$/, + use: [ + // "thread-loader", + { + loader: "babel-loader?cacheDirectory", + options: { + configFile: require.resolve( + es6 ? "./babel-es6.config.js" : "./babel.config.js" + ), + }, + }, + "uglify-template-string-loader", // Finally found this plugin + StringReplacePlugin.replace({ + replacements: [ + { pattern: /globalConfig\.tileSize/g, replacement: () => "32" }, + { pattern: /globalConfig\.halfTileSize/g, replacement: () => "16" }, + { + pattern: /globalConfig\.beltSpeedItemsPerSecond/g, + replacement: () => "1.0", + }, + { pattern: /globalConfig\.itemSpacingOnBelts/g, replacement: () => "0.8" }, + { pattern: /globalConfig\.debug/g, replacement: () => "''" }, + ], + }), + ], + }, + { + test: /\.worker\.js$/, + use: { + loader: "worker-loader", + options: { + fallback: false, + inline: true, + }, + }, + }, + { + test: /\.md$/, + use: ["html-loader", "markdown-loader"], + }, + ], + }, + }; +}; diff --git a/gulp/yarn.lock b/gulp/yarn.lock new file mode 100644 index 00000000..702d54b9 --- /dev/null +++ b/gulp/yarn.lock @@ -0,0 +1,14195 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/core@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56" + integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA== + dependencies: + "@babel/types" "^7.6.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== + dependencies: + "@babel/types" "^7.9.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" + integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" + integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== + dependencies: + "@babel/types" "^7.5.5" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" + integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" + integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + +"@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b" + integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ== + +"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" + integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4", "@babel/plugin-transform-block-scoping@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz#c49e21228c4bbd4068a35667e6d951c75439b1dc" + integrity sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" + integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz#1e6e663097813bb4f53d42df0750cf28ad3bb3f1" + integrity sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew== + dependencies: + regexp-tree "^0.1.13" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" + integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.5.4": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.0.tgz#aae4141c506100bb2bfaa4ac2a5c12b395619e50" + integrity sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.5.5" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.5.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.6.0" + "@babel/plugin-transform-classes" "^7.5.5" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.6.0" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.0" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.5.5" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.6.0" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/runtime@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.42.tgz#352e40c92e0460d3e82f49bd7e79f6cda76f919f" + integrity sha512-iOGRzUoONLOtmCvjUsZv3mZzgCT6ljHQY5fr1qG1QIiJQwtM7zbPWGGpa3QWETq+UqwWyJnoi5XZDZRwZDFciQ== + dependencies: + core-js "^2.5.3" + regenerator-runtime "^0.11.1" + +"@babel/runtime@7.0.0-rc.1": + version "7.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-rc.1.tgz#42f36fc5817911c89ea75da2b874054922967616" + integrity sha512-Nifv2kwP/nwR39cAOasNxzjYfpeuf/ZbZNtQz5eYxWTC9yHARU9wItFnAwz1GTZ62MU+AtSjzZPMbLK5Q9hmbg== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.5.5": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + +"@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516" + integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" + integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@electron/get@^1.3.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.5.0.tgz#6217d9d18fb71fbd8cd2445a31aa0edc723d19dd" + integrity sha512-tafxBz6n08G6SX961F/h8XFtpB/DdwRvJJoDeOH9x78jDSCMQ2G/rRWqSwLFp9oeMFBJf0Pf5Kkw6TKt5w9TWg== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + sanitize-filename "^1.6.2" + sumchecker "^3.0.0" + +"@jimp/bmp@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.6.8.tgz#8abbfd9e26ba17a47fab311059ea9f7dd82005b6" + integrity sha512-uxVgSkI62uAzk5ZazYHEHBehow590WAkLKmDXLzkr/XP/Hv2Fx1T4DKwJ/15IY5ktq5VAhAUWGXTyd8KWFsx7w== + dependencies: + "@jimp/utils" "^0.6.8" + bmp-js "^0.1.0" + core-js "^2.5.7" + +"@jimp/core@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.6.8.tgz#6a41089792516f6e64a5302d12eb562aa7847c7b" + integrity sha512-JOFqBBcSNiDiMZJFr6OJqC6viXj5NVBQISua0eacoYvo4YJtTajOIxC4MqWyUmGrDpRMZBR8QhSsIOwsFrdROA== + dependencies: + "@jimp/utils" "^0.6.8" + any-base "^1.1.0" + buffer "^5.2.0" + core-js "^2.5.7" + exif-parser "^0.1.12" + file-type "^9.0.0" + load-bmfont "^1.3.1" + mkdirp "0.5.1" + phin "^2.9.1" + pixelmatch "^4.0.2" + tinycolor2 "^1.4.1" + +"@jimp/custom@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.6.8.tgz#0476d7b3f5da3121d98895a2e14f2899e602f2b6" + integrity sha512-FrYlzZRVXP2vuVwd7Nc2dlK+iZk4g6IaT1Ib8Z6vU5Kkwlt83FJIPJ2UUFABf3bF5big0wkk8ZUihWxE4Nzdng== + dependencies: + "@jimp/core" "^0.6.8" + core-js "^2.5.7" + +"@jimp/gif@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.6.8.tgz#848dd4e6e1a56ca2b3ce528969e44dfa99a53b14" + integrity sha512-yyOlujjQcgz9zkjM5ihZDEppn9d1brJ7jQHP5rAKmqep0G7FU1D0AKcV+Ql18RhuI/CgWs10wAVcrQpmLnu4Yw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + omggif "^1.0.9" + +"@jimp/jpeg@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.6.8.tgz#4cad85a6d1e15759acb56bddef29aa3473859f2c" + integrity sha512-rGtXbYpFXAn471qLpTGvhbBMNHJo5KiufN+vC5AWyufntmkt5f0Ox2Cx4ijuBMDtirZchxbMLtrfGjznS4L/ew== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + jpeg-js "^0.3.4" + +"@jimp/plugin-blit@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.6.8.tgz#646ebb631f35afc28c1e8908524bc43d1e9afa3d" + integrity sha512-7Tl6YpKTSpvwQbnGNhsfX2zyl3jRVVopd276Y2hF2zpDz9Bycow7NdfNU/4Nx1jaf96X6uWOtSVINcQ7rGd47w== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-blur@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.6.8.tgz#7b753ae94f6099103f57c268c3b2679047eefe95" + integrity sha512-NpZCMKxXHLDQsX9zPlWtpMA660DQStY6/z8ZetyxCDbqrLe9YCXpeR4MNhdJdABIiwTm1W5FyFF4kp81PHJx3Q== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-color@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.6.8.tgz#4101cb1208879b331db6e43ea6b96eaf8dbaedbc" + integrity sha512-jjFyU0zNmGOH2rjzHuOMU4kaia0oo82s/7UYfn5h7OUkmUZTd6Do3ZSK1PiXA7KR+s4B76/Omm6Doh/0SGb7BQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + tinycolor2 "^1.4.1" + +"@jimp/plugin-contain@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.6.8.tgz#af95d33b63d0478943374ae15dd2607fc69cad14" + integrity sha512-p/P2wCXhAzbmEgXvGsvmxLmbz45feF6VpR4m9suPSOr8PC/i/XvTklTqYEUidYYAft4vHgsYJdS74HKSMnH8lw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-cover@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.6.8.tgz#490e3186627a34d93cc015c4169bac9070d6ad17" + integrity sha512-2PvWgk+PJfRsfWDI1G8Fpjrsu0ZlpNyZxO2+fqWlVo6y/y2gP4v08FqvbkcqSjNlOu2IDWIFXpgyU0sTINWZLg== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-crop@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.6.8.tgz#ffec8951a2f3eccad1e3cff9afff5326bd980ce7" + integrity sha512-CbrcpWE2xxPK1n/JoTXzhRUhP4mO07mTWaSavenCg664oQl/9XCtL+A0FekuNHzIvn4myEqvkiTwN7FsbunS/Q== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-displace@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.6.8.tgz#89df05ab7daaff6befc190bb8ac54ec8d57e533b" + integrity sha512-RmV2bPxoPE6mrPxtYSPtHxm2cGwBQr5a2p+9gH6SPy+eUMrbGjbvjwKNfXWUYD0leML+Pt5XOmAS9pIROmuruQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-dither@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.6.8.tgz#17e5b9f56575a871e329fef8b388e614b92d84f8" + integrity sha512-x6V/qjxe+xypjpQm7GbiMNqci1EW5UizrcebOhHr8AHijOEqHd2hjXh5f6QIGfrkTFelc4/jzq1UyCsYntqz9Q== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-flip@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.6.8.tgz#153df0c677f79d4078bb9e4c1f2ac392b96dc3a1" + integrity sha512-4il6Da6G39s9MyWBEee4jztEOUGJ40E6OlPjkMrdpDNvge6hYEAB31BczTYBP/CEY74j4LDSoY5LbcU4kv06yA== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-gaussian@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.6.8.tgz#100abc7ae1f19fe9c09ed41625b475aae7c6093c" + integrity sha512-pVOblmjv7stZjsqloi4YzHVwAPXKGdNaHPhp4KP4vj41qtc6Hxd9z/+VWGYRTunMFac84gUToe0UKIXd6GhoKw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-invert@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.6.8.tgz#f40bfaa3b592d21ff14ede0e49aabec88048cad0" + integrity sha512-11zuLiXDHr6tFv4U8aieXqNXQEKbDbSBG/h+X62gGTNFpyn8EVPpncHhOqrAFtZUaPibBqMFlNJ15SzwC7ExsQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-mask@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.6.8.tgz#e64405f7dacf0672bff74f3b95b724d9ac517f86" + integrity sha512-hZJ0OiKGJyv7hDSATwJDkunB1Ie80xJnONMgpUuUseteK45YeYNBOiZVUe8vum8QI1UwavgBzcvQ9u4fcgXc9g== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-normalize@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.6.8.tgz#a0180f2b8835e3638cdc5e057b44ac63f60db6ba" + integrity sha512-Q4oYhU+sSyTJI7pMZlg9/mYh68ujLfOxXzQGEXuw0sHGoGQs3B0Jw7jmzGa6pIS06Hup5hD2Zuh1ppvMdjJBfQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-print@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.6.8.tgz#66309549e01896473111e3a0ad2cee428638bd6e" + integrity sha512-2aokejGn4Drv1FesnZGqh5KEq0FQtR0drlmtyZrBH+r9cx7hh0Qgf4D1BOTDEgXkfSSngjGRjKKRW/fwOrVXYw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + load-bmfont "^1.4.0" + +"@jimp/plugin-resize@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.6.8.tgz#c26d9a973f7eec51ad9018fcbbac1146f7a73aa0" + integrity sha512-27nPh8L1YWsxtfmV/+Ub5dOTpXyC0HMF2cu52RQSCYxr+Lm1+23dJF70AF1poUbUe+FWXphwuUxQzjBJza9UoA== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-rotate@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.6.8.tgz#2afda247984eeebed95c1bb1b13ccd3be5973299" + integrity sha512-GbjETvL05BDoLdszNUV4Y0yLkHf177MnqGqilA113LIvx9aD0FtUopGXYfRGVvmtTOTouoaGJUc+K6qngvKxww== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-scale@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.6.8.tgz#5de403345859bb0b30bf3e242dedd8ceb6ecb96c" + integrity sha512-GzIYWR/oCUK2jAwku23zt19V1ssaEU4pL0x2XsLNKuuJEU6DvEytJyTMXCE7OLG/MpDBQcQclJKHgiyQm5gIOQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugins@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.6.8.tgz#5618170a986ced1ea795adcd9376122f2543b856" + integrity sha512-fMcTI72Vn/Lz6JftezTURmyP5ml/xGMe0Ljx2KRJ85IWyP33vDmGIUuutFiBEbh2+y7lRT+aTSmjs0QGa/xTmQ== + dependencies: + "@jimp/plugin-blit" "^0.6.8" + "@jimp/plugin-blur" "^0.6.8" + "@jimp/plugin-color" "^0.6.8" + "@jimp/plugin-contain" "^0.6.8" + "@jimp/plugin-cover" "^0.6.8" + "@jimp/plugin-crop" "^0.6.8" + "@jimp/plugin-displace" "^0.6.8" + "@jimp/plugin-dither" "^0.6.8" + "@jimp/plugin-flip" "^0.6.8" + "@jimp/plugin-gaussian" "^0.6.8" + "@jimp/plugin-invert" "^0.6.8" + "@jimp/plugin-mask" "^0.6.8" + "@jimp/plugin-normalize" "^0.6.8" + "@jimp/plugin-print" "^0.6.8" + "@jimp/plugin-resize" "^0.6.8" + "@jimp/plugin-rotate" "^0.6.8" + "@jimp/plugin-scale" "^0.6.8" + core-js "^2.5.7" + timm "^1.6.1" + +"@jimp/png@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.6.8.tgz#ee06cf078b381137ec7206c4bb1b4cfcbe15ca6f" + integrity sha512-JHHg/BZ7KDtHQrcG+a7fztw45rdf7okL/YwkN4qU5FH7Fcrp41nX5QnRviDtD9hN+GaNC7kvjvcqRAxW25qjew== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + pngjs "^3.3.3" + +"@jimp/tiff@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.6.8.tgz#79bd22ed435edbe29d02a2c8c9bf829f988ebacc" + integrity sha512-iWHbxd+0IKWdJyJ0HhoJCGYmtjPBOusz1z1HT/DnpePs/Lo3TO4d9ALXqYfUkyG74ZK5jULZ69KLtwuhuJz1bg== + dependencies: + core-js "^2.5.7" + utif "^2.0.1" + +"@jimp/types@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.6.8.tgz#4510eb635cd00b201745d70e38f791748baa7075" + integrity sha512-vCZ/Cp2osy69VP21XOBACfHI5HeR60Rfd4Jidj4W73UL+HrFWOtyQiJ7hlToyu1vI5mR/NsUQpzyQvz56ADm5A== + dependencies: + "@jimp/bmp" "^0.6.8" + "@jimp/gif" "^0.6.8" + "@jimp/jpeg" "^0.6.8" + "@jimp/png" "^0.6.8" + "@jimp/tiff" "^0.6.8" + core-js "^2.5.7" + timm "^1.6.1" + +"@jimp/utils@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.6.8.tgz#09f794945631173567aa50f72ac28170de58a63d" + integrity sha512-7RDfxQ2C/rarNG9iso5vmnKQbcvlQjBIlF/p7/uYj72WeZgVCB+5t1fFBKJSU4WhniHX4jUMijK+wYGE3Y3bGw== + dependencies: + core-js "^2.5.7" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@types/cordova@^0.0.34": + version "0.0.34" + resolved "https://registry.yarnpkg.com/@types/cordova/-/cordova-0.0.34.tgz#ea7addf74ecec3d7629827a0c39e2c9addc73d04" + integrity sha1-6nrd907Ow9dimCegw54smt3HPQQ= + +"@types/filesystem@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz#ee3748eb5be140dcf980c3bd35f11aec5f7a3748" + integrity sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.28" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3" + integrity sha1-wFTor02d11205jq8dviFFocU1LM= + +"@types/node@^12.7.5": + version "12.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f" + integrity sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.1.tgz#3fa17797032b71410ec372e11668f4b4ffc86a82" + integrity sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + 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" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= + 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" + integrity sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw== + dependencies: + acorn "^5.0.3" + +acorn-jsx@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" + integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== + +acorn-walk@^6.0.1, acorn-walk@^6.1.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^5.0.3, acorn@^5.5.0, acorn@^5.6.0: + version "5.7.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.7, acorn@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" + integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^4.7.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + 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" + +ajv@^6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-colors@^4.1.0, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= + +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-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +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@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +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" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +any-base@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" + integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + +archive-type@^3.0.0, archive-type@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" + integrity sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y= + dependencies: + file-type "^3.1.0" + +archive-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" + integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA= + dependencies: + file-type "^4.2.0" + +archiver@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.11.0.tgz#98177da7a6c0192b7f2798f30cd6eab8abd76690" + integrity sha1-mBd9p6bAGSt/J5jzDNbquKvXZpA= + dependencies: + async "~0.9.0" + buffer-crc32 "~0.2.1" + glob "~3.2.6" + lazystream "~0.1.0" + lodash "~2.4.1" + readable-stream "~1.0.26" + tar-stream "~0.4.0" + zip-stream "~0.4.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +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" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + 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" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + 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" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +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" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +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" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-uniq@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" + integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asar@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/asar/-/asar-2.0.1.tgz#8518a1c62c238109c15a5f742213e83a09b9fd38" + integrity sha512-Vo9yTuUtyFahkVMFaI6uMuX6N7k5DWa6a/8+7ov0/f8Lq9TVR0tUjzSzxQSxT1Y+RJIZgnP7BVb6Uhi+9cjxqA== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^2.20.0" + cuint "^0.2.2" + glob "^7.1.3" + minimatch "^3.0.4" + mkdirp "^0.5.1" + tmp-promise "^1.0.5" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.1.tgz#ecc73f75d31ea3c6ed9d47428db35fecc7b2c6dc" + integrity sha1-7Mc/ddMeo8btnUdCjbNf7Meyxtw= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +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" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assets@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/assets/-/assets-3.0.1.tgz#7a69f4bcc3aca9702760e2a73a7e76ca93e9e3e0" + integrity sha512-fTyLNf/9V24y5zO83f4DAEuvaKj7MWBixbnqdZneAhsv1r21yQ/6ogZfvXHmphJAHsz4DhuOwHeJKVbGqqvk0Q== + dependencies: + async "^2.5.0" + bluebird "^3.4.6" + calipers "^2.0.0" + calipers-gif "^2.0.0" + calipers-jpeg "^2.0.0" + calipers-png "^2.0.0" + calipers-svg "^2.0.0" + calipers-webp "^2.0.0" + glob "^7.0.6" + lodash "^4.15.0" + mime "^2.4.0" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= + +async-each-series@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" + integrity sha1-9C/YFV048hpbjqB8KOBj7RcAsTg= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async.queue@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.queue/-/async.queue-0.5.2.tgz#8d5d90812e1481066bc0904e8cc1712b17c3bd7c" + integrity sha1-jV2QgS4UgQZrwJBOjMFxKxfDvXw= + dependencies: + async.util.queue "0.5.2" + +async.util.arrayeach@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.util.arrayeach/-/async.util.arrayeach-0.5.2.tgz#58c4e98028d55d69bfb05aeb3af44e0a555a829c" + integrity sha1-WMTpgCjVXWm/sFrrOvROClVagpw= + +async.util.isarray@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.util.isarray/-/async.util.isarray-0.5.2.tgz#e62dac8f2636f65875dcf7521c2d24d0dfb2bbdf" + integrity sha1-5i2sjyY29lh13PdSHC0k0N+yu98= + +async.util.map@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.util.map/-/async.util.map-0.5.2.tgz#e588ef86e0b3ab5f027d97af4d6835d055ca69d6" + integrity sha1-5YjvhuCzq18CfZevTWg10FXKadY= + +async.util.noop@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.util.noop/-/async.util.noop-0.5.2.tgz#bdd62b97cb0aa3f60b586ad148468698975e58b9" + integrity sha1-vdYrl8sKo/YLWGrRSEaGmJdeWLk= + +async.util.onlyonce@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz#b8e6fc004adc923164d79e32f2813ee465c24ff2" + integrity sha1-uOb8AErckjFk154y8oE+5GXCT/I= + +async.util.queue@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.util.queue/-/async.util.queue-0.5.2.tgz#57f65abe1a3cdf273d31abd28ab95425f8222ee5" + integrity sha1-V/Zavho83yc9MavSirlUJfgiLuU= + dependencies: + async.util.arrayeach "0.5.2" + async.util.isarray "0.5.2" + async.util.map "0.5.2" + async.util.noop "0.5.2" + async.util.onlyonce "0.5.2" + async.util.setimmediate "0.5.2" + +async.util.setimmediate@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/async.util.setimmediate/-/async.util.setimmediate-0.5.2.tgz#2812ebabf2a58027758d4bc7793d1ccfaf10255f" + integrity sha1-KBLrq/KlgCd1jUvHeT0cz68QJV8= + +async@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@>=0.2.9: + version "3.1.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.1.0.tgz#42b3b12ae1b74927b5217d8c0016baaf62463772" + integrity sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ== + +async@^2.5.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +async@~0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + +async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + +async@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" + integrity sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw= + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +author-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" + integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA= + +autoprefixer@^9.4.3, autoprefixer@^9.4.7, autoprefixer@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47" + integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== + dependencies: + browserslist "^4.6.3" + caniuse-lite "^1.0.30000980" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.17" + postcss-value-parser "^4.0.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +axios@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + +babel-loader@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-closure-elimination@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-closure-elimination/-/babel-plugin-closure-elimination-1.3.0.tgz#3217fbf6d416dfdf14ff41a8a34e4d0a6bfc22b2" + integrity sha512-ClKuSxKLLNhe69bvTMuONDI0dQDW49lXB2qtQyyKCzvwegRGel/q4/e+1EoDNDN97Hf1QkxGMbzpAGPmU4Tfjw== + +babel-plugin-console-source@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-console-source/-/babel-plugin-console-source-2.0.4.tgz#263985b1d69b68e463358d087fa877dd967c5f41" + integrity sha512-OGhrdhuMjiEW0Ma0P9e2B4dFddCpJ/xN/RRaM/4wwDLl+6ZKf+Xd77FtVjpNeDzNRNk8wjRdStA4hpZizXzl1g== + +babel-plugin-danger-remove-unused-import@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-danger-remove-unused-import/-/babel-plugin-danger-remove-unused-import-1.1.2.tgz#ac39c30edfe524ef8cfc411fec5edc479d19e132" + integrity sha512-3bNmVAaakP3b1aROj7O3bOWj2kBa85sZR5naZ3Rn8L9buiZaAyZLgjfrPDL3zhX4wySOA5jrTm/wSmJPsMm3cg== + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + integrity sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0= + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-runtime@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-runtime@^7.0.0-beta.3: + version "7.0.0-beta.3" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-7.0.0-beta.3.tgz#7c750de5514452c27612172506b49085a4a630f2" + integrity sha512-jlzZ8RACjt0QGxq+wqsw5bCQE9RcUyWpw987mDY3GYxTpOQT2xoyNoG++oVCHzr/nACLBIprfVBNvv/If1ZYcg== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2, base64-js@^1.2.3: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + 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" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bin-build@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc" + integrity sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw= + dependencies: + archive-type "^3.0.1" + decompress "^3.0.0" + download "^4.1.2" + exec-series "^1.0.0" + rimraf "^2.2.6" + tempfile "^1.0.0" + url-regex "^3.0.0" + +bin-build@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861" + integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA== + dependencies: + decompress "^4.0.0" + download "^6.2.2" + execa "^0.7.0" + p-map-series "^1.0.0" + tempfile "^2.0.0" + +bin-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930" + integrity sha1-hvjm9CU4k99g3DFpV/WvAqywWTA= + dependencies: + executable "^1.0.0" + +bin-check@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" + integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== + dependencies: + execa "^0.7.0" + executable "^4.1.0" + +bin-version-check@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" + integrity sha1-5OXfKQuQaffRETJAMe/BP90RpbA= + dependencies: + bin-version "^1.0.0" + minimist "^1.1.0" + semver "^4.0.3" + semver-truncate "^1.0.0" + +bin-version-check@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71" + integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ== + dependencies: + bin-version "^3.0.0" + semver "^5.6.0" + semver-truncate "^1.1.2" + +bin-version@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" + integrity sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144= + dependencies: + find-versions "^1.0.0" + +bin-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839" + integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ== + dependencies: + execa "^1.0.0" + find-versions "^3.0.0" + +bin-wrapper@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb" + integrity sha1-Z9MwYmLksaXy+I7iNGT2plVneus= + dependencies: + bin-check "^2.0.0" + bin-version-check "^2.1.0" + download "^4.0.0" + each-async "^1.1.1" + lazy-req "^1.0.0" + os-filter-obj "^1.0.0" + +bin-wrapper@^4.0.0, bin-wrapper@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605" + integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q== + dependencies: + bin-check "^4.1.0" + bin-version-check "^4.0.0" + download "^7.1.0" + import-lazy "^3.1.0" + os-filter-obj "^2.0.0" + pify "^4.0.1" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bl@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.7.0.tgz#3fb0670602ac2878eb770dc2039f1836be62ae5b" + integrity sha1-P7BnBgKsKHjrdw3CA58YNr5irls= + dependencies: + readable-stream "~1.0.2" + +bl@^0.9.0: + version "0.9.5" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" + integrity sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ= + dependencies: + readable-stream "~1.0.26" + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@3.x.x, bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +bmp-js@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" + integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= + +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" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +body-parser@~1.8.0: + version "1.8.4" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.8.4.tgz#d497e04bc13b3f9a8bd8c70bb0cdc16f2e028898" + integrity sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg= + dependencies: + bytes "1.0.0" + depd "0.4.5" + iconv-lite "0.4.4" + media-typer "0.3.0" + on-finished "2.1.0" + qs "2.2.4" + raw-body "1.3.0" + type-is "~1.5.1" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + 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" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + 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" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +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" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-sync-client@^2.26.6: + version "2.26.6" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.6.tgz#e5201d3ace8aee88af17656b7b0c0620b6f8e4ab" + integrity sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw== + dependencies: + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + rxjs "^5.5.6" + +browser-sync-ui@^2.26.4: + version "2.26.4" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz#3772f13c6b93f2d7d333f4be0ca1ec02aae97dba" + integrity sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA== + dependencies: + async-each-series "0.1.1" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^2.0.4" + stream-throttle "^0.1.3" + +browser-sync@^2.24.6: + version "2.26.7" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.7.tgz#120287716eb405651a76cc74fe851c31350557f9" + integrity sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w== + dependencies: + browser-sync-client "^2.26.6" + browser-sync-ui "^2.26.4" + bs-recipes "1.3.4" + bs-snippet-injector "^2.0.1" + chokidar "^2.0.4" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "^3" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "1.15.2" + immutable "^3" + localtunnel "1.9.2" + micromatch "^3.1.10" + opn "5.3.0" + portscanner "2.1.1" + qs "6.2.3" + raw-body "^2.3.2" + resp-modifier "6.0.2" + rx "4.1.0" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" + server-destroy "1.0.1" + socket.io "2.1.1" + ua-parser-js "0.7.17" + yargs "6.4.0" + +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" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + 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" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + 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" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + 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" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + 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" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + 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" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.6.6: + version "4.7.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" + integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== + dependencies: + caniuse-lite "^1.0.30000989" + electron-to-chromium "^1.3.247" + node-releases "^1.1.29" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU= + +bs-snippet-injector@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" + integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU= + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.1, buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-to-vinyl@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" + integrity sha1-APFfruOreh3aLN5tkSG//dB7ImI= + dependencies: + file-type "^3.1.0" + readable-stream "^2.0.2" + uuid "^2.0.1" + vinyl "^1.0.0" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.2.0, buffer@^5.2.1: + version "5.4.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" + integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +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" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@1, bytes@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + 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" + +cache-swap@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/cache-swap/-/cache-swap-0.3.0.tgz#1c541aa108a50106f630bdd98fe1dec8ba133f51" + integrity sha1-HFQaoQilAQb2ML3Zj+HeyLoTP1E= + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.1" + object-assign "^4.0.1" + rimraf "^2.4.0" + +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +calipers-gif@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-gif/-/calipers-gif-2.0.0.tgz#b5eefec3064a77c6dcdbd5bdc51735a01bafdc37" + integrity sha1-te7+wwZKd8bc29W9xRc1oBuv3Dc= + dependencies: + bluebird "3.x.x" + +calipers-jpeg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-jpeg/-/calipers-jpeg-2.0.0.tgz#06d56a53f62717dd809cb956cf64423ce693465b" + integrity sha1-BtVqU/YnF92AnLlWz2RCPOaTRls= + dependencies: + bluebird "3.x.x" + +calipers-png@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-png/-/calipers-png-2.0.0.tgz#1d0d20e5c1ae5f79b74d5286a2e97f59bb70b658" + integrity sha1-HQ0g5cGuX3m3TVKGoul/Wbtwtlg= + dependencies: + bluebird "3.x.x" + +calipers-svg@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/calipers-svg/-/calipers-svg-2.0.1.tgz#cd9eaa58ef7428c1a14f5da57e56715fb60f6541" + integrity sha512-3PROqHARmj8wWudUC7DzXm1+mSocqgY7jNuehFNHgrUVrKf8o7MqDjS92vJz5LvZsAofJsoAFMajkqwbxBROSQ== + dependencies: + bluebird "3.x.x" + +calipers-webp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-webp/-/calipers-webp-2.0.0.tgz#e126ece2f84cd71779612bfa2b2653cd95cea77a" + integrity sha1-4Sbs4vhM1xd5YSv6KyZTzZXOp3o= + dependencies: + bluebird "3.x.x" + +calipers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/calipers/-/calipers-2.0.1.tgz#0d3f303ce75ec5f1eda7fecfc7dba6736e35c926" + integrity sha512-AP4Ui2Z8fZf69d8Dx4cfJgPjQHY3m+QXGFCaAGu8pfNQjyajkosS+Kkf1n6pQDMZcelN5h3MdcjweUqxcsS4pg== + dependencies: + bluebird "3.x.x" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.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" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + dependencies: + callsites "^0.2.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + 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" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.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.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989: + version "1.0.30000989" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" + integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +caw@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" + integrity sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ= + dependencies: + get-proxy "^1.0.1" + is-obj "^1.0.0" + object-assign "^3.0.0" + tunnel-agent "^0.4.0" + +caw@^2.0.0, caw@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" + integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== + dependencies: + get-proxy "^2.0.0" + isurl "^1.0.0-alpha5" + tunnel-agent "^0.6.0" + url-to-options "^1.0.1" + +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" + integrity sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chance@1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.13.tgz#666bec2db42b3084456a3e4f4c28a82db5ccb7e6" + integrity sha512-9cpcgmAIQiXC0eMgQuMZgXuHR2Y+gKUyGQnalqSAg5LlUJyJFsZeKyuHVSGhj+bx18ppH+Jo3VOayNeXR/7p9Q== + +chance@1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.16.tgz#bd61912716b0010c3dca8e3948a960efcaa7bb1b" + integrity sha512-2bgDHH5bVfAXH05SPtjqrsASzZ7h90yCuYT2z4mkYpxxYvJXiIydBFzVieVHZx7wLH1Ag2Azaaej2/zA1XUrNQ== + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +chokidar@^2.0.2, chokidar@^2.0.4: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" + integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= + +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" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-dependency-plugin@^5.0.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" + integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw== + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + +circular-json@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +class-validator@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.8.5.tgz#484785acda98f68549c3a84dc1bb2f77b736dc58" + integrity sha512-84yezRo44aP4oGhvPmqj6obAFQF1NzUyfR0+f8jubzdAspO5pmjpHhBBlPf335epUskzXAFe5uo4Qf+c7SI+DA== + dependencies: + validator "9.2.0" + +class-validator@0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.9.1.tgz#d60e58c5d14abca0a41bce38cf792ad4c46d1531" + integrity sha512-3wApflrd3ywVZyx4jaasGoFt8pmo4aGLPPAEKCKCsTRWVGPilahD88q3jQjRQwja50rl9a7rsP5LAxJYwGK8/Q== + dependencies: + google-libphonenumber "^3.1.6" + validator "10.4.0" + +clean-css@4.2.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== + dependencies: + source-map "~0.6.0" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +clone-response@1.0.2, clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= + +clone@^1.0.0, clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.1, clone@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +co@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" + integrity sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +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" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + +commander@2.17.1, commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commander@^2.18.0, commander@^2.19.0, commander@^2.2.0, commander@^2.20.0, commander@^2.8.1: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commander@~2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@~2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compress-commons@~0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3" + integrity sha1-DHQIcP3ljLpRbwrAyCLjOguF36M= + dependencies: + buffer-crc32 "~0.2.1" + crc32-stream "~0.3.1" + readable-stream "~1.0.26" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.4.8, concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@^1.1.11, config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +connect-history-api-fallback@^1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect-livereload@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.4.1.tgz#0f8a1a816bc9baffae4637ccea917462fe35917a" + integrity sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo= + +connect@3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +connect@^3.0.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + 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" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +console-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" + integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3, content-disposition@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.1.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" + integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A== + dependencies: + browserslist "^4.6.6" + semver "^6.3.0" + +core-js@3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" + integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== + +core-js@^2.4.0, core-js@^2.5.3, core-js@^2.5.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + +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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +crc32-stream@~0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552" + integrity sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI= + dependencies: + buffer-crc32 "~0.2.1" + readable-stream "~1.0.24" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.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" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + 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" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + 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" + +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-zip@^2.1.5: + version "2.1.6" + resolved "https://registry.yarnpkg.com/cross-zip/-/cross-zip-2.1.6.tgz#344d3ba9488609942987d815bb84860cff3d9491" + integrity sha512-xLIETNkzRcU6jGRzenJyRFxahbtP4628xEKMTI/Ql0Vu8m4h8M7uRLVi7E5OYHuJ6VQPsG4icJumKAFUvfm0+A== + dependencies: + rimraf "^3.0.0" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + 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" + +crypto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" + integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.9.1.tgz#2e1aa00ce7e30ef2c6a7a4b300a080a7c979e0dc" + integrity sha1-LhqgDOfjDvLGp6SzAKCAp8l54Nw= + dependencies: + csso "1.3.x" + loader-utils "~0.2.2" + source-map "~0.1.38" + +css-mqpacker@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/css-mqpacker/-/css-mqpacker-7.0.0.tgz#48f4a0ff45b81ec661c4a33ed80b9db8a026333b" + integrity sha512-temVrWS+sB4uocE2quhW8ru/KguDmGhCU7zN213KxtDvWOH3WS/ZUStfpF4fdCT7W8fPpFrQdWRFqtFtPPfBLA== + dependencies: + minimist "^1.2.0" + postcss "^7.0.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.33: + version "1.0.0-alpha.33" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e" + integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w== + dependencies: + mdn-data "2.0.4" + source-map "^0.5.3" + +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" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-what@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +cssbeautify@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssbeautify/-/cssbeautify-0.3.1.tgz#12dd1f734035c2e6faca67dcbdcef74e42811397" + integrity sha1-Et0fc0A1wub6ymfcvc73TkKBE5c= + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +csslint@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/csslint/-/csslint-1.0.5.tgz#19cc3eda322160fd3f7232af1cb2a360e898a2e9" + integrity sha1-Gcw+2jIhYP0/cjKvHLKjYOiYouk= + dependencies: + clone "~2.1.0" + parserlib "~1.1.1" + +cssnano-preset-advanced@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz#d981527b77712e2f3f3f09c73313e9b71b278b88" + integrity sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw== + dependencies: + autoprefixer "^9.4.7" + cssnano-preset-default "^4.0.7" + postcss-discard-unused "^4.0.1" + postcss-merge-idents "^4.0.1" + postcss-reduce-idents "^4.0.2" + postcss-zindex "^4.0.1" + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@1.3.x: + version "1.3.12" + resolved "https://registry.yarnpkg.com/csso/-/csso-1.3.12.tgz#fc628694a2d38938aaac4996753218fd311cdb9e" + integrity sha1-/GKGlKLTiTiqrEmWdTIY/TEc254= + +csso@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + +cssom@0.3.x, cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + 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" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +dateformat@^1.0.11, dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= + +debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@=3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@~0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.8.1.tgz#20ff4d26f5e422cb68a1bacbbb61039ad8c1c130" + integrity sha1-IP9NJvXkIstoobrLu2EDmtjBwTA= + +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +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" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +decompress-tar@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" + integrity sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY= + dependencies: + is-tar "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" + integrity sha1-iyOTVoE1X58YnYclag+L3ZbZZm0= + dependencies: + is-bzip2 "^1.0.0" + object-assign "^2.0.0" + seek-bzip "^1.0.3" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" + integrity sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA= + dependencies: + is-gzip "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-targz@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" + integrity sha1-YUdbQVIGa74/7hL51inRX+ZHjus= + dependencies: + is-zip "^1.0.0" + read-all-stream "^3.0.0" + stat-mode "^0.2.0" + strip-dirs "^1.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + yauzl "^2.2.1" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" + integrity sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0= + dependencies: + buffer-to-vinyl "^1.0.0" + concat-stream "^1.4.6" + decompress-tar "^3.0.0" + decompress-tarbz2 "^3.0.0" + decompress-targz "^3.0.0" + decompress-unzip "^3.0.0" + stream-combiner2 "^1.1.1" + vinyl-assign "^1.0.1" + vinyl-fs "^2.2.0" + +decompress@^4.0.0, decompress@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" + integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deep-scope-analyser@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/deep-scope-analyser/-/deep-scope-analyser-1.7.0.tgz#23015b3a1d23181b1d9cebd25b783a7378ead8da" + integrity sha512-rl5Dmt2IZkFpZo6XbEY1zG8st2Wpq8Pi/dV2gz8ZF6BDYt3fnor2JNxHwdO1WLo0k6JbmYp0x8MNy8kE4l1NtA== + dependencies: + esrecurse "^4.2.1" + estraverse "^4.2.0" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" + integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + 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" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + 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" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +delete-empty@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/delete-empty/-/delete-empty-3.0.0.tgz#f8040f2669f26fa7060bc2304e9859c593b685e8" + integrity sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ== + dependencies: + ansi-colors "^4.1.0" + minimist "^1.2.0" + path-starts-with "^2.0.0" + rimraf "^2.6.2" + +depd@0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/depd/-/depd-0.4.5.tgz#1a664b53388b4a6573e8ae67b5f767c693ca97f1" + integrity sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk= + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + 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" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA= + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +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-serializer@0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" + integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +download@^4.0.0, download@^4.1.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" + integrity sha1-qlX9rTktldS2jowr4D4MKqIbqaw= + dependencies: + caw "^1.0.1" + concat-stream "^1.4.7" + each-async "^1.0.0" + filenamify "^1.0.1" + got "^5.0.0" + gulp-decompress "^1.2.0" + gulp-rename "^1.2.0" + is-url "^1.2.0" + object-assign "^4.0.1" + read-all-stream "^3.0.0" + readable-stream "^2.0.2" + stream-combiner2 "^1.1.1" + vinyl "^1.0.0" + vinyl-fs "^2.2.0" + ware "^1.2.0" + +download@^6.2.2: + version "6.2.5" + resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714" + integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA== + dependencies: + caw "^2.0.0" + content-disposition "^0.5.2" + decompress "^4.0.0" + ext-name "^5.0.0" + file-type "5.2.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^7.0.0" + make-dir "^1.0.0" + p-event "^1.0.0" + pify "^3.0.0" + +download@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233" + integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ== + dependencies: + archive-type "^4.0.0" + caw "^2.0.1" + content-disposition "^0.5.2" + decompress "^4.2.0" + ext-name "^5.0.0" + file-type "^8.1.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^8.3.1" + make-dir "^1.2.0" + p-event "^2.1.0" + pify "^3.0.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + +duplexer2@^0.1.4, duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-async@^1.0.0, each-async@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" + integrity sha1-3uUim98KtrogEqOV4bhpq/iBNHM= + dependencies: + onetime "^1.0.0" + set-immediate-shim "^1.0.0" + +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== + dependencies: + lodash "^4.17.10" + +eazy-logger@^3: + version "3.0.2" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" + integrity sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw= + dependencies: + tfunk "^3.0.1" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +ee-first@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.0.5.tgz#8c9b212898d8cd9f1a9436650ce7be202c9e9ff0" + integrity sha1-jJshKJjYzZ8alDZlDOe+ICyen/A= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" + integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== + +electron-notarize@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-0.1.1.tgz#c3563d70c5e7b3315f44e8495b30050a8c408b91" + integrity sha512-TpKfJcz4LXl5jiGvZTs5fbEx+wUFXV5u8voeG5WCHWfY/cdgdD8lDZIZRqLVOtR3VO+drgJ9aiSHIO9TYn/fKg== + dependencies: + debug "^4.1.1" + fs-extra "^8.0.1" + +electron-osx-sign@^0.4.11: + version "0.4.13" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.13.tgz#4f77f0ff2f5cd71b91c1e6ce550c3a2937ebbef2" + integrity sha512-+44lasF26lSBLh9HDG6TGpPjuqqtWGD9Pcp+YglE8gyf1OGYdbW8UCIshKPh69O/AcdvDB0ohaTYQz3nbGPbtw== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-packager@^14.0.6: + version "14.0.6" + resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-14.0.6.tgz#e187f2ef83cc29a97a0f940b7c3bb5e4edc8a8e2" + integrity sha512-X+ikV+TnnNkIrK93vOjsjPeykCQBFxBS7LXKMTE1s62rXWirGMdjWL+edVkBOMRkH0ROJyFmWM28Dpj6sfEg+A== + dependencies: + "@electron/get" "^1.3.0" + asar "^2.0.1" + cross-zip "^2.1.5" + debug "^4.0.1" + electron-notarize "^0.1.1" + electron-osx-sign "^0.4.11" + fs-extra "^8.1.0" + galactus "^0.2.1" + get-package-info "^1.0.0" + junk "^3.1.0" + parse-author "^2.0.0" + plist "^3.0.0" + rcedit "^2.0.0" + resolve "^1.1.6" + sanitize-filename "^1.6.0" + semver "^6.0.0" + yargs-parser "^13.0.0" + +electron-to-chromium@^1.3.247: + version "1.3.264" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.264.tgz#ed837f44524d0601a7b2b7b6efd86e35753d0e27" + integrity sha512-z8E7WkrrquCuGYv+kKyybuZIbdms+4PeHp7Zm2uIgEhAigP0bOwqXILItwj0YO73o+QyHY/7XtEfP5DsHOWQgQ== + +elliptic@^6.0.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" + integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg== + 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" + +email-validator@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" + integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + 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" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8= + dependencies: + once "~1.3.0" + +engine.io-client@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-client@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.0.tgz#82a642b42862a9b3f7a188f41776b2deab643700" + integrity sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~4.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io-parser@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" + integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" + integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + +enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + 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" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.1: + version "1.14.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.2.tgz#7ce108fad83068c8783c3cdf62e504e084d8c497" + integrity sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.0" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.0.0" + string.prototype.trimright "^2.0.0" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@~0.10.14: + version "0.10.51" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f" + integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + +es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.2.tgz#859fdd34f32e905ff06d752e7171ddd4444a7ed1" + integrity sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ== + dependencies: + d "^1.0.1" + es5-ext "^0.10.51" + +es6-templates@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" + integrity sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ= + dependencies: + recast "~0.11.12" + through "~2.3.6" + +es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.0, 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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen-wallaby@1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/escodegen-wallaby/-/escodegen-wallaby-1.6.18.tgz#95a41e2fdc88687466e43550c7bf136386fd4363" + integrity sha512-3UvR14JRNh8VfKJixTDHWmhPNKAJiVZS807KUjECBk6f05WMe8ZeWL1gbrswNYhDiAUeDBQccyTWR91fayx3og== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escodegen-wallaby@1.6.19: + version "1.6.19" + resolved "https://registry.yarnpkg.com/escodegen-wallaby/-/escodegen-wallaby-1.6.19.tgz#acd6bbd73f9270763e18570cdc13c0d694759a23" + integrity sha512-q+JGvR5+NR+EJBLnGAevCk5PIiIhPkUFCvcm6w9MWYtm8sv4FdGUsgzWsY6At/YHkgMyA366sjphA/JTNC8CeQ== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escodegen@^1.11.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +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" + +eslint-utils@^1.3.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + dependencies: + eslint-visitor-keys "^1.0.0" + +eslint-visitor-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^2.7.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11" + integrity sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE= + dependencies: + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.2" + es6-map "^0.1.3" + escope "^3.6.0" + espree "^3.1.6" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^1.1.1" + glob "^7.0.3" + globals "^9.2.0" + ignore "^3.1.2" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + optionator "^0.8.1" + path-is-absolute "^1.0.0" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.6.0" + strip-json-comments "~1.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +eslint@^5.9.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.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + 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.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + 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" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@3.5.4, espree@^3.1.6: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== + 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" + integrity sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg== + dependencies: + acorn "^5.6.0" + acorn-jsx "^4.1.1" + +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.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + +esprima@^3.1.3, esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0, esrecurse@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= + +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +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" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" + integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA== + dependencies: + execa "^0.7.0" + p-finally "^1.0.0" + pify "^3.0.0" + rimraf "^2.5.4" + tempfile "^2.0.0" + +exec-series@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a" + integrity sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo= + dependencies: + async-each-series "^1.1.0" + object-assign "^4.1.0" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + 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" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + 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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +executable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9" + integrity sha1-h3mA6REvM5EGbaNyZd562ENKtNk= + dependencies: + meow "^3.1.0" + +executable@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +exif-parser@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + 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" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext-list@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" + integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== + dependencies: + mime-db "^1.28.0" + +ext-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" + integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== + dependencies: + ext-list "^2.0.0" + sort-keys-length "^1.0.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + 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" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + 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" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + 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" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fancy-log@^1.1.0, fancy-log@^1.2.0, fancy-log@^1.3.2, fancy-log@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +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" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +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" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastdom@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.9.tgz#b395fab11a3701173c02a054fe769d8f596a0a26" + integrity sha512-SSp4fbVzu8JkkG01NUX+0iOwe9M5PN3MGIQ84txLf4TkkJG4q30khkzumKgi4hUqO1+jX6wLHfnCPoZ6eSZ6Tg== + dependencies: + strictdom "^1.0.1" + +faster.js@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/faster.js/-/faster.js-1.1.1.tgz#8bbd7eefdb8f03faac26ad5025b059f94c5cfb4d" + integrity sha512-vPThNSLL/E1f7cLHd9yuayxZR82o/Iic4S5ZY45iY5AgBLNIlr3b3c+VpDjoYqjY9a9C/FQVUQy9oTILVP7X0g== + +fastparse@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +faye-websocket@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" + integrity sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE= + dependencies: + websocket-driver ">=0.3.6" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^1.1.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" + integrity sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +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 "^2.0.1" + +file-loader@^0.8.1: + version "0.8.5" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.8.5.tgz#9275d031fe780f27d47f5f4af02bd43713cc151b" + integrity sha1-knXQMf54DyfUf19K8CvUNxPMFRs= + dependencies: + loader-utils "~0.2.5" + +file-type@5.2.0, file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + +file-type@^10.4.0, file-type@^10.7.0: + version "10.11.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890" + integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== + +file-type@^3.1.0, file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +file-type@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" + integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== + +file-type@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" + integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== + +file-type@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" + integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +filename-reserved-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" + integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q= + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" + integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU= + dependencies: + filename-reserved-regex "^1.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +filenamify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" + integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + 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" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + 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" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-versions@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" + integrity sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I= + dependencies: + array-uniq "^1.0.0" + get-stdin "^4.0.1" + meow "^3.5.0" + semver-regex "^1.0.0" + +find-versions@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.1.0.tgz#10161f29cf3eb4350dec10a29bdde75bff0df32d" + integrity sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q== + dependencies: + array-uniq "^2.1.0" + semver-regex "^2.0.0" + +findup-sync@3.0.0, findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flat-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + 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, flatted@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= + +flora-colossus@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-1.0.1.tgz#aba198425a8185341e64f9d2a6a96fd9a3cbdb93" + integrity sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA== + dependencies: + debug "^4.1.1" + fs-extra "^7.0.0" + +fluent-ffmpeg@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz#c952de2240f812ebda0aa8006d7776ee2acf7d74" + integrity sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ= + dependencies: + async ">=0.2.9" + which "^1.1.1" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +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" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + 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" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-stream@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" + integrity sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + 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" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0, from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +front-matter@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb" + integrity sha1-91mDufL0E75ljJPf172M5AePXNs= + dependencies: + js-yaml "^3.4.6" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@3.0.1, fs-extra@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-extra@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.0.1, fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +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" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + 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" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +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" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +galactus@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/galactus/-/galactus-0.2.1.tgz#cbed2d20a40c1f5679a35908e2b9415733e78db9" + integrity sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk= + dependencies: + debug "^3.1.0" + flora-colossus "^1.0.0" + fs-extra "^4.0.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8= + dependencies: + globule "~0.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +generate-function@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== + dependencies: + is-property "^1.0.2" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA= + dependencies: + is-property "^1.0.0" + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +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" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c" + integrity sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw= + dependencies: + bluebird "^3.1.1" + debug "^2.2.0" + lodash.get "^4.0.0" + read-pkg-up "^2.0.0" + +get-proxy@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" + integrity sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus= + dependencies: + rc "^1.1.2" + +get-proxy@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" + integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== + dependencies: + npm-conf "^1.1.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@3.0.0, get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +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" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +gifsicle@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-4.0.1.tgz#30e1e61e3ee4884ef702641b2e98a15c2127b2e2" + integrity sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.0" + execa "^1.0.0" + logalot "^2.0.0" + +glob-all@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" + integrity sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs= + dependencies: + glob "^7.0.5" + yargs "~1.2.6" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + 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" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.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" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs= + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + integrity sha1-pVZlqajM3EGRWofHAeMtTgFvrSI= + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs= + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= + dependencies: + find-index "^0.1.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + 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.0.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + 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" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +glob@~3.2.6: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= + dependencies: + inherits "2" + minimatch "0.3" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.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" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +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@^9.2.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globby@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU= + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" + integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== + dependencies: + sparkles "^1.0.0" + +gonzales-pe-sl@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6" + integrity sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y= + dependencies: + minimist "1.1.x" + +gonzales-pe@^4.2.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2" + integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ== + dependencies: + minimist "1.1.x" + +google-libphonenumber@^3.1.6: + version "3.2.5" + resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.5.tgz#2ebe6437fd3dbbffd65f4339ad1ba93b3dc56836" + integrity sha512-Y0r7MFCI11UDLn0KaMPBEInhROyIOkWkQIyvWMFVF2I+h+sHE3vbl5a7FVe39td6u/w+nlKDdUMP9dMOZyv+2Q== + +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + integrity sha1-X4FjWmHkplifGAVp6k44FoClHzU= + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" + +got@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +got@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^3.0.0: + version "3.0.12" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" + integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== + dependencies: + natives "^1.1.3" + +graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" + integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +gulp-cache@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gulp-cache/-/gulp-cache-1.1.3.tgz#7c427670aad4d25364c3cc9c53e492b348190d27" + integrity sha512-NE814LdX1NWQn2sMzn+Rf673o4mqlgg7OyLf92oQ4KEl6DdPfduEGLNH+HexLVcFZXH93DBuxFOvpv4/Js5VaA== + dependencies: + "@babel/runtime" "^7.5.5" + cache-swap "^0.3.0" + core-js "3" + object.pick "^1.3.0" + plugin-error "^1.0.1" + through2 "3.0.1" + vinyl "^2.2.0" + +gulp-cached@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz#fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce" + integrity sha1-/nzU+H83YB5gc8/t7lwr2vi2rM4= + dependencies: + lodash.defaults "^4.2.0" + through2 "^2.0.1" + +gulp-clean@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.4.0.tgz#3bc25e7084e641bbd7bde057cf90c01c50d95950" + integrity sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ== + dependencies: + fancy-log "^1.3.2" + plugin-error "^0.1.2" + rimraf "^2.6.2" + through2 "^2.0.3" + vinyl "^2.1.0" + +gulp-cssbeautify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gulp-cssbeautify/-/gulp-cssbeautify-1.0.1.tgz#136903ab47e8d6c14ec1306acd1064433c5cc592" + integrity sha512-6eMR1sqbdm0O5WLdnM3nDxFJc4XkdOJcYDPv2XGnDeSF05ed3PpJlJNVTBW+l5Yl6m9tUn6L17x/vnjx9MALwA== + dependencies: + cssbeautify "^0.3.1" + plugin-error "^1.0.1" + through2 "^2.0.3" + +gulp-csslint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gulp-csslint/-/gulp-csslint-1.0.1.tgz#112a908f7aef98efc27b7bd00801f13a77becb93" + integrity sha512-Rec56+RpCGg7feK3d/S45oqgxyLV3end0ed+UjWFv6YziQae2Bp4DNSDobwEvJdfCAsOhOSExEEB+jcfMx430w== + dependencies: + csslint "^1.0.2" + fancy-log "^1.3.2" + plugin-error "^1.0.1" + rcloader "^0.2.1" + through2 "^2.0.1" + vinyl "^2.1.0" + +gulp-decompress@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" + integrity sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc= + dependencies: + archive-type "^3.0.0" + decompress "^3.0.0" + gulp-util "^3.0.1" + readable-stream "^2.0.2" + +gulp-dom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-dom/-/gulp-dom-1.0.0.tgz#f834d5299c09b85e11c32505044a2ebe86ae1375" + integrity sha512-hD2w2t3fsjPicX2mT6MFFb+eP3FyCVtEHdejGMMH4+w9EBFxA2xIZadqlzYdAEdE+39dP1aGatuhdHJteUvn1A== + dependencies: + jsdom "12.2.0" + plugin-error "1.0.1" + through2 "2.0.3" + +gulp-flatten@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/gulp-flatten/-/gulp-flatten-0.4.0.tgz#d9ac819416c30fd5dfb3dea9da79c83a1bcd61d1" + integrity sha512-eg4spVTAiv1xXmugyaCxWne1oPtNG0UHEtABx5W8ScLiqAYceyYm6GYA36x0Qh8KOIXmAZV97L2aYGnKREG3Sg== + dependencies: + plugin-error "^0.1.2" + through2 "^2.0.0" + +gulp-fluent-ffmpeg@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gulp-fluent-ffmpeg/-/gulp-fluent-ffmpeg-1.0.2.tgz#1521b803254f17598274162cc536ae2a9b7cb8f7" + integrity sha1-FSG4AyVPF1mCdBYsxTauKpt8uPc= + dependencies: + concat-stream "^1.4.8" + fluent-ffmpeg "^2.0.1" + gulp-util "^3.0.4" + through2 "^0.6.5" + +gulp-html-beautify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gulp-html-beautify/-/gulp-html-beautify-1.0.1.tgz#2834c6f77669605726eee55e3205f63074b7a152" + integrity sha1-KDTG93ZpYFcm7uVeMgX2MHS3oVI= + dependencies: + js-beautify "^1.5.10" + rcloader "^0.1.4" + through2 "^2.0.0" + +gulp-htmlmin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-5.0.1.tgz#90fc5e8ad0425a9e86d5d521427184e7276365e7" + integrity sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA== + dependencies: + html-minifier "^3.5.20" + plugin-error "^1.0.1" + through2 "^2.0.3" + +gulp-if@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629" + integrity sha1-pJe351cwBQQcqivIt92jyARE1ik= + dependencies: + gulp-match "^1.0.3" + ternary-stream "^2.0.1" + through2 "^2.0.1" + +gulp-imagemin@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-5.0.3.tgz#b8236aff523eebd2d4b552a814a35df07ee710bc" + integrity sha512-bKJMix4r6EQPVV2u8sUglw6Rn0PSp6i70pSK2ECN7j0dRy0w/Lz5SBbynY3MfGBZ0cTMZlaUq+6LyKlZgP74Ew== + dependencies: + chalk "^2.4.1" + fancy-log "^1.3.2" + imagemin "^6.0.0" + plugin-error "^1.0.1" + plur "^3.0.1" + pretty-bytes "^5.1.0" + through2-concurrent "^2.0.0" + optionalDependencies: + imagemin-gifsicle "^6.0.1" + imagemin-jpegtran "^6.0.0" + imagemin-optipng "^6.0.0" + imagemin-svgo "^7.0.0" + +gulp-javascript-obfuscator@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/gulp-javascript-obfuscator/-/gulp-javascript-obfuscator-1.1.6.tgz#4615ce5adb6a0f846246aacea8e1402d8fe04e06" + integrity sha512-oiROhi7Zlu/0fM2h20jBFPaDOZicilT6kN+97Si82yieeFqr6l70o2R3gZ2Ah0u8v5IqGa+Pt8c2q3UnkMuk2A== + dependencies: + javascript-obfuscator latest + plugin-error "^1.0.1" + through2 "^2.0.0" + vinyl "^2.2.0" + +gulp-jsbeautifier@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/gulp-jsbeautifier/-/gulp-jsbeautifier-3.0.1.tgz#4b26991e0adf063130452c5d74910239fadbf254" + integrity sha512-zSXsXQy0/s6qjhhtTun+/ZfC/q8cz/fZpZmxoGPKpmxjuP7/F+oGpV/LHqtOAaWNo+WjcxLVey0cFoNrPZiHWg== + dependencies: + ansi-colors "^4.1.1" + cosmiconfig "^5.2.1" + fancy-log "^1.3.3" + js-beautify "^1.10.1" + lodash.mergewith "^4.6.2" + plugin-error "^1.0.1" + through2 "^3.0.1" + +gulp-load-plugins@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-load-plugins/-/gulp-load-plugins-1.6.0.tgz#2d060c42faf481141ef638431572923d8701bd0d" + integrity sha512-HlCODki0WHJvQIgAsJYOTkyo0c7TsDCetvfhrdGz9JYPL6A4mFRMGmKfoi6JmXjA/vvzg+fkT91c9FBh7rnkyg== + dependencies: + array-unique "^0.2.1" + fancy-log "^1.2.0" + findup-sync "^3.0.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + micromatch "^3.1.10" + resolve "^1.1.7" + +gulp-match@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.1.0.tgz#552b7080fc006ee752c90563f9fec9d61aafdf4f" + integrity sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ== + dependencies: + minimatch "^3.0.3" + +gulp-multi-process@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/gulp-multi-process/-/gulp-multi-process-1.3.1.tgz#e12aa818e4c234357ad99d5caff8df8a18f46e9e" + integrity sha512-okxYy3mxUkekM0RNjkBg8OPuzpnD2yXMAdnGOaQPSJ2wzBdE9R9pkTV+tzPZ65ORK7b57YUc6s+gROA4+EIOLg== + dependencies: + async.queue "^0.5.2" + +gulp-phonegap-build@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/gulp-phonegap-build/-/gulp-phonegap-build-0.1.5.tgz#36c145e63cd204702be0f3b99be19e096712bcaf" + integrity sha1-NsFF5jzSBHAr4PO5m+GeCWcSvK8= + dependencies: + archiver "~0.11.0" + gulp "~3.8.7" + gulp-util "~3.0.0" + lodash "~2.4.1" + needle "" + read "~1.0.4" + through2 "~0.6.1" + vinyl-buffer "0.0.0" + vinyl-source-stream "^0.1.1" + +gulp-plumber@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.1.tgz#d38700755a300b9d372318e4ffb5ff7ced0b2c84" + integrity sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ== + dependencies: + chalk "^1.1.3" + fancy-log "^1.3.2" + plugin-error "^0.1.2" + through2 "^2.0.3" + +gulp-pngquant@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/gulp-pngquant/-/gulp-pngquant-1.0.12.tgz#48db0a5a99d923d74d3f292b55ef38fba531eae1" + integrity sha512-fGdXZtxnH4gM+Pa0wt9EceGwHDYN6lANkY3ISufb5K5GHvKJ5JK07kARYqoulb5HzyeerJxHLTd1QyP7diQE7A== + dependencies: + chalk "1.1.3" + gulp-util "3.0.7" + pngquant-bin "3.1.1" + through2 "2.0.1" + +gulp-postcss@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/gulp-postcss/-/gulp-postcss-8.0.0.tgz#8d3772cd4d27bca55ec8cb4c8e576e3bde4dc550" + integrity sha512-Wtl6vH7a+8IS/fU5W9IbOpcaLqKxd5L1DUOzaPmlnCbX1CrG0aWdwVnC3Spn8th0m8D59YbysV5zPUe1n/GJYg== + dependencies: + fancy-log "^1.3.2" + plugin-error "^1.0.1" + postcss "^7.0.2" + postcss-load-config "^2.0.0" + vinyl-sourcemaps-apply "^0.2.1" + +gulp-rename@^1.2.0, gulp-rename@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd" + integrity sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg== + +gulp-sass-lint@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gulp-sass-lint/-/gulp-sass-lint-1.4.0.tgz#6f7096c5abcbc0ce99ddf060c9e1a99067a47ebe" + integrity sha512-XerYvHx7rznInkedMw5Ayif+p8EhysOVHUBvlgUa0FSl88H2cjNjaRZ3NGn5Efmp+2HxpXp4NHqMIbOSdwef3A== + dependencies: + plugin-error "^0.1.2" + sass-lint "^1.12.0" + through2 "^2.0.2" + +gulp-sass@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.0.2.tgz#cfb1e3eff2bd9852431c7ce87f43880807d8d505" + integrity sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg== + dependencies: + chalk "^2.3.0" + lodash.clonedeep "^4.3.2" + node-sass "^4.8.3" + plugin-error "^1.0.1" + replace-ext "^1.0.0" + strip-ansi "^4.0.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-sequence@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-sequence/-/gulp-sequence-1.0.0.tgz#862f93e6503e67c350a42948fa666953cf88ba67" + integrity sha512-c+p+EcyBl1UCpbfFA/vUD6MuC7uxoY6Y4g2lq9lLtzOHh9o1wijAQ4o0TIRQ14C7cG6zR6Zi+bpA0cW78CFt6g== + dependencies: + thunks "^4.9.0" + +gulp-sftp@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/gulp-sftp/-/gulp-sftp-0.1.5.tgz#57afec28b23823465d9ac44deba2f02de8dc5c70" + integrity sha1-V6/sKLI4I0ZdmsRN66LwLejcXHA= + dependencies: + async "~0.9.0" + gulp-util "~3.0.0" + object-assign "~0.3.1" + parents "~1.0.0" + ssh2 "~0.3.3" + through2 "~0.4.2" + +gulp-sourcemaps@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" + integrity sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw= + dependencies: + convert-source-map "^1.1.1" + graceful-fs "^4.1.2" + strip-bom "^2.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + +gulp-terser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.2.0.tgz#41df2a1d0257d011ba8b05efb2568432ecd0495b" + integrity sha512-lf+jE2DALg2w32p0HRiYMlFYRYelKZPNunHp2pZccCYrrdCLOs0ItbZcN63yr2pbz116IyhUG9mD/QbtRO1FKA== + dependencies: + plugin-error "^1.0.1" + terser "^4.0.0" + through2 "^3.0.1" + vinyl-sourcemaps-apply "^0.2.1" + +gulp-util@3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" + integrity sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs= + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^1.0.11" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@^2.2.19: + version "2.2.20" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw= + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp-util@^3.0.0, gulp-util@^3.0.1, gulp-util@^3.0.4, gulp-util@~3.0.0: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-webserver@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/gulp-webserver/-/gulp-webserver-0.9.1.tgz#e09992165d97c5865616d642a1601529b0367064" + integrity sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ= + dependencies: + connect "^3.0.1" + connect-livereload "^0.4.0" + gulp-util "^2.2.19" + isarray "0.0.1" + node.extend "^1.0.10" + open "^0.0.5" + proxy-middleware "^0.5.0" + serve-index "^1.1.4" + serve-static "^1.3.0" + through2 "^0.5.1" + tiny-lr "0.1.4" + watch "^0.11.0" + +gulp@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulp@~3.8.7: + version "3.8.11" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.8.11.tgz#d557e0a7283eb4136491969b0497767972f1d28a" + integrity sha1-1Vfgpyg+tBNkkZabBJd2eXLx0oo= + dependencies: + archy "^1.0.0" + chalk "^0.5.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^0.3.2" + liftoff "^2.0.1" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^0.2.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= + dependencies: + glogg "^1.0.0" + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4= + dependencies: + sparkles "^1.0.0" + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + 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" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + 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" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.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" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + 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" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546" + integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ== + +howler@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/howler/-/howler-2.1.2.tgz#8433a09d8fe84132a3e726e05cb2bd352ef8bd49" + integrity sha512-oKrTFaVXsDRoB/jik7cEpWKTj7VieoiuzMYJ7E/EU5ayvmpRhumCv3YQ3823zi9VTJkSWAhbryHnlZAionGAJg== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +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" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-loader@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea" + integrity sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog== + dependencies: + es6-templates "^0.2.3" + fastparse "^1.1.1" + html-minifier "^3.5.8" + loader-utils "^1.1.0" + object-assign "^4.1.1" + +html-minifier@^3.5.20, html-minifier@^3.5.8: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@1.7.3, http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy@1.15.2: + version "1.15.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" + integrity sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE= + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + 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" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.4.tgz#e95f2e41db0735fc21652f7827a5ee32e63c83a8" + integrity sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g= + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-loader@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463" + integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM= + +ignore-walk@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b" + integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw== + dependencies: + minimatch "^3.0.4" + +ignore@^3.1.2, ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +imagemin-gifsicle@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz#6abad4e95566d52e5a104aba1c24b4f3b48581b3" + integrity sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng== + dependencies: + exec-buffer "^3.0.0" + gifsicle "^4.0.0" + is-gif "^3.0.0" + +imagemin-jpegtran@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-6.0.0.tgz#c8d3bcfb6ec9c561c20a987142854be70d90b04f" + integrity sha512-Ih+NgThzqYfEWv9t58EItncaaXIHR0u9RuhKa8CtVBlMBvY0dCIxgQJQCfwImA4AV1PMfmUKlkyIHJjb7V4z1g== + dependencies: + exec-buffer "^3.0.0" + is-jpg "^2.0.0" + jpegtran-bin "^4.0.0" + +imagemin-mozjpeg@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz#d2ca4e8c982c7c6eda55069af89dee4c1cebcdfd" + integrity sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA== + dependencies: + execa "^1.0.0" + is-jpg "^2.0.0" + mozjpeg "^6.0.0" + +imagemin-optipng@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz#a6bfc7b542fc08fc687e83dfb131249179a51a68" + integrity sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A== + dependencies: + exec-buffer "^3.0.0" + is-png "^1.0.0" + optipng-bin "^5.0.0" + +imagemin-pngquant@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-8.0.0.tgz#bf7a41d850c6998f2475c54058ab1db9c516385d" + integrity sha512-PVq0diOxO+Zyq/zlMCz2Pfu6mVLHgiT1GpW702OwVlnej+NhS6ZQegYi3OFEDW8d7GxouyR5e8R+t53SMciOeg== + dependencies: + execa "^1.0.0" + is-png "^2.0.0" + is-stream "^2.0.0" + ow "^0.13.2" + pngquant-bin "^5.0.0" + +imagemin-svgo@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-7.0.0.tgz#a22d0a5917a0d0f37e436932c30f5e000fa91b1c" + integrity sha512-+iGJFaPIMx8TjFW6zN+EkOhlqcemdL7F3N3Y0wODvV2kCUBuUtZK7DRZc1+Zfu4U2W/lTMUyx2G8YMOrZntIWg== + dependencies: + is-svg "^3.0.0" + svgo "^1.0.5" + +imagemin@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-6.1.0.tgz#62508b465728fea36c03cdc07d915fe2d8cf9e13" + integrity sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A== + dependencies: + file-type "^10.7.0" + globby "^8.0.1" + make-dir "^1.0.0" + p-pipe "^1.1.0" + pify "^4.0.1" + replace-ext "^1.0.0" + +immutable@^3: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + 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" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + +import-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.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" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + integrity sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c= + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34= + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +interpret@1.2.0, interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +interpret@^0.3.2: + version "0.3.10" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.3.10.tgz#088c25de731c6c5b112a90f0071cfaf459e5a7bb" + integrity sha1-CIwl3nMcbFsRKpDwBxz69Fnlp7s= + +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +inversify@4.11.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.11.1.tgz#9a10635d1fd347da11da96475b3608babd5945a6" + integrity sha512-9bs/36crPdTSOCcoomHMb96s+B8W0+2c9dHFP/Srv9ZQaPnUvsMgzmMHfgVECqfHVUIW+M5S7SYOjoig8khWuQ== + +inversify@4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.13.0.tgz#0ab40570bfa4474b04d5b919bbab3a4f682a72f5" + integrity sha512-O5d8y7gKtyRwrvTLZzYET3kdFjqUy58sGpBYMARF13mzqDobpfBXVOPLH7HmnD2VR6Q+1HzZtslGvsdQfeb0SA== + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +irregular-plurals@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" + integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" + integrity sha1-hHSREZ/MtftDYhfMc39/qtUPYD8= + dependencies: + is-relative "^0.1.0" + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +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" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + 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" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + 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" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +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" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + +is-bzip2@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" + integrity sha1-XuWOqlounIDiFAe+3yOuWsCRs/w= + +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-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" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + 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" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + 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" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + 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" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + 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" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +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" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + 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" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + 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" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +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" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + 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" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + 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" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + +is-gif@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-3.0.0.tgz#c4be60b26a301d695bb833b20d9b5d66c6cf83b1" + integrity sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw== + dependencies: + file-type "^10.4.0" + +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" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + 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" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + integrity sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM= + +is-jpg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97" + integrity sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc= + +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ== + +is-my-json-valid@^2.10.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz#1345a6fca3e8daefc10d0fa77067f54cedafd59a" + integrity sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA== + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-natural-number@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" + integrity sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec= + +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= + +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== + dependencies: + lodash.isfinite "^3.3.2" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + 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" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + 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" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.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.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" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-png@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce" + integrity sha1-1XSxK/J1wDUEVVcLDltXqwYgd84= + +is-png@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d" + integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g== + +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" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-property@^1.0.0, is-property@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-relative@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" + integrity sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI= + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, 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" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-tar@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" + integrity sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-url@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + integrity sha1-1LVcafUYhvm2XHDWwmItN+KfSP4= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-zip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" + integrity sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU= + +is@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" + integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +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" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + 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" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +javascript-obfuscator@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/javascript-obfuscator/-/javascript-obfuscator-0.15.0.tgz#e2b348c3a6895ef9195e3088f05747cff7a914f1" + integrity sha512-d4mzMLkwZarZE9ZDFXQapNba4iHEj6ARveU4qCz7j/T/TlrHJVbyhVRcZigIuiQqgotTWGub5vMCa2/ep+hA+w== + dependencies: + "@babel/runtime" "7.0.0-beta.42" + chalk "2.3.2" + chance "1.0.13" + class-validator "0.8.5" + commander "2.15.1" + escodegen-wallaby "1.6.18" + espree "3.5.4" + estraverse "4.2.0" + inversify "4.11.1" + js-string-escape "1.0.1" + md5 "2.2.1" + mkdirp "0.5.1" + multimatch "2.1.0" + opencollective "1.0.3" + pjson "1.0.9" + reflect-metadata "0.1.12" + source-map-support "0.5.4" + string-template "1.0.0" + tslib "1.9.0" + +javascript-obfuscator@latest: + version "0.18.1" + resolved "https://registry.yarnpkg.com/javascript-obfuscator/-/javascript-obfuscator-0.18.1.tgz#ed536645bd64998c8d284c1ab87957d6d8d8294c" + integrity sha512-pQ2DyRV4j0neaWdII1S7iJftCyks9H7afVkQRSE4gslkqpeqyM1DE0eapsZKHR0BnYvw3tPU+Ky+j4yhzcxRZA== + dependencies: + "@babel/runtime" "7.0.0-rc.1" + chalk "2.4.1" + chance "1.0.16" + class-validator "0.9.1" + commander "2.17.1" + escodegen-wallaby "1.6.19" + espree "4.0.0" + estraverse "4.2.0" + inversify "4.13.0" + js-string-escape "1.0.1" + md5 "2.2.1" + mkdirp "0.5.1" + multimatch "2.1.0" + opencollective "1.0.3" + reflect-metadata "0.1.12" + source-map-support "0.5.8" + string-template "1.0.0" + tslib "1.9.3" + +jimp@^0.6.1: + version "0.6.8" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.6.8.tgz#63074984337cc469cd4030946e503e7c02a18b5c" + integrity sha512-F7emeG7Hp61IM8VFbNvWENLTuHe0ghizWPuP4JS9ujx2r5mCVYEd/zdaz6M2M42ZdN41blxPajLWl9FXo7Mr2Q== + dependencies: + "@jimp/custom" "^0.6.8" + "@jimp/plugins" "^0.6.8" + "@jimp/types" "^0.6.8" + core-js "^2.5.7" + regenerator-runtime "^0.13.3" + +jpeg-js@^0.3.4: + version "0.3.6" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.6.tgz#c40382aac9506e7d1f2d856eb02f6c7b2a98b37c" + integrity sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw== + +jpegtran-bin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz#d00aed809fba7aa6f30817e59eee4ddf198f8f10" + integrity sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.0" + logalot "^2.0.0" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.5.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== + +js-beautify@^1.10.1, js-beautify@^1.5.10: + version "1.10.2" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178" + integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== + dependencies: + config-chain "^1.1.12" + editorconfig "^0.15.3" + glob "^7.1.3" + mkdirp "~0.5.1" + nopt "~4.0.1" + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +js-string-escape@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + +"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" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +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: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + 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" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23" + integrity sha512-QPOggIJ8fquWPLaYYMoh+zqUmdphDtu1ju0QGTitZT1Yd8I5qenPpXM1etzUegu3MjVp8XPzgZxdn8Yj7e40ig== + dependencies: + abab "^2.0.0" + acorn "^6.0.2" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.0.1" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.0.9" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.3" + symbol-tree "^3.2.2" + tough-cookie "^2.4.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + ws "^6.1.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +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" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +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" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +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" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.0, 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" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + 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" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + 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" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + +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" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + 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" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + 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" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +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" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +known-css-properties@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a" + integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w== + +known-css-properties@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" + integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ== + +lazy-req@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" + integrity sha1-va6+rTD42CQDnODOFJ1Nqge6H6w= + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + +lazystream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920" + integrity sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA= + dependencies: + readable-stream "~1.0.2" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +liftoff@^2.0.1, liftoff@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +limiter@^1.0.5: + version "1.1.4" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.4.tgz#87c9c3972d389fdb0ba67a45aadbc5d2f8413bc1" + integrity sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg== + +load-bmfont@^1.3.1, load-bmfont@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" + integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g== + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + phin "^2.9.1" + xhr "^2.0.1" + xtend "^4.0.0" + +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" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + 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" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3, loader-utils@^1.0.0, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +localtunnel@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.9.2.tgz#0012fcabc29cf964c130a01858768aa2bb65b5af" + integrity sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg== + dependencies: + axios "0.19.0" + debug "4.1.1" + openurl "1.1.1" + yargs "6.6.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + 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" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^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" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0= + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I= + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs= + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo= + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0= + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI= + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c= + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.capitalize@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" + integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ= + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q= + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.get@^4.0.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= + +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.kebabcase@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + +lodash.some@^4.2.2: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0= + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk= + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ= + dependencies: + lodash.keys "~2.4.1" + +lodash@^3.0.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= + +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0, lodash@~4.17.10: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE= + +lodash@~2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" + integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= + +logalot@^2.0.0, logalot@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" + integrity sha1-X46MkNME7fElMJUaVVSruMXj9VI= + dependencies: + figures "^1.3.5" + squeak "^1.0.0" + +longest@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + 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" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lpad-align@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" + integrity sha1-IfYArBwwlcPG5JfuZyce4ISB/p4= + dependencies: + get-stdin "^4.0.1" + indent-string "^2.1.0" + longest "^1.0.0" + meow "^3.3.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= + +lru-cache@^4.0.1, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= + +make-dir@^1.0.0, make-dir@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +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" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown-loader@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/markdown-loader/-/markdown-loader-5.1.0.tgz#4efd5006b1514ca966141c661a47e542a9836e6e" + integrity sha512-xtQNozLEL+55ZSPTNwro8epZqf1h7HjAZd/69zNe8lbckDiGVHeLQm849bXzocln2pwRK2A/GrW/7MAmwjcFog== + dependencies: + loader-utils "^1.2.3" + marked "^0.7.0" + +marked@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" + integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +md5@2.2.1, md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.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" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + 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" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + 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" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + +mime-db@^1.28.0: + version "1.41.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.41.0.tgz#9110408e1f6aa1b34aef51f2c9df3caddf46b6a0" + integrity sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw== + +mime-db@~1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" + integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc= + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + +mime-types@~2.0.9: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" + integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY= + dependencies: + mime-db "~1.12.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@1.6.0, mime@^1.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +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" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +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" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3", minimatch@^3.0.0, 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" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@1.1.x: + version "1.1.3" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" + integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + integrity sha1-md9lelJXTCHJBXSX33QnkLK0wN4= + +minimist@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784= + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^2.2.1, minipass@^2.6.0, minipass@^2.6.4: + version "2.7.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.7.0.tgz#c01093a82287c8331f08f1075499fef124888796" + integrity sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.2.tgz#6f0ccc82fa53e1bf2ff145f220d2da9fa6e3a166" + integrity sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ== + dependencies: + minipass "^2.2.1" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mitt@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.3.tgz#528c506238a05dce11cd914a741ea2cc332da9b8" + integrity sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +mozjpeg@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-6.0.1.tgz#56969dddb5741ef2bcb1af066cae21e61a91a27b" + integrity sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.0" + logalot "^2.1.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multimatch@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s= + dependencies: + duplexer2 "0.0.2" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA= + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1, nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + 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" + +natives@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@, needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +next-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + integrity sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ= + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^1.6.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + 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.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + 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.1.29: + version "1.1.32" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.32.tgz#485b35c1bf9b4d8baa105d782f8ca731e518276e" + integrity sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A== + dependencies: + semver "^5.3.0" + +node-sass@^4.8.3: + version "4.12.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" + integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + 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 "^4.17.11" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node-sri@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/node-sri/-/node-sri-1.1.1.tgz#041096d2b11f232b65dedc4c3ae1cb62babb54b0" + integrity sha1-BBCW0rEfIytl3txMOuHLYrq7VLA= + +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + integrity sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8= + +node.extend@^1.0.10: + version "1.1.8" + resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.8.tgz#0aab3e63789f4e6d68b42bc00073ad1881243cf0" + integrity sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA== + dependencies: + has "^1.0.3" + is "^3.2.1" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@^4.0.1, nopt@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +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" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.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" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.4.1.tgz#81e9c153b0ad5743755696f2aa20488d48e962b6" + integrity sha512-rjH3yRt0Ssx19mUwS0hrDUOdG9VI+oRLpLHJ7tXRdjcuQ7v7wo6qPvOZppHRrqfslTKr0L2yBhjj4UXd7c3cQg== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-conf@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +npm-packlist@^1.1.6: + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + 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" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + 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" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + 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" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +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" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.9: + version "2.1.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +obfuscator-loader@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obfuscator-loader/-/obfuscator-loader-1.1.2.tgz#6e8460066296fc642a68c945e64906e3c964cb0f" + integrity sha512-5PKsa4Vzq8uLJG0GT9BvC9ZxCr44wyV0c9wi782RYWh44GdFMSqlnUldgqSV+HQkFH3MWNc34AlSVSEhg7I26w== + dependencies: + esprima "^4.0.0" + javascript-obfuscator "^0.15.0" + loader-utils "^1.1.0" + +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= + +object-assign@^4.0.0, 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" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-assign@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-0.3.1.tgz#060e2a2a27d7c0d77ec77b78f11aa47fd88008d2" + integrity sha1-Bg4qKifXwNd+x3t48Rqkf9iACNI= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + +object-path@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + integrity sha1-D9mnT8X60a45aLWGvaXGMr1sBaU= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + 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" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +omggif@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" + integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + +on-finished@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.1.0.tgz#0c539f09291e8ffadde0c8a25850fb2cedc7022d" + integrity sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0= + dependencies: + ee-first "1.0.5" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +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" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= + dependencies: + wrappy "1" + +onesky-fetch@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/onesky-fetch/-/onesky-fetch-0.0.7.tgz#96fce1a258a80683d6a37840958bae2f6fdb2809" + integrity sha1-lvzholioBoPWo3hAlYuuL2/bKAk= + dependencies: + md5 "^2.2.1" + node-fetch "^1.6.3" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +open@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw= + +opencollective@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + integrity sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE= + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + integrity sha1-erwi5kTf9jsKltWrfyeQwPAavJU= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +opn@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + 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" + +optipng-bin@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-5.1.0.tgz#a7c7ab600a3ab5a177dae2f94c2d800aa386b5a9" + integrity sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.0" + logalot "^2.0.0" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4= + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + integrity sha1-cTfmmzKYuzQiR6G77jiByA4v14s= + dependencies: + is-stream "^1.0.1" + readable-stream "^2.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-filter-obj@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad" + integrity sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60= + +os-filter-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" + integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== + dependencies: + arch "^2.1.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +ow@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.13.2.tgz#375e76d3d3f928a8dfcf0cd0b9c921cb62e469a0" + integrity sha512-9wvr+q+ZTDRvXDjL6eDOdFe5WUl/wa5sntf9kAolxqSpkBqaIObwLgFCGXSJASFw+YciXnOVtDWpxXa9cqV94A== + dependencies: + type-fest "^0.5.1" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-event@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085" + integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU= + dependencies: + p-timeout "^1.1.1" + +p-event@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" + integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== + dependencies: + p-timeout "^2.0.1" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + 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" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + 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" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" + integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= + dependencies: + p-reduce "^1.0.0" + +p-pipe@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" + integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@^1.0.5, pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + 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" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +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" + +parents@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + 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" + safe-buffer "^5.1.1" + +parse-author@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" + integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8= + dependencies: + author-regex "^1.0.0" + +parse-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= + +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= + +parse-bmfont-xml@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" + integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== + dependencies: + xml-parse-from-string "^1.0.0" + xml2js "^0.4.5" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-headers@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34" + integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg== + dependencies: + for-each "^0.3.3" + string.prototype.trim "^1.1.2" + +parse-json@^2.1.0, parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + 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" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parserlib@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/parserlib/-/parserlib-1.1.1.tgz#a64cfa724062434fdfc351c9a4ec2d92b94c06f4" + integrity sha1-pkz6ckBiQ0/fw1HJpOwtkrlMBvQ= + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.0, parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + 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" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +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" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +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" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-starts-with@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-2.0.0.tgz#ffd6d51926cd497022b44d392196033d5451892f" + integrity sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA== + +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" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + 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" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + 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" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +phin@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" + integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== + +phonegap-plugin-mobile-accessibility@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/phonegap-plugin-mobile-accessibility/-/phonegap-plugin-mobile-accessibility-1.0.5.tgz#95a8754d127508bc6e1ae259a53ce765836eac03" + integrity sha1-lah1TRJ1CLxuGuJZpTznZYNurAM= + +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + 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" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pixelmatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= + dependencies: + pngjs "^3.0.0" + +pjson@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/pjson/-/pjson-1.0.9.tgz#8a9520ce76a4739f8fee91679dad6b065b1c7938" + integrity sha512-4hRJH3YzkUpOlShRzhyxAmThSNnAaIlWZCAb27hd0pVUAXNUAHAO7XZbsPPvsCYwBFEScTmCCL6DGE8NyZ8BdQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +plist@^3.0.0, plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + +plugin-error@1.0.1, plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plur@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b" + integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w== + dependencies: + irregular-plurals "^2.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU= + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +pngjs@^3.0.0, pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +pngquant-bin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-3.1.1.tgz#d124d98a75a9487f40c1640b4dbfcbb2bd5a1fd1" + integrity sha1-0STZinWpSH9AwWQLTb/Lsr1aH9E= + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +pngquant-bin@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.2.tgz#6f34f3e89c9722a72bbc509062b40f1b17cda460" + integrity sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.1" + execa "^0.10.0" + logalot "^2.0.0" + +portscanner@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" + integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y= + dependencies: + async "1.5.2" + is-number-like "^1.0.3" + +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" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-assets@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-assets/-/postcss-assets-5.0.0.tgz#f721d07d339605fb58414e9f69cf05401c54e709" + integrity sha1-9yHQfTOWBftYQU6fac8FQBxU5wk= + dependencies: + assets "^3.0.0" + bluebird "^3.5.0" + postcss "^6.0.10" + postcss-functions "^3.0.0" + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7" + integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0" + +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-discard-unused@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz#ee7cc66af8c7e8c19bd36f12d09c4bde4039abea" + integrity sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA== + dependencies: + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-functions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e" + integrity sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4= + dependencies: + glob "^7.1.2" + object-assign "^4.1.1" + postcss "^6.0.9" + postcss-value-parser "^3.3.0" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.1.tgz#99d319669a13d6c06ef8e70d852f68cb1b399b61" + integrity sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-idents@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz#b7df282a92f052ea0a66c62d8f8812e6d2cbed23" + integrity sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A== + dependencies: + cssnano-util-same-parent "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.5.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-idents@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz#30447a6ec20941e78e21bd4482a11f569c4f455b" + integrity sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-round-subpixels@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-round-subpixels/-/postcss-round-subpixels-1.2.0.tgz#e21d6ac5952e185f9bdc008b94f004fe509d0a11" + integrity sha1-4h1qxZUuGF+b3ACLlPAE/lCdChE= + dependencies: + postcss "^5.0.2" + postcss-value-parser "^3.1.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-unprefix@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/postcss-unprefix/-/postcss-unprefix-2.1.4.tgz#ab1c038ab77f068799ed36e1cbd997b51e7360a1" + integrity sha512-s+muBiGIMx3RvgPTtPBnSrfvIBHJ2Zx16QZf/VDB/sAxdYP6FIzci8d1gLh0+9psu5W6zVtCbU5micNt6Zh3cg== + dependencies: + autoprefixer "^9.4.3" + known-css-properties "^0.11.0" + normalize-range "^0.1.2" + postcss-selector-parser "^5.0.0" + postcss-value-parser "^3.3.1" + pseudo-classes "^1.0.0" + pseudo-elements "^1.1.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.1.2, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-zindex@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz#8db6a4cec3111e5d3fd99ea70abeda61873d10c1" + integrity sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss@^5.0.2: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.10, postcss@^6.0.9: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" + integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@~1.1.2: + version "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.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +pretty-bytes@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" + integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + +pretty-hrtime@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-0.2.2.tgz#d4fd88351e3a4741f8173af7d6a4b846f9895c00" + integrity sha1-1P2INR46R0H4Fzr31qS4RvmJXAA= + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +private@^0.1.6, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-polyfill@^8.1.0: + version "8.1.3" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" + integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +proxy-middleware@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.5.1.tgz#da24d5d58c1ddf13dad237c7eca503849eaea903" + integrity sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM= + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudo-classes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pseudo-classes/-/pseudo-classes-1.0.0.tgz#60a69b67395c36ff119c4d1c86e1981785206b96" + integrity sha1-YKabZzlcNv8RnE0chuGYF4Uga5Y= + +pseudo-elements@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pseudo-elements/-/pseudo-elements-1.1.0.tgz#9ba6dd8ac3ce1f3d7d36d4355aa3e28d08391f28" + integrity sha1-m6bdisPOHz19NtQ1WqPijQg5Hyg= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.4.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" + integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + 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" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + 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" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.4.tgz#2e9fbcd34b540e3421c924ecd01e90aa975319c8" + integrity sha1-Lp+800tUDjQhySTs0B6QqpdTGcg= + +qs@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" + integrity sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw= + +qs@~6.5.2: + version "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@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^6.8.1: + version "6.8.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b" + integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.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" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + 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.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + 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" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.3.0.tgz#978230a156a5548f42eef14de22d0f4f610083d1" + integrity sha1-l4IwoValVI9C7vFN4i0PT2EAg9E= + dependencies: + bytes "1" + iconv-lite "0.4.4" + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@^2.3.2: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.1.2, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +rcedit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.0.0.tgz#dcc85d93aa91a41c1ebc5c6aa1dfc43ea28b7dad" + integrity sha512-XcFGyEBjhWSsud+R8elwQtGBbVkCf7tAiad+nXo5jc6l2rMf46NfGNwjnmBNneBIZDfq+Npf8lwP371JTONfrw== + +rcfinder@^0.1.6: + version "0.1.9" + resolved "https://registry.yarnpkg.com/rcfinder/-/rcfinder-0.1.9.tgz#f3e80f387ddf9ae80ae30a4100329642eae81115" + integrity sha1-8+gPOH3fmugK4wpBADKWQuroERU= + dependencies: + lodash.clonedeep "^4.3.2" + +rcloader@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/rcloader/-/rcloader-0.1.4.tgz#d0c902f0444983a2ee5a6907937c6a79ca704509" + integrity sha1-0MkC8ERJg6LuWmkHk3xqecpwRQk= + dependencies: + lodash "^3.0.1" + rcfinder "^0.1.6" + +rcloader@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/rcloader/-/rcloader-0.2.2.tgz#58d2298b462d0b9bfd2133d2a1ec74fbd705c717" + integrity sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc= + dependencies: + lodash.assign "^4.2.0" + lodash.isobject "^3.0.2" + lodash.merge "^4.6.0" + rcfinder "^0.1.6" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + integrity sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po= + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.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" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + 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" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + 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" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + 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" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +"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.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + 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.27-1: + version "1.0.27-1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.27-1.tgz#6b67983c20357cefd07f0165001a16d710d91078" + integrity sha1-a2eYPCA1fO/QfwFlABoW1xDZEHg= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@2 || 3": + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^1.0.27-1, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.1.0, readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reflect-metadata@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" + integrity sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A== + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== + dependencies: + 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" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + 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" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp-tree@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f" + integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw== + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.5.4: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + 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" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +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" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +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" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + 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" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +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" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +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= + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.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" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + +resolve-from@^3.0.0: + version "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-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + +responselike@1.0.2, responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + 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" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2, rimraf@^2.2.6, rimraf@^2.4.0, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +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== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k= + dependencies: + once "^1.3.0" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + 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" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rusha@^0.8.13: + version "0.8.13" + resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a" + integrity sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo= + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= + +rx@4.1.0, rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + +rxjs@^5.5.6: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.4.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize-filename@^1.6.0, sanitize-filename@^1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-lint@^1.12.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f" + integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q== + dependencies: + commander "^2.8.1" + eslint "^2.7.0" + front-matter "2.1.2" + fs-extra "^3.0.1" + glob "^7.0.0" + globule "^1.0.0" + gonzales-pe-sl "^4.2.3" + js-yaml "^3.5.4" + known-css-properties "^0.3.0" + lodash.capitalize "^4.1.0" + lodash.kebabcase "^4.0.0" + merge "^1.2.0" + path-is-absolute "^1.0.0" + util "^0.10.3" + +sass-unused@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/sass-unused/-/sass-unused-0.3.0.tgz#69924e4996d6c96840fb3a99e0a0290516811a9f" + integrity sha512-fGNcUpDeSFwnN+BTQ251iM77Py8awPXc96vSE3TpvMcgbC90IrohonRb4oxWX/KzHpezkmUddS8/t04R+yIB8w== + dependencies: + glob "^7.0.5" + gonzales-pe "^4.2.3" + +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.3: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +schema-utils@^0.4.0: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +seek-bzip@^1.0.3, seek-bzip@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= + dependencies: + commander "~2.8.1" + +semver-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" + integrity sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk= + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +semver-truncate@^1.0.0, semver-truncate@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" + integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g= + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^4.0.3, semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + 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" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= + +serialize-error@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-3.0.0.tgz#80100282b09be33c611536f50033481cb9cc87cf" + integrity sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A== + +serialize-javascript@^1.7.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== + +serve-index@1.9.1, serve-index@^1.1.4: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +serve-static@1.14.1, serve-static@^1.3.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= + +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" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-immediate-shim@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + 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: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +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" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + 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" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shelljs@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" + integrity sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg= + +sigmund@^1.0.1, sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +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" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slice-ansi@0.0.4: + version "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.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" + is-fullwidth-code-point "^2.0.0" + +sloc@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/sloc/-/sloc-0.2.1.tgz#42ad891e76838c1a22bbd8483468e9d74c7f531e" + integrity sha512-8XJnwCFR4DatLz1s0nGFe6IJPJ+5pjRFhoBuBKq8SLgFI40eD7ak6jOXpzeG0tmIpyOc1zCs9bjKAxMFm1451A== + dependencies: + async "~2.1.4" + cli-table "^0.3.1" + commander "~2.9.0" + readdirp "^2.1.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + 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" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + 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" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + 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" + +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= + +socket.io-client@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" + integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.2.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.2.0" + to-array "0.1.4" + +socket.io-client@^2.0.4: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" + integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~4.1.0" + engine.io-client "~3.4.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" + integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== + dependencies: + debug "~3.1.0" + engine.io "~3.2.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.1.1" + socket.io-parser "~3.2.0" + +sort-keys-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" + integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= + dependencies: + sort-keys "^1.0.0" + +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" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + 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" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + 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.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.4.tgz#54456efa89caa9270af7cd624cc2f123e51fbae8" + integrity sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg== + dependencies: + source-map "^0.6.0" + +source-map-support@0.5.8: + version "0.5.8" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.8.tgz#04f5581713a8a65612d0175fbf3a01f80a162613" + integrity sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.12: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + 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" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +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" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= + dependencies: + amdefine ">=0.0.4" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + dependencies: + amdefine ">=0.0.4" + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +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" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +speed-measure-webpack-plugin@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz#69840a5cdc08b4638697dac7db037f595d7f36a0" + integrity sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ== + dependencies: + chalk "^2.0.1" + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +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" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +squeak@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" + integrity sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM= + dependencies: + chalk "^1.0.0" + console-stream "^0.1.1" + lpad-align "^1.0.1" + +ssh2@~0.3.3: + version "0.3.6" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.3.6.tgz#49034434aee3821ee5fc22b952081e7801ff92ed" + integrity sha1-SQNENK7jgh7l/CK5UggeeAH/ku0= + dependencies: + asn1 "0.2.1" + readable-stream "1.0.27-1" + streamsearch "0.1.2" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + integrity sha1-5sgLYjEj19gM8TLOU480YokHJQI= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-consume@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" + integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg== + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + 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" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + 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" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM= + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +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= + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + +strictdom@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460" + integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA= + +string-replace-webpack-plugin@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/string-replace-webpack-plugin/-/string-replace-webpack-plugin-0.1.3.tgz#73c657e759d66cfe80ae1e0cf091aa256d0e715c" + integrity sha1-c8ZX51nWbP6Arh4M8JGqJW0OcVw= + dependencies: + async "~0.2.10" + loader-utils "~0.2.3" + optionalDependencies: + css-loader "^0.9.1" + file-loader "^0.8.1" + style-loader "^0.8.3" + +string-template@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96" + integrity sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y= + +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" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + 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: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.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.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d" + integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.13.0" + function-bind "^1.1.1" + +string.prototype.trimleft@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= + dependencies: + ansi-regex "^0.2.1" + +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" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + 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" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.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.1.0" + +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + integrity sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4= + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-dirs@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" + integrity sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA= + dependencies: + chalk "^1.0.0" + get-stdin "^4.0.1" + is-absolute "^0.1.5" + is-natural-number "^2.0.0" + minimist "^1.1.0" + sum-up "^1.0.1" + +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== + dependencies: + is-natural-number "^4.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +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" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +strip-json-comments@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= + +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +style-loader@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.8.3.tgz#f4f92eb7db63768748f15065cd6700f5a1c85357" + integrity sha1-9Pkut9tjdodI8VBlzWcA9aHIU1c= + dependencies: + loader-utils "^0.2.5" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= + dependencies: + chalk "^1.0.0" + +sumchecker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.0.tgz#da5457b4605184575c76540e5e99cc777cb8ce4c" + integrity sha512-yreseuC/z4iaodVoq07XULEOO9p4jnQazO7mbrnDSvWAU/y2cbyIKs+gWJptfcGu9R+1l27K8Rkj0bfvqnBpgQ== + dependencies: + debug "^4.1.0" + +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +svgo@^1.0.0, svgo@^1.0.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313" + integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.33" + csso "^3.5.1" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8= + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar-stream@^1.1.1, tar-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar-stream@~0.4.0: + version "0.4.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-0.4.7.tgz#1f1d2ce9ebc7b42765243ca0e8f1b7bfda0aadcd" + integrity sha1-Hx0s6evHtCdlJDyg6PG3v9oKrc0= + dependencies: + bl "^0.9.0" + end-of-stream "^1.0.0" + readable-stream "^1.0.27-1" + xtend "^4.0.0" + +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +tar@^4: + version "4.4.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.11.tgz#7ac09801445a3cf74445ed27499136b5240ffb73" + integrity sha512-iI4zh3ktLJKaDNZKZc+fUONiQrSn9HkCFzamtb7k8FFmVilHVob7QsLX/VySAW8lAviMzMbFw4QtFb4errwgYA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.6.4" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempfile@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" + integrity sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I= + dependencies: + os-tmpdir "^1.0.0" + uuid "^2.0.1" + +tempfile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" + integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= + dependencies: + temp-dir "^1.0.0" + uuid "^3.0.1" + +ternary-stream@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.1.1.tgz#4ad64b98668d796a085af2c493885a435a8a8bfc" + integrity sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw== + dependencies: + duplexify "^3.5.0" + fork-stream "^0.0.4" + merge-stream "^1.0.0" + through2 "^2.0.1" + +terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" + integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.0.0, terser@^4.1.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.1.tgz#09820bcb3398299c4b48d9a86aefc65127d0ed65" + integrity sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +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" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +tfunk@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b" + integrity sha1-OORBT8ZJd9h6/apy+sttKfgve1s= + dependencies: + chalk "^1.1.1" + object-path "^0.9.0" + +through2-concurrent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-2.0.0.tgz#c9dd2c146504ec9962dbc86a5168b63d662669fa" + integrity sha512-R5/jLkfMvdmDD+seLwN7vB+mhbqzWop5fAjx5IX8/yQq7VhBhzDmhXgaHAOnhnWkCpRMM7gToYHycB0CS/pd+A== + dependencies: + through2 "^2.0.0" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" + integrity sha1-OE51MU1J8y3hLuu4E2uOtrXVnak= + dependencies: + readable-stream "~2.0.0" + xtend "~4.0.0" + +through2@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@3.0.1, through2@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + +through2@^0.4.1, through2@~0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through2@^0.5.0, through2@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^0.6.0, through2@^0.6.1, through2@^0.6.5, through2@~0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.3.0.tgz#2d1d28c8d1daf8d9c5cb78f0a69343c6b8642d97" + integrity sha1-LR0oyNHa+NnFy3jwppNDxrhkLZc= + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through@^2.3.6, through@^2.3.8, through@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunks@^4.9.0: + version "4.9.5" + resolved "https://registry.yarnpkg.com/thunks/-/thunks-4.9.5.tgz#fc764983de4de7230a2f300cfe2dc77092bc38f4" + integrity sha512-L0s0QzX1x0fcsP52TQs42t3CGX/z6lw0Ktz0ciex47OUhog5K3AsfH3mQ4JTLBYbnsNBhaIUcVMrY8sR+0Lo6w== + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + integrity sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc= + +timed-out@^4.0.0, timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timm@^1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd" + integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-lr@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.1.4.tgz#6e41d7e67dfd0878e5e0b37e37a06d67e309ff4d" + integrity sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00= + dependencies: + body-parser "~1.8.0" + debug "~0.8.1" + faye-websocket "~0.7.2" + parseurl "~1.3.0" + qs "~2.2.3" + +tinycolor2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= + +tmp-promise@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.1.0.tgz#bb924d239029157b9bc1d506a6aa341f8b13e64c" + integrity sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw== + dependencies: + bluebird "^3.5.0" + tmp "0.1.0" + +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + integrity sha1-HN+kcqnvUMI57maZm2YsoOs5k38= + dependencies: + extend-shallow "^2.0.1" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +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" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +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" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +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" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + 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" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.4.3: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + 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" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +trim@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tslib@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== + +tslib@1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + 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" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-is@~1.5.1: + version "1.5.7" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.5.7.tgz#b9368a593cc6ef7d0645e78b2f4c64cbecd05e90" + integrity sha1-uTaKWTzG730GReeLL0xky+zQXpA= + dependencies: + media-typer "0.3.0" + mime-types "~2.0.9" + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@0.7.17: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + integrity sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g== + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +uglify-template-string-loader@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/uglify-template-string-loader/-/uglify-template-string-loader-1.1.1.tgz#d091d15f66b65f1cae2f4222583009302c86339f" + integrity sha512-EHJx8m0aIHlwX5xlJd2xPYIFvLrPkVK5X8zpVxSNTmu7KoT2eSg1TNlwZS+JS65+dwJXC4rC5mc+F4UVe2rckw== + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unbzip2-stream@^1.0.9: + version "1.3.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" + integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unused-files-webpack-plugin@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/unused-files-webpack-plugin/-/unused-files-webpack-plugin-3.4.0.tgz#adc67a3b5549d028818d3119cbf2b5c88aea8670" + integrity sha512-cmukKOBdIqaM1pqThY0+jp+mYgCVyzrD8uRbKEucQwIGZcLIRn+gSRiQ7uLjcDd3Zba9NUxVGyYa7lWM4UCGeg== + dependencies: + babel-runtime "^7.0.0-beta.3" + glob-all "^3.1.0" + semver "^5.5.0" + util.promisify "^1.0.0" + warning "^3.0.0" + +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + integrity sha1-uYTwh3/AqJwsdzzB73tbIytbBv4= + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + 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" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-regex@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + integrity sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ= + dependencies: + ip-regex "^1.0.1" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + 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" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= + dependencies: + os-homedir "^1.0.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + +utif@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" + integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== + dependencies: + pako "^1.0.5" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +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" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + 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" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + 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" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + integrity sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validator@10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-10.4.0.tgz#ee99a44afb3bb5ed350a159f056ca72a204cfc3c" + integrity sha512-Q/wBy3LB1uOyssgNlXSRmaf22NxjvDNZM2MtIQ4jaEOAB61xsh1TQxsq1CgzUMBV1lDrVMogIh8GjG1DYW0zLg== + +validator@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.2.0.tgz#ad216eed5f37cac31a6fe00ceab1f6b88bded03e" + integrity sha512-6Ij4Eo0KM4LkR0d0IegOwluG5453uqT5QyF5SV5Ezvm8/zmkKI/L4eoraafZGlZPC9guLkwKzgypcw8VGWWnGA== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" + integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-assign@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" + integrity sha1-TRmIkbVRWRHXcajNnFSApGoHSkU= + dependencies: + object-assign "^4.0.1" + readable-stream "^2.0.0" + +vinyl-buffer@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-0.0.0.tgz#d197a824badcb11cccf9643ac91be24d43eda8db" + integrity sha1-0ZeoJLrcsRzM+WQ6yRviTUPtqNs= + dependencies: + bl "^0.7.0" + through2 "^0.4.1" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY= + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-fs@^2.2.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" + integrity sha1-vm/zJwy1Xf19MGNkDegfJddTIjk= + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "1.6.0" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl-source-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-0.1.1.tgz#a53a4f21a07a234695e04c2703f9f1b5b9084595" + integrity sha1-pTpPIaB6I0aV4EwnA/nxtbkIRZU= + dependencies: + through2 "~0.3.0" + vinyl "~0.2.2" + +vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= + dependencies: + source-map "^0.5.1" + +vinyl@^0.2.1, vinyl@~0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + integrity sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI= + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.0, vinyl@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4= + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.1.0, vinyl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +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" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +ware@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" + integrity sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q= + dependencies: + wrap-fn "^0.1.0" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +watch@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.11.0.tgz#e8dba091b7456799a3af57978b986e77e1320406" + integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY= + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^3.0.3: + version "3.5.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.5.1.tgz#84aabb1547178d842ebb4ccc7324084b6c3b0ea9" + integrity sha512-CDdaT3TTu4F9X3tcDq6PNJOiNGgREOM0WdN2vVAoUUn+M6NLB5kJ543HImCWbrDwOpbpGARSwU8r+u0Pl367kA== + dependencies: + acorn "^6.0.7" + acorn-walk "^6.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-cli@^3.1.0: + version "3.3.9" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a" + integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-deep-scope-plugin@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/webpack-deep-scope-plugin/-/webpack-deep-scope-plugin-1.6.2.tgz#131eac79739021e42ebc07066ea8869107f37b85" + integrity sha512-S5ZM1i7oTIVPIS1z/Fu41tqFzaXpy8vZnwEDC9I7NLj5XD8GGrDZbDXtG5FCGkHPGxtAzF4O21DKZZ76vpBGzw== + dependencies: + deep-scope-analyser "^1.7.0" + +webpack-plugin-replace@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-plugin-replace/-/webpack-plugin-replace-1.2.0.tgz#3f20db96237400433231e35ea76d9be3f7128916" + integrity sha512-1HA3etHpJW55qonJqv84o5w5GY7iqF8fqSHpTWdNwarj1llkkt4jT4QSvYs1hoaU8Lu5akDnq/spHHO5mXwo1w== + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-stream@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39" + integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A== + dependencies: + fancy-log "^1.3.3" + lodash.clone "^4.3.2" + lodash.some "^4.2.2" + memory-fs "^0.4.1" + plugin-error "^1.0.1" + supports-color "^5.5.0" + through "^2.3.8" + vinyl "^2.1.0" + webpack "^4.26.1" + +webpack-strip-block@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/webpack-strip-block/-/webpack-strip-block-0.2.0.tgz#c60d4a703e0eeee8895e7f1abe9b5fe914681470" + integrity sha1-xg1KcD4O7uiJXn8avptf6RRoFHA= + dependencies: + loader-utils "^1.1.0" + +webpack@^4.26.1, webpack@^4.31.0: + version "4.40.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.40.2.tgz#d21433d250f900bf0facbabe8f50d585b2dc30a7" + integrity sha512-5nIvteTDCUws2DVvP9Qe+JPla7kWPPIDFZv55To7IycHWZ+Z5qBdaBYPyuXWdhggTufZkQwfIK+5rKQTVovm2A== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.1" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket-driver@>=0.3.6: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.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" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + 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" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.1.1, which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + 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" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac" + integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw== + dependencies: + loader-utils "^1.0.0" + schema-utils "^0.4.0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-fn@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" + integrity sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU= + dependencies: + co "3.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +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" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + +ws@^6.0.0, ws@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" + +xhr@^2.0.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" + integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.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" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= + +xml2js@^0.4.5: + version "0.4.22" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" + integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== + dependencies: + sax ">=0.6.0" + util.promisify "~1.0.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmldom@0.1.x: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@^13.0.0, yargs-parser@^13.1.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^4.1.0, yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= + dependencies: + camelcase "^3.0.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" + integrity sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ= + 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" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^4.1.0" + +yargs@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= + 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 "^4.2.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + 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" + +yargs@~1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" + integrity sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s= + dependencies: + minimist "^0.1.0" + +yauzl@^2.2.1, yauzl@^2.4.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +zip-stream@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.4.1.tgz#4ea795a8ce19e9fab49a31d1d0877214159f03a3" + integrity sha1-TqeVqM4Z6fq0mjHR0IdyFBWfA6M= + dependencies: + compress-commons "~0.1.0" + lodash "~2.4.1" + readable-stream "~1.0.26" diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 00000000..6879acfe --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "target": "es6", + "checkJs": true, + + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..b978337a --- /dev/null +++ b/package.json @@ -0,0 +1,84 @@ +{ + "name": "shapez.io", + "version": "1.0.0", + "main": "index.js", + "repository": "https://github.com/tobspr/shapez.io", + "author": "Tobias Springer ", + "license": "MIT", + "private": true, + "scripts": { + "dev": "./gulp/gulp main.serveDev", + "prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*" + }, + "dependencies": { + "@babel/core": "^7.5.4", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/preset-env": "^7.5.4", + "@types/cordova": "^0.0.34", + "@types/filesystem": "^0.0.29", + "ajv": "^6.10.2", + "babel-loader": "^8.0.4", + "browser-sync": "^2.24.6", + "circular-dependency-plugin": "^5.0.2", + "circular-json": "^0.5.9", + "clipboard-copy": "^3.1.0", + "colors": "^1.3.3", + "core-js": "3", + "cssnano-preset-advanced": "^4.0.7", + "email-validator": "^2.0.4", + "eslint": "^5.9.0", + "fastdom": "^1.0.8", + "flatted": "^2.0.1", + "howler": "^2.1.2", + "html-loader": "^0.5.5", + "ignore-loader": "^0.1.2", + "lz-string": "^1.4.4", + "markdown-loader": "^4.0.0", + "obfuscator-loader": "^1.1.2", + "phonegap-plugin-mobile-accessibility": "^1.0.5", + "promise-polyfill": "^8.1.0", + "query-string": "^6.8.1", + "rusha": "^0.8.13", + "serialize-error": "^3.0.0", + "sloc": "^0.2.1", + "strictdom": "^1.0.1", + "string-replace-webpack-plugin": "^0.1.3", + "terser-webpack-plugin": "^1.1.0", + "uglify-template-string-loader": "^1.1.0", + "unused-files-webpack-plugin": "^3.4.0", + "webpack": "^4.31.0", + "webpack-bundle-analyzer": "^3.0.3", + "webpack-cli": "^3.1.0", + "webpack-deep-scope-plugin": "^1.6.0", + "webpack-plugin-replace": "^1.1.1", + "webpack-strip-block": "^0.2.0", + "whatwg-fetch": "^3.0.0", + "worker-loader": "^2.0.0" + }, + "devDependencies": { + "autoprefixer": "^9.4.3", + "babel-plugin-closure-elimination": "^1.3.0", + "babel-plugin-console-source": "^2.0.2", + "babel-plugin-danger-remove-unused-import": "^1.1.2", + "css-mqpacker": "^7.0.0", + "cssnano": "^4.1.10", + "faster.js": "^1.1.0", + "glob": "^7.1.3", + "imagemin-mozjpeg": "^8.0.0", + "imagemin-pngquant": "^8.0.0", + "jimp": "^0.6.1", + "js-yaml": "^3.13.1", + "onesky-fetch": "^0.0.7", + "postcss-assets": "^5.0.0", + "postcss-preset-env": "^6.5.0", + "postcss-round-subpixels": "^1.2.0", + "postcss-unprefix": "^2.1.3", + "prettier": "^2.0.4", + "sass-unused": "^0.3.0", + "speed-measure-webpack-plugin": "^1.3.1", + "strip-json-comments": "^3.0.1", + "trim": "^0.0.1", + "webpack-stream": "^5.1.0" + } +} diff --git a/res/fonts/LouisGeorgeCafe.woff2 b/res/fonts/LouisGeorgeCafe.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7e4ebe0351996528a24c60efb94200b8b2ebaed6 GIT binary patch literal 13164 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 N>FXG4S86)k{(p>4t~&q# literal 0 HcmV?d00001 diff --git a/res/ui/building_tutorials/belt.png b/res/ui/building_tutorials/belt.png new file mode 100644 index 0000000000000000000000000000000000000000..d36cc8138751ed360ce42827aa46d1854e6d8191 GIT binary patch literal 43921 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

6iZF+&P@8dGR{AS#!)fIC?pw*WH{s%y#`0mj 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 literal 0 HcmV?d00001 diff --git a/res/ui/building_tutorials/cutter.png b/res/ui/building_tutorials/cutter.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9daca8d129dfae48077be2c9ef1989ad6dc2ae GIT binary patch literal 63140 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%0AShHRRUT6VG_=()jWprlm*9 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%0D)E@(frzrR49?g!Po#70D4 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%0DWw-||1c)4w@b2X+K79D%s=K_w``PcR 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 Wjuf7g@4)2=b?U@f?E)>!;Qs($YjEZO literal 0 HcmV?d00001 diff --git a/res/ui/building_tutorials/splitter.png b/res/ui/building_tutorials/splitter.png new file mode 100644 index 0000000000000000000000000000000000000000..ece30fb50e1024e84eacb367ba9c54599c77b19e GIT binary patch literal 82980 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±ta$%G8{L>am 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 literal 0 HcmV?d00001 diff --git a/res/ui/building_tutorials/stacker.png b/res/ui/building_tutorials/stacker.png new file mode 100644 index 0000000000000000000000000000000000000000..55232a2ccd5ccbc0b45246b69ece9b0f5d867963 GIT binary patch literal 56549 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 MUHx3vIVCg!07$ScrvLx| literal 0 HcmV?d00001 diff --git a/res/ui/building_tutorials/trash.png b/res/ui/building_tutorials/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..b33d1980efd2d874a64da7e8ba8e10a738ba8379 GIT binary patch literal 23075 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%0AG} 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 literal 0 HcmV?d00001 diff --git a/res/ui/icons/shop.png b/res/ui/icons/shop.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5d9c82b4febe1cdb93c2a978517593589bcf34 GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkZXJy3J><`mX=McT!NWL+uy4 z<=w*+4kqs)MH%w>StE}iG0Uq-+GL>X4aSgZ1t?i{g=$kY20o3=%o9DkiH+^ zdk&VpV?AuYu43E4X_wzg+k9w=PY#aVCa@-+!fj%kb5JP_sD_rZyEenn$bevNFazz->|g&#sioE|YY z*xvD1oW^p$>YS*R#aUaq;>pT;1Z3hvv)3^FpUC>#vXp7>9nTM&tM+{CKRxA;>K#|} zz6~O}>~Vi9cXS9(y8cu0-y%UyV9HW0ag8WRNi0dVN-jzTQVd20Mh3bDrn&~^A%=!l z24+@9CfWuDRt5$pOcl>jH00)|WTsW(*5Dd{AR4Ga5@bVgep*R+Vo@qXd3m{BW?pu2 ba$-TMUVc&f>~}U&Kt&9mu6{1-oD!M^hkgFV4RsJQRg zCnjV->GT$|SUBDp4?trfd^ZRx^cqxq4`%=vM*zsk2H=Y@%6J1nA{u}-3IOJ%04T)X z{KFk996*8{?FazWFtv@2z7gLh!J8VO^HY$og#Q`5GJ9d1n zRc02I5?HR`BrEo}2*J zubfX8v&*!Chz2W`3w89k?B;BIFGe<=y2$BZ6o=M^q$4ru{Gw#}}(-=2ZJ%S5h zaA}!O)}Tvp`Uz{sf@!75ZkoQ)RZplp@5p@z2G zVGofeKayc3zA~6VYw}~A=^cFd_qlYa4l)_|32){@j30h?9Vhv5=;gF*`^t4UT)*A627~RlGE3O*kWY0*$`KlCI@)n=2>(NV6G`5RzH5^< zeLSUDEAaqalJ!9E@hL%7;}kYksXVFI*UF6PV3$_A`53i5$`Qb>*A<5axwQ?K9jnB%})ce1okU64eSxDtytQ8h@`h2h5o=dtfXbr>G zN!g91h9ym<&oWloUk|)#H{xI8b?q>*CDNY}C`|Y4Kb3)!=)(HX{zJ31uO{qHX!I)n-4j-;-Z{vW;HwRDC;IeSfPC9>esjb`6J2phfzNaFEUj zqVXP1rnLrz<6GRFWAB<|UWT@RTMc+~uaCU_JNtO$yeJ4%Ygo5HZXNBiwN9VlBKM1R z5&LjsqM&4(%VM{six5%+nu<{Ta^d&UrW1YXAwl#|b8393P=FEI2yK8iF+iJoVKC-s zQ**Sj9vW?qM*Caq>i(w?6%#@WOZoqTf%?_!!h+KG3!X7y^yHxUP>`IQjG{%KOP~hD YhN5EP!*8r(m4!>df#^c0v!-PI3(pT;q5uE@ literal 0 HcmV?d00001 diff --git a/res/ui/loading.svg b/res/ui/loading.svg new file mode 100644 index 00000000..e8f0d271 --- /dev/null +++ b/res/ui/loading.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/res/ui/locked_building.png b/res/ui/locked_building.png new file mode 100644 index 0000000000000000000000000000000000000000..df72e77358f4ee8ab546a2bad872cf495fafad22 GIT binary patch literal 5920 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

r7qmO305L-IUnTRV?3~_FSWaTjbZ;QOA?S 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
tM1I-N(}4-l)NvCb&d+0eGy#(A$sGScdOMf%oL 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 literal 0 HcmV?d00001 diff --git a/res/ui/sad_ghost.png b/res/ui/sad_ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..19cd0cac10f6a35805098b3d8c0d59f594a5a7e8 GIT binary patch literal 6789 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 KMNUMnLSTYJWb_~a literal 0 HcmV?d00001 diff --git a/res/ui/upgrades/miner.png b/res/ui/upgrades/miner.png new file mode 100644 index 0000000000000000000000000000000000000000..535edc0642266161fcf80cec2dc9e4aa61fd5c3f GIT binary patch literal 940 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H0wgodS2_SGmUKs7M+SzC{oH>NS%G|oWRDy)vIg-4nJ@ErkR#;MwT(m+A>5>H=O_9v|DBH~&X6`2HqnyNfq978H@y`8f^TO?4zHNQ@2 zhDcMd>nxElvs*0=5w60Qj-0yY=lynyNHhy`;}7wSH!A1$&Aj_K<^9i9jpo+R@4d23i#REf-19P;P3isYi@8y@M|asBzhfrz zbH}WC7dwMZ9&<@7*_#=|pzH9MDT7f;+=2VT4u+_PW2_gLO!OMW78EjWVd&*vz?y+w zNo~Bto6{HdtNd1Pmy}HIF1{Z%YDFd^mOb6_e(Bc9 zKdyga4%e%e+BMI-ZY`7bzZo|#=gj-TEqe3gai6|mr>SLs3@=}4-u%dZ)r~&;G$C6{ z-8$3qKZcuc$<=x27p#ptxB9~rgH`4`g4RF(F{Pj+VNTfE$+?FtA5Pwu$qMwL4ztu^ z(HBg78LZRx{r5V9Gn{56zP-$K3>fr{8jp(~Ij&{7F2CjCwzRNvzZlh3>3`07ZP1Or ze0-beb`$xS>r=n1S!pccxwrB>*LImTC$9N5nVy!^ezj7)S7iG8-)lGEjsUE2H0w~k zkzm0Xkxq!^40j0|)QOmz*+LyQcpjEt>JjI<35tPBkL_)j&WXvob^$xN%n zt>J%Aku6YzB*=!~{Irtt#G+J&^73-M%)IR4NS%G|oWRDy)vIg-4nJ@ErkR#;MwT(m+A>5>H=O_9v|DA~II`NvHQQFff1hba4!+xb=3fZw^l&!}0pf zyIr@gSfKl8F>hM;A}5y4=H`}ej>3mep1g3fu=enf;ouZ!7t|D7$y~Tvh_i5l*UL#_ znKjy4ysNKXTYB@&iEVRVzB^N&{;O`X$;`Ri-~YXzzi;>NGM#_vY_m0$y}o>Ch|lAG z|4iF?;_O{Ftb*EgkKf6XGxpqjsAge%)vhAl4$EhJu3LT^G&k=Qw_v@pqWG7`T4_c@ zanaVPGnP+R=W}bYYLHTPkag%4T)?;B7)Jnmz+{F;Z<3ig6INRF^{;u{l)P`gdrYFh zsU7WRAA|7FJ>+RZE5CwJHMoe-+U$t)|FR~RzM6yLv6 zSo37HG-I!x7MHqnOtJC(be7v#u(3u@_sv zIRbJz*o2uMn1p_Y3v#XUOq#56vg$cgcFot;1|hM4(_GVny=_C4MZ2dp%)F9jwYNz# z@19T@V`0{Ym4}Zl%afU3{Gac!VZyHu_i~aq>zseT-JbWjSi(kw%P&^rXErOXnyZoqw?_izR1aXBX4;n^Uj8)cc+v%rV2qx|=(| zf0l^8@!WT^@v2>$9h~Lv{-1Yq_WaA|9R4MWFg>f*y6f+Lt?;+|!owOYJ$rBeU7);q z*=>*ClFKUeS~mHI%{^!u&BN4JG<*8u`D+&GK43gw((C`DzEhI%6+>1JLn(tPdW;Kf zu}tsz>9JY!_<=Q!?=}R<>To=ola$b67+Wh7c>MEh7V~2gH_GB|YvoR{*|Zr*FmAV*lFJq5U=VWg^(Ss4`NhA0aizy9b7ud_ zM=4VJF(v;OF3%Tk?UCBobMbGvTz!;c$(75NUf-jY|6X~Vm{x50yra?XobQ};*|iUq zcb4A*J>s<@_w1H)UYKdz^NlIc#s#S7P zDv)9@GB7gGH89mRFb^>@urji+GPTe)Ft9Q(kTcC&hN2-iKP5A*61Rr@jB8Rr4U!-m sg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T30V!heboFyt=akR{0E)3BEC2ui literal 0 HcmV?d00001 diff --git a/res/ui/upgrades/processors.png b/res/ui/upgrades/processors.png new file mode 100644 index 0000000000000000000000000000000000000000..5d785baa9e78b407f2950abbd7b5b6c37ce7a04f GIT binary patch literal 1827 zcmZ`)c{Cg77XOmQ5JanDXXvA}2nm9q_O*E-NQtdtUq@maOQVSv9Xco}qPDaTEv3su zQ`(Mc(b}R)cg&DM7gLO)k=F9!uXoOz^S*QL_d9p_-Q}Nqi-=zC2x&EG006?%!^KyO z%sr8UiT`-ZRtGV_VjT&N0NgH<*$S5s>)MeXz61br^u%%b0DKjjm>&ShKm)Ky0l=CK zfHJM_o{z2A0gb@By8zHuqGKx7;53iGGyvrK_XJXDD5owqN~U`fTqWlv;8JLd#qSEcMrnp~<|@z!uv8L*F~LzFy!UM;xYT;Pnl)9;k`U7k6%N(+OSu(+fWhQ-9Q zb`S}hDKp>5yd1iCCxBCeo3@UwSA%CJU1p)5}Z0Pv@-F zE8iD>;!g`j%X~8~H%(IQpRc(fe~DFo;>M=745Ptk)Cb!M+ThpR&=6UC&=q%Vc2Q#AN&E6FM&EjYLWu2_nG(`w7D# zU&$d2_BK{fAwl3JjN~lCxx`GkhMYYnqD=%`g6b{=65^$aOEiC9=nJd5%8S7B9G9*A zzFD7Bt{FHc=YDZ*s89Ko?{eHt&N&m&6whPh!brNGfc+c)ZUM3xY#5ojc8peWY7be2 zzFxFYy<)f|uQ#MS@?wC%%&Eel$#b2Z8e@Y~w`qzq1PO;M`PVt6aZ_RFZt$Z9*IR1m+z{h4Tuy zEk*C*mf8kh_i(Ur^ubQdATP2TTlOt1KNN7rCg`K)y?^y&yk3oT>(<2U7L|Z!)U=4R zW!xLP^hu9#EqLP@8Dexwc#YmjCCpt^hl$DNN5-hk9W3Gff@&upUpapjj4BED2h}ke zZA!Q4Rop7He{4Ai*8mNvF0s!LvbN@NTLf~0Y}rsLTEiXUJEGazGxId8$BZfY0JRo& z;nm5p6@%lDN!6Fry>}#NItuGDqjI!> z>4E%_hwm$6TteYWbelXa@BNI=T-`6FR;53g*bFD;{bl8GmKNbc_Ih_V!44KTUuUJR zJn#o`gWa55JlEa%HbPg5=lVn@_XUxF@H|-wN%Gg2a(?-y+c6Tu z-W?K!o$?9!hNZ#K=%zUn*Wp%e%)|bBRy`VR>xO@B9%)3%tew=J26z0V5=4r#*(qCQ zq>uLfw@n+7X;b=f^^HOwXF||{_6SAhjI-?7qmZ_y#|Io~dD-e$2VcSdQzNA*xZJgK z`BsRuBFtXC+5TW-K=$)AOlLEl$}pd*%~TZd9R;UjM!LfQA-toz?HvW(3e2L-zYANSve>p{Ei zjrUy=QF5{Rb`r`Q{QR31FR~mg=m2I$QtMsot$Kcu_ag}pRMECJYT)hg@HR^Ii!VNc zl@ffAYh2t=&EvHzxq1(7DK~GBp3#01 zCS+>+_j#wPJNjKm)OVAM7e>aP%iSDs$IS-|!=IQAFKs5ZpqwBHp%xyt3+j`hg`F_X z5Y}AJv5xFz;mAmbe8^54-X{@716w zz1Ev=@Me91WBU-Yh4B$u`*;N3p=aWWm>IPpZNi2MuJcOzl<5*qbL@xI78px4vxDU* zYGT(|sPMBsbVM7Jsvm|_T*OTZpFLJieHmxjky>M1eV4J&VAEer22}H{T}%A8LmR#8 zrPg)^43i5%Z-2dB>XIUbZgfUrlqin`?M*N?D^@z#;dD!HftwtC-NgNb0ug~?CP3SK zK11IKB|q#c7#)j)kQ9g|lvDY|8}|JZB8i^@56?hTT+ zdeipRDBccdH-J0<_R{=w&8n#tJZ5M{zh@USqQvI}98Py7r$>dSM_WgxMvDQMqD|2# zG!})%k$0sMIMTXO&jj5@zwad0@;vnGZ>g967iE`$@K$sxZ literal 0 HcmV?d00001 diff --git a/res_raw/atlas.tps b/res_raw/atlas.tps new file mode 100644 index 00000000..211d1659 --- /dev/null +++ b/res_raw/atlas.tps @@ -0,0 +1,417 @@ + + + + fileFormatVersion + 4 + texturePackerVersion + 5.3.0 + autoSDSettings + + + scale + 1 + extension + _100 + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + scale + 0.75 + extension + _75 + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + scale + 0.5 + extension + _50 + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + scale + 0.25 + extension + _25 + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + scale + 0.1 + extension + _10 + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + allowRotation + + shapeDebug + + dpi + 72 + dataFormat + json + textureFileName + + flipPVR + + pvrCompressionQuality + PVR_QUALITY_NORMAL + atfCompressData + + mipMapMinSize + 32768 + etc1CompressionQuality + ETC1_QUALITY_LOW_PERCEPTUAL + etc2CompressionQuality + ETC2_QUALITY_LOW_PERCEPTUAL + dxtCompressionMode + DXT_PERCEPTUAL + jxrColorFormat + JXR_YUV444 + jxrTrimFlexBits + 0 + jxrCompressionLevel + 0 + ditherType + NearestNeighbour + backgroundColor + 0 + libGdx + + filtering + + x + Linear + y + Linear + + + shapePadding + 0 + jpgQuality + 80 + pngOptimizationLevel + 0 + webpQualityLevel + 101 + textureSubPath + + atfFormats + + textureFormat + png + borderPadding + 1 + maxTextureSize + + width + 4096 + height + 4096 + + fixedTextureSize + + width + -1 + height + -1 + + algorithmSettings + + algorithm + MaxRects + freeSizeMode + Best + sizeConstraints + AnySize + forceSquared + + maxRects + + heuristic + Best + + basic + + sortBy + Best + order + Ascending + + polygon + + alignToGrid + 1 + + + dataFileNames + + data + + name + ../res_built/atlas/atlas{n}{v}.json + + + multiPack + + forceIdenticalLayout + + outputFormat + RGBA8888 + alphaHandling + ClearTransparentPixels + contentProtection + + key + + + autoAliasEnabled + + trimSpriteNames + + prependSmartFolderName + + autodetectAnimations + + globalSpriteSettings + + scale + 1 + scaleMode + Smooth + extrude + 2 + trimThreshold + 2 + trimMargin + 1 + trimMode + Trim + tracerTolerance + 200 + heuristicMask + + defaultPivotPoint + 0.5,0.5 + writePivotPoints + + + individualSpriteSettings + + sprites/belt/forward_0.png + sprites/belt/forward_1.png + sprites/belt/forward_2.png + sprites/buildings/miner.png + sprites/buildings/rotater.png + sprites/buildings/trash.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 32,32,64,64 + scale9Paddings + 32,32,64,64 + scale9FromFile + + + sprites/belt/forward_3.png + sprites/belt/forward_4.png + sprites/belt/forward_5.png + sprites/belt/left_0.png + sprites/belt/left_1.png + sprites/belt/left_2.png + sprites/belt/left_3.png + sprites/belt/left_4.png + sprites/belt/left_5.png + sprites/belt/right_0.png + sprites/belt/right_1.png + sprites/belt/right_2.png + sprites/belt/right_3.png + sprites/belt/right_4.png + sprites/belt/right_5.png + sprites/buildings/belt_left.png + sprites/buildings/belt_right.png + sprites/buildings/belt_top.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 32,32,63,63 + scale9Paddings + 32,32,63,63 + scale9FromFile + + + sprites/buildings/cutter.png + sprites/buildings/mixer.png + sprites/buildings/painter.png + sprites/buildings/splitter.png + sprites/buildings/stacker.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 64,32,128,64 + scale9Paddings + 64,32,128,64 + scale9FromFile + + + sprites/buildings/hub.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 192,192,384,384 + scale9Paddings + 192,192,384,384 + scale9FromFile + + + sprites/buildings/underground_belt_entry.png + sprites/buildings/underground_belt_exit.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 48,48,96,96 + scale9Paddings + 48,48,96,96 + scale9FromFile + + + sprites/debug/acceptor_slot.png + sprites/debug/ejector_slot.png + sprites/map_overview/belt_forward.png + sprites/map_overview/belt_left.png + sprites/map_overview/belt_right.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 8,8,16,16 + scale9Paddings + 8,8,16,16 + scale9FromFile + + + sprites/misc/slot_bad_arrow.png + sprites/misc/slot_good_arrow.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 24,24,48,48 + scale9Paddings + 24,24,48,48 + scale9FromFile + + + + fileList + + sprites + + ignoreFileList + + replaceList + + ignoredWarnings + + commonDivisorX + 1 + commonDivisorY + 1 + packNormalMaps + + autodetectNormalMaps + + normalMapFilter + + normalMapSuffix + + normalMapSheetFileName + + exporterProperties + + + diff --git a/res_raw/sounds/music/main_menu.wav b/res_raw/sounds/music/main_menu.wav new file mode 100644 index 00000000..488479a8 --- /dev/null +++ b/res_raw/sounds/music/main_menu.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:811a57acb5a16af8079744e048c3809799211f1d7c6e79eaa5247ed852b5d4eb +size 23990546 diff --git a/res_raw/sounds/music/theme_full.wav b/res_raw/sounds/music/theme_full.wav new file mode 100644 index 00000000..68a7a043 --- /dev/null +++ b/res_raw/sounds/music/theme_full.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b4cbf863591aba38d1729fb1cbaa792323f045722279f0deca2492acaaf19b5 +size 123844300 diff --git a/res_raw/sounds/ui/dialog_error.wav b/res_raw/sounds/ui/dialog_error.wav new file mode 100644 index 00000000..ef7eddfd --- /dev/null +++ b/res_raw/sounds/ui/dialog_error.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b164ef5d1942b30480c202583266707cd52443cdd6fccc5304d941a4aa93c97 +size 17420 diff --git a/res_raw/sounds/ui/dialog_ok.wav b/res_raw/sounds/ui/dialog_ok.wav new file mode 100644 index 00000000..889d3426 --- /dev/null +++ b/res_raw/sounds/ui/dialog_ok.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59eea912cf8d9c6668ec89b3fbfc3cb8c49221aad43449c62d9e30486550cb2f +size 169258 diff --git a/res_raw/sounds/ui/ui_click.wav b/res_raw/sounds/ui/ui_click.wav new file mode 100644 index 00000000..3118481d --- /dev/null +++ b/res_raw/sounds/ui/ui_click.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f4c56728534d030fca2d75f297027a2774d6f765f5be84a27a3705569f878f2 +size 20158 diff --git a/res_raw/sounds/ui/ui_error.wav b/res_raw/sounds/ui/ui_error.wav new file mode 100644 index 00000000..283ea26c --- /dev/null +++ b/res_raw/sounds/ui/ui_error.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88c66825955990b1b93197c2b943d010b3190b242991db7e4c10f6db8a688bb7 +size 59222 diff --git a/res_raw/sounds/ui/ui_swish_hide.wav b/res_raw/sounds/ui/ui_swish_hide.wav new file mode 100644 index 00000000..ad7bed1d --- /dev/null +++ b/res_raw/sounds/ui/ui_swish_hide.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:250247888bb15badf626dbcb6c76daddac5bb592075d4b6fcccc4930dc3a1465 +size 16924 diff --git a/res_raw/sounds/ui/ui_swish_show.wav b/res_raw/sounds/ui/ui_swish_show.wav new file mode 100644 index 00000000..63436899 --- /dev/null +++ b/res_raw/sounds/ui/ui_swish_show.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c119251f4a7511f5d95c4b9eb208062ebb59eaafe535a8b352fcf7fbb5b409c +size 22178 diff --git a/res_raw/sprites/belt/forward_0.png b/res_raw/sprites/belt/forward_0.png new file mode 100644 index 0000000000000000000000000000000000000000..def37d7df59c7a54e687bc5ae6f6aefb5e54e4df GIT binary patch literal 3575 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 L!u8_PM>hT&J53a~ literal 0 HcmV?d00001 diff --git a/res_raw/sprites/belt/forward_5.png b/res_raw/sprites/belt/forward_5.png new file mode 100644 index 0000000000000000000000000000000000000000..850f14a8876ae2ed9a1b6f7346ffadd9daabbe75 GIT binary patch literal 3575 zcmcIn4^R}>89&>Z#?pvmiBZ$0Zr9Ob!m|JOcDEc3y~DuNBM4`KAxQRi-@?|r-E()3 zJCMqZwKb?S#MHq*!8ntoFij^mF%x16)kG&_674Xl&Je5BVq*Q1W`vlQ(`ehbcgKkq z0!f>jxp%wo`@Qe`ec$`O@4ag;FMDKG)&p5CmupsOiLV0wu6MpOzX8Ydi+=qC{P||2 zq{ec&zLn#AXSjBE&3C!7HfVuryV}1(l#Ot{q!>Yv9}h<$+T|)(7LQ2s8ek(q(4gra z^lINB6wwq9TE+Saf5ZzKwUQPSRJN1_4p3 zAPjWdf><(xg;DbRGw=!3hQk@OWfwO=Mrq$BL|cL82*4|VWkgLG6gNSOi^hmqb_KW{ znrSSD@XX>!qhT9XqcKSkGU7WzVQcCn1|7*AP!QK9fjW{5G$MLUAlZf)FpSVx?v#&l zL%d!mR|F)tO4Ai1W-WDmPp<(!$p#*jA}9hQ7>r~CBq`FYNRkf|lt>UMs2^shBH7Yi zU?Bh#kEBF~y#s70n%X=iRFOs1FvAkuJ1s0V06d~MB(3@VVySM~k}iW%p9h6h^EFL@ zc34^tN)pBZmB$2y0T?e!ECy5sFsckVl@P|(`wThiFSF>Q~U8mw|DG+wL2N`V?x!0-$y(HN_$EGD>_AjUI1 zj}Z!?x;aLm)u4(Zx9xh3kYV}_1;!lecQ#yv>LFFhDKQU9rYEbNYz;+IlWvNDADnc? zw7g~t`EBtkU4tQ}P{c_YF=@XNb}vYPV_BL_&zEa)5UTcRFlttc2*r&T)!Zd=+L=?P zVu@zK#A{ABoJz1Z{S?xWWMztyoN_{TQWPj?dRm)ci>DXNl-gJ$fZ_U_yiLI@L$za) z35ptEjHgo?_+dDBpP4}$HHt1G8`rW&W#DY#7IGsbq9HV%=-!1b0U$c zx-ZE-9bCCl(i;Fgk8t$M`x6vs3Oc}JZs-^$$c&8foWNi_Y$gQ7!*XQZllb%Bjp3{J zM>g~(V2;bMh-6CeSOuo#K~>WTBT^(1(&S{J;Z3@dKCLpfiP#2myAw?sHwBp5xJ(#t zB|`!EKiZoz@21xnC#;&Uc%N|R#*k_W_}$$i_3ldrbGfrU$&*-|s4q-66XDS;!bU$u z>z62n7YHC>oFH@X3}I+2$g?s=vm`C61kZ6!mrb!T{@2#;q){>q<1SKTQ}A}?JZ7$i z@FjDx1Ujr<6J8r1>RoW%<@)+}N_|Cvc-O~geyryd%`YA@H~L!qD;{6EbzAkl-|L9^U-H=vG(DM z1>0)xzqq@*v)w4Xxp?60VB!P*Y$9-ZSN5R`i%;+8s|H_vy8H6-o_BwKYIv}}tiJQD z*4AGQdHV%=;FUG^9(B(v{P2h7iF1i-1@|=fckRq-+wz*!)7(YmYu{Oo5}=_vNw6R zjcob-KVEp@p{iA@uE;yfPtNU#%)~bjKl_CS<;cbOZ<|&W|7G=qS;smzR23ZSoc;Xa zS3=i)OW@-`>BfdrpDeyMRMXqK=kjn~?e`iuIBn1io&m>B9RCFr7IZ^&b0G~O{af21 zWc9uT9Q8^&-if{Tumc}lO0{OYSH2WlP?P;$RbK7#rz$_4d#rN~oG4paRdD$G{key? zpkHKoYS!KlUi>pTH@YsGn^&8)dL*y5@X4%!{TFg}LED8tm;>qUIKBzei*_G@^tw*L z>4Se%Af-p?c~E$5r-QzJ+;NXu;&|}-c?f*n{~q+?%)a*>KYHFC7S8zI+z%8O{+B}w rO3RYu-`EfM;<}NUo192rnLXogH+DRKXvPiauUTnvnQz~Z9^ddE5^D{C literal 0 HcmV?d00001 diff --git a/res_raw/sprites/belt/left_0.png b/res_raw/sprites/belt/left_0.png new file mode 100644 index 0000000000000000000000000000000000000000..822d922d5d1ae48d2c5a8d653d797d6945c49d11 GIT binary patch literal 5707 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 YFIXBG)YT;UN&bL$S?572bNDXhU(-PRaR2}S literal 0 HcmV?d00001 diff --git a/res_raw/sprites/belt/left_5.png b/res_raw/sprites/belt/left_5.png new file mode 100644 index 0000000000000000000000000000000000000000..52c53bcbddb99ef4a847ad4f05ff509241b5ece1 GIT binary patch literal 6089 zcmc&&3pkWp+eQabs8Bj-_JkB;&SPeB$aV-JIg@A(?=Z}%nZY<`J4fYE3QbC+A{8Mi zO-gi-QW6rfksK2>MfJZ^vfJO^{`S7U|NpOluIrumeb>6z^W5uM_w%eZlW1?ZML~Y0 zyp)ubf|aG219*>+Tnpxd-!IqYCxACOj-@+KN@}69du-C1qeN;E*W(03SjIeCRAg=xEh-D1=Tmgt}sF5w;vtz?W_r!UY^d z?3^ee{uBZgYHS2C5D-BFOn^^<2$&2Ok0>yNezi*kpC!$3DC8@I?{5e-kvN37+1f)) z*<1jE)x*IkNDLODPtZf+&=>+i7lJ|{@o)qljzq(dI3fl?M4=!vA1LUJOQjJV%q(Vn zfp3OTUp}8hgu{b^g7kvWdTg!_97!M$;0P2Pg@S6J%Vf@?d3^IgkkQQCev0Nf1#%jUCrzU;pU!ff}SLcyog{=%W8=TA^TK>rJ9pX#g;FU*8k@@`fon%+l6(L-hvoCt zo2@O;ipArTSQNm@%n%Av)uYp?L_i-y!ckFZ7>+~%U^qO63?t+5NEiW$!|NmQR5A)f z`aa%_O$m_bN;3Xiic#4V(8lb75Xnd!fS~{c7#@uVO@d=#1PTHNBT>m%JOZzeB@lq` z*0yo!V3v~@KU$TrqJkD_00xgilF%?LjfRC0^g&j53?2_dP!TkJ9EO0Vk!euKAAU{Q z3^v!6O$B3)hC(C@P6W+^R7sK)GlU{%8r>vnWdwX{)JGw}4;(4^p6Pf0oBlt#omq4+ z#3(34A{pXW|Bhhw0tw)-STuH~-JUK07;a{CFlxMSL{PXNyWIb!OH$4xX-c%D^FZMR z&lDU-VE4=ugAVzcnM4xh+axFwi2_vUOf&r_OZ?A*`OR#QF93$?-{|%mjK`+&gGgM! z#0QM=KS>SvU-9RW0{=aGfUHl#kXL4nc87=0KSiO0eK1et=@$6)ao zDyYVvuEu{a4FC7@p|Dwj0QU!laY$SexUB+Qo*|URWiufp4u?Ufd`&cXAd5P)Tg~Ps zgwKZjQHlOCZd8Cv|3L{qdYPpF`Cs(+_qzK>h4KGmo#2ua!?%(E|JQ2q?cMBKFfAm@ z^K~aC{;V$iQze31GZ8HGe^dHNC@P+S07x(#fr5kKDHt@kkzgq>G!}`b&=7bWPEuvR zv0?vDOTR=$U&HXjLF#)Gcsi3j&K?WFm)V0QzyhWtqB^g?NYrP+*k^%q-haaQeltsSQl&6b>VlG9K$Nj=>L{Y7K$#?#Wj>~>0s z)JgfM)GL-XiPc`PST)jKPEKP)-t5G|rY77&`AMw-En#RsCQ@*<>>7I0rg9&~flsML zYeHWVZAcyaMRTc9o>@)&K}&JUQn|Gb&~8&} zjWEkZu(N4SXV}9*ycxc$rohN=FlhV!uLI0wh5{R%qipY$6>e5IEyWJ3@tlX-qa(b2 zILbBZa8%2lD-Hcy@SC|~?fia3N!{&mFIg{{&kCNH>F{ORgaq$fiuffjV6;tj?)N5f zV{5xcMLojnk<#Pq_H`VAc5vUeGd^ADU_EA4*tV?Pr*-yhlV6!HF8fkDb7h0pK8tkP z$ur@_`lp)*pZH;4PZEa%8`CW2x)AGzh5oRv9MNc$u~ej4soIh`Gw)C8Ie zIoxohxNxIWp|f>9s@5TKI(y!DZ0=;g%!M{Wb#lhkTIq;I(^;=HUnTa}y#ICa=8VVn z+^o#ZYf`7rTAy*!%7JqR#^-+syYaEqy^A93aqf~8y??Yfe!-k-)#_EhK~frM^)&Qq zJVHs-tpApAb$6^juGs!umdD|@qJCmsx=4Rd{KKpxC$9bx7>^fu+|3qD02 zE`morm_Nqs+Tm+kFH){#JlY#qTN{1UxZ*)u8+}=yPio!~WIblgyldX25YeR9t;b5q zhsG?lxb7}48NpMw{e<9`Y9)+utd%JKVb~nwbunOFffj%UwrXO$X-u9|7mNf z7YF(vAq(8bAtA>W%XbH8t>+e<7xvvQEwr)uJ=r@^v{Qr@x$d#4=sci&VyV}b?bN3( z+jhT;L)+LK(cLT~mhteuAv|WrGK+B#2yHA#%t_3kf5Dwzo6Io92H7#4U9IW$3Yqo` z&!^u5+`X%gIkpHjgmx>gUr}w4>H8d={U|H4B6#VB!-+AYCVGc^<0c0Qf%l)(WXq_}ueK09?{I;3 zPjPmU_BW#oiWHA86v3mey|{IkkUCbii;JpjUG)HAT+u1`u&fIy^LjEVrc*Oln>#Ju zUO3=ASKXZVW&U1Eu{7ZVqHe%({gRk-PlYnm3of@*xhdFbTva$#P~f)1FgCaTqo(v_ zrE{&z6EF&98lNmd9&P^ncZ7d_e|(=fG2qLg$b^`nJtJ>(a&oX<)yiVItj^8~vzjW= zn?r!&TH>y&{8eL)VY(3-SGVfI*7Viq-Z?qt)fF#(GPI?ps{Z9mlZ*_-Rq*h|Vs)dT zuEdz2%$xCwZoJPseboe%k8FP}WVe7Taxz3FYa3gZ(B)ymZ!EXR$i^e54V zp&|4E#KOL|&*8q6oy*16Vp^%y3H#%Ze4)3)RIxjXigZ`Ce~=m5*>yAs8M3f5kHzGr zlP_Mt&T&-!Io(`-xSz~0;2LbkWp`g0v{Qq3%nfTk`ASM%zS9>| z-~Se~<6Lp)j{X<2!ZU{HMMX#E4@InOxYHwdERR*@k?*Ek^0-{PN6SD|GhI|x@*dJw z^dc4A^rX43V)<10BlGQ;cR>eK>s&Le^2_5m+varMnA7;8K89W9p&~!;^`u4Tg`Okr z0V?KwzbBr&y>;~09rdKVWR2LtNn-4;Q7#9@pWnqVR6-C4H^#?v-!y#^)oAx1CRB=@ zHXgLjUvrPA)1zk~IuX6__PcOJ@ki|(<4Y>6iguMGbDVxvvCYMG7m^PYtyapqW6ZtvBt6JDWp!=o&TZWu=PWL|9d9nb-sI*M zBg?$v0$tLw?SOR7idx>zt)zxYk5is{J^Yp?gxuPsS~miXJM=sW=j?y_a#~GDuvcO8 z>P{WpZKl|3s9m4A`mCXJ82woz-(1YCG%Ic8_qb3Vt?`dP+1J<6v8YnE@sLvnP+R7? zQVY$d`uQE$?Gd*x={M|lZd<%yr(^M|_;RI&K;a20+$t@l_l8br?&4}( zn0_D4Cpm+Cjd%I(!y!LZrbg!K`@;;MqdN8sH_6_L2*$)uaMq{N<}`FxydEqX7N~+++&@ikPDNjSMl%C1XE-xN`5cY zQO|Yr+m7qX%$u67Y9BqAx!Sqf^0hC^_r;Wx3KXud>JIwVx$I?b%PWYI^`qy9Q);UK}ApQ*t%e0&l`M+?t2BF0)sa!lk?BHC|hy+ z3e@I?E1yyvmG%r3*AKaEJOoXB7CfG?ru6LDldU9OpK2OeW)L#J(5vy30QKmDZOGt$NJT z%(O|dVPRvH_=;NupF;+3mJc0#V;6f^BQY^it~2u;%ME93Fgg)&Y@t$$r3SMXx4x#p zVMB>~WY#+twE=d*x#0c6iRz7kF)iV8CiT4*i7nyH z#1WPk)ha!U+2?oJr!=(Z6yqyhcij_5jI>cvgk_b_6M)VgTa2be@|`0Dvc=}@zo+g? zTcNq3bZqOjn&G%E`A*Hctryj-wb12T&(!zrKS!|}QT6O@?^|uW|5S(dMxcZo9~#@P zAid11@cF({dIi*KX|DF`FH`D}d5fyAs6-Vv7sh!^iIa*cuZpB)h1e)nBlQF64ZXL^ z4Mt=0>BM#&Ph%PX*Fk8{(A8F1u@%=mt#|Rl+!EK@2)CjGN0sH)B3`E5u^b&xEnb^C zCT+SmMrpl+!BV4xw=^Afw3bHLpKbPo1eIRWRVRh+s}$k-kJ`6C$0Uw4U&U{7Tb5C> z=FP)iF<7oD9a@P>9uF#;x`oyjl!Ki;dMS} zqp>Qk*t0`E#ac77wc_xH5AK7zjJ@Axyn5I7@IaL~y!}mfHr6X_Kvi;aD~ke*`QEun zBYcNmd=mVG^Wrq$q*u1m@q5xmE5{TUoivb-g&z1cDOXIWtoi(D${>Li**1*RTn_Tg z7H1%1%hyZ2CRESA`jl{Ne#8l5S*GcS)<0ScHXco2@|hz^z;~#$8x_!k_ZY3kMhg>jsXINFu z7xynI@ConzVQL5OX}%6E((Gj0AUdifVYzQYNZw=R6)@x5$Uu?$DZ=ISc7J{CdjJ3RvsO}7_wIYnKIiUp>aIvU zJ(g>z>#M7%sA#yYaPfw(@yhS?sqnANxF{9AsPR{<6RN1pn4|ovs_f6#Q&CY*;`sWD z{OPM`OeoA6U_lJfIx370qg7OvIz;gS<|a^tWPl+Yo*io7QVj~pVcDV9+R(9dzB3rg zSrH=uePTR(nK7G~R2Is?9=SA%1{(+iMF27?jLQ?!qU=zg?9$+S(J%rnjOK}eC^S!K{MmvF zC}avad=UrYA(a*Z1{5K(L%~ePLI~qenB@t_(*!3B69w=wIBTpjq)$K=a{|YY5O6;^ zXE8A#7YqY=A|Z^$O<>_H(diTLubK@Dn?MUiu40(ccx+!q3w@*cAjTUMLJLpdAX2#beP}A{uAoi^I_f zHZ&a05{su{v13p=tWFjn0{#Z3`ohA);b}IczkneYhaLToP!^NMh6G^%ymy>1AOytl zc_E*?(djfdo=^nvn4p`B9SWvu&Ec?UERe*;;Rq}=mc<~TZ3sjrnn5D6&;&97;IITN znSf<}Uhe`iBb2&Qt{*Eg7Q}>YOl$}ZizBm1WE>t15ZFXCl|dwJPO{NmrEIfc? z5(s0l!)#UyIB=B%+%K&vS+QV?Y>-GH;sBTsn{9)pl8Fp7g-D^mB(ZEViAW`|8Eh2t zPruF(7ZT7R7Mybe3aQ+1rFobtpe!*v6mERbU#V7Z#MmGikA*)Nobq>ke%(LJ|2gf) zfMjDsuo)lsuwlig!(pGSU zu<)YC8;%bcK7PmLAU{_G+@AOQpr%_7-Q(F_KWga$wotSbsY1Q<9QGJ`_-9Q{|> zlVDYTE~NjE{djVjp#U!ggx^OP)PEii%Lc$Q$qXVIWW$|-2@(M`6(AAOcoG>)z?0bw zkP1uttGn^v8^iy7JWPlu1_fUzj1LF^__YcOgmx&l0186_d_I@M{8VTdF^@I=wwkC- zqzFR(*@?cHHx?-1e4&Idy-ZL*{xACbN8Np2WBmWvCyesMFxC<7B{i=4@tP#FF{Af9nz&zncH{e#GpNM!g?zroTO((c&KG z-c)~F=lAl_o#(w0EwEboQ`w2?*eRDsg2#TJRDs98Zu~F)v(P?swUl9`(wq` zLGQqd3i7j^TR11Ed-ID6IdWgl{_Ta`wwZk~Uss zX!&}r-qw1p%%t^&2d5mkg1)PzkrCE)l{iC(KIe|r#{Fi;a<5}&?un1h^7NbHx7kx@ z_JO6-?frh8l-m6R7g?0$T)E+DxD~gh(4UCdZL66(+_Mg0KP_$%d6sRqpc9BGc8V@s z)pXw2a)g2(lw-qJ4s|5T4dpYEownrWs{8oNHERYLk49ASgPsV|mJ;byu6%dvg8brJ zcw5`_u=QI)Jajp_397@^ujXgC^b{9+p1I|H<`$OfrD-ZGbvrV=qgE@?(m>LTKDFWu zskQrLrzc+5grl7>b$IqG*NnJ+?MgXzclnMcz~RBI;Nch=kq=dQVh_V#E)Z=U5gr$i-qO1wuf zxd_lZebx#`Aj}Q8R=6yyzE!njOXkqPh7C*W6wj$5J2%6-4sIixmd;RUMq&|CamMM> zRz()xhRGE>T2(QszaO(jO_6rLo>X>U@_xz5#kXXOw>Y##Zo=riK7Hnl$_(BLplaiIEy-KDZjkM8;eM0xygu?K>yFI;;gT0>v3 zmm>LS^oj}95oc_uIOkqT4D}7a=2q``d6Ht%@Ue2^*aPntzmN%Qp)HtLTQ>Vx#hU|V zxAA*)3ax?=K~wD?_wCC&RVx0_Ej7k(H!FsLhR=QsI(1XXi#ED2(=^>YZ7m-fI5;G> zvd#y9!@5Bk+ADNIT0U&64jH}L8NetS=<7=s_nnY@)O=M~?se+sPZd#S^}UTC1Yw9H zUfLhkq{n|-Rz~|VEhNVO^%2yEaA~G!{iEi`+Ve1{x91&EQFD&hsc)T>&``kM$Nc4_sI19lh~IfQ6b8uv5l?sS|y_%^PW3jao*tNuA z=3wxl5~?^X%(U!EH?}d$@WQYK|8AE*Wj)g(_N;@>{MTD`KN7kdM$VmP6y`BqjRWF$ z$qrtvx`{X^;7Qx@^AWR_IG7LWzuGifINa1ENwhAoa%s|XSD5kD;8msOzZs$)O*4wu z9u$Phu7ea5}8Mm%0}vx_b(j@XX83$!G|vO z@9ep^t{_mmr!i+qynfVgUH(Bd%R%q?M^M5&eSaiQ=|@dj_m;k>fw9}^Ft#06TAx?p zM^VYn(KQJ)t1Gp7J)&s5-lUz7++S+aQ0P{KH+qiWsupAJQ{=7I8=#UVb0_a?E84nr zFj%e~;N$~JNrw2FD}NC*Y4#@9_l^q zoEPD;Vj9)7TK=N$j_|liempU)0R^w#x)s6cm|k3OnU>T;kyjmLZ*a+pS{ON>pXj+V z)}d$W4|Uqx#Jk%a<0K!aZ*~ma^J`j})r@C+{_R-_f+o`-KR<)(^M{X}Jb!CR?<(sm zBfsOQiYJ%APQ7c0f#3c}U)4udYj@;I;ChQ)a5q(at-{n$Uqj6_7+bkP^Ln_a-yp7{ zkzg-*_rb@?@?zVCLh}csB^Bkd7RAH(61P2?jE008D{r{Ojo{W+_g!)~nL)q9cQ@s< zJ7x`^Jo!w1bxB%M*p4jB+4`3kxA#!mPo);tV;)u?)e7ub(!lDgjD7t+nO11<{9;B} zOOB?j-l5M_=6U~J_+#6{B_WU=?dOHvT^6pAkLPkydz#x0D8d&kS2Q<2O|Nyom|{M- zI$9#pOG~NF#$9>)IAwS1)AOgL$G7j8^>O+GwOu2Z9Sm) zgDyGUPM!5p6*D{MP``<~gkM(P6AR4T zccL6T2GZrTtn6u3;izX#Iroxub*t^$?r!R^6d`N_JB|)Trz95_Q;NK0kKVl}=2W@( zw{d1gsUE!X^B;!>-?^>1yp6N$C$fjm;)vbFOX9A{pV%%AT-w-YsHIIIlnX zeY>Bl(ZMWzH-~t4#m*coiWcyel9BypwEyfc(Ggw^nZsE*jSY{e+4hGx57iZ+IX*xI~KPR$fZ3{7L?kH~rS zrb=}~qw>)cnqKo^s=<(+R5{8o;xGX>zmx1xgDq4$c=@{0(!a7 zo#&#X`3^JdiPCKb-Ba2gwsXtwdF+aF(0W>pp+_NRC-s7xNO`@z+-dedMHmdpweH=& z*fQi%@Zdop{18gYGgw68ly`ZrEy?!K3p|yQLVxjgp_OGtWp7<+O-<{1sOn~)?ZCP6 z$k*Oy&(AevC&U~HpZ?2vWBgiv$nje@^Ptj*$k=C0n5Esltsi8|fmyCc+MexIU@Ifu zX_9%Dzw7PB_x8A(g-$&H$OKS0Oz1KNHcoVGsJkCI#!e(pWNPQ(xD>8>qUp^8AMq zuh!j?Ory<33#FKzeB(KW&KbXSe8kFys7HW?QBDpi5s{;G zsI+0kbSy6sNsD94nl^??B=J2HIi2&>d(QQK-}_wGGtcwf_wW8MzyEUI*TgwHS}$6- ze4&(-)FN9OOIPR_F1Z)TL%+Q`xv|jWd#;TKUrI_*U2;oHrKK;El3Ezeq__**9qdUo z4$BCjbEu$EFpCSJrKC2JgSh~0A1HuPK_4dD6fPE4z+p_fDSQXc0p-B80DYM@p*(O~ zs3V0Ix{pSr!^vi_jlm>H01FfVuwa%Sn@b9Zot zS#WqD3}=K#(9l>M%!Fu!#$&KVq9M!}g(e_T1SA@RK;ubR6v@~aHg~}xZ9F=I&p>v_`aNPkT5^}Cn^L?#y1p7X8r^PgPGreN@nJvT#^M31Oyx& zg~RdtoIB2+ZG%}@NOFY;)8D~l(>XzW1Bvf*Yd}jt0Gh&$QN}0)3X4GFC}=bZgCn8Q z>ruue6lxag0A(i~5CDGx6Dd&Qp)n*B=1*V_oyiFKTPU4IVsLmY0E!)x1^9qSF5Bmm zHU|fiEt@X@*fh}A(i9GvYQ$vHNdS#zLPS$(2pmYmBB*FA9zmcIi3lu#fk)v?&?qzm z{Jh?hLkp1Pm1O;FiP1SUNXC3XNH`(}1gIbm0X=XC90N;45Qruy1c5;?rW0t!bUKax zS(+1%2~|1Z_oY;cRdh%q1H=-rXaEC=VBio$6D$=$z!C@u6dlDd!DERS29*Ja{h`-_ zAsq<~2L0SEnGkFISwoERUru@aWlGY{BxOpnVe+BG z3z=&;+d%)hH$NuqQ)NPNn{|RFNl_3Yb#|Efl@R|kGH2HZ`GOE#|0Zu|VSEll5Crf* zb03J~e^MIAZ`scW0{^}BAk_rG0~ioN$K!|yDiuml0K}Uhhy(x&P|-LODuM9X`>$G$ zC!yx6?mx7Cj$E2A!1e*5{Rj#F&;22QL=Z%wsR$a4MnIq;ClFMkF_hm#j0uAQ;Ed_O zd^G>!&;M==|9yXG9Cjec`y#`*01tq+RglLwg)?{@77XBW{g|{*g@z1d)8}@p`PzgD zIIurD(KmUcgFNOJnee5Sc@tp&kNW;L@BUe1{A$(wm*a$#oETrpkIRb$SAXvgB+>4e|l16k-Il&mw|^jbpz%pu+dBJih4VLyg|?El;*$s z`oj3(gAEPhbk(*YyykO@gi>H61O0hvYw=q#(gH+G9%6L)sgtZqGEgK;^WQB&&)|$Cf z_9zxF@Cyv*NL>^WH+_FW>BZ>LQ^7O(Qes&x*)GM6(K;JW%=Ec0S-09=Hc?hv?uGSpe1{7z?qOp@-{N2PW) zt^HBl(5ZrO2@?CA2?K;xQo|1pcT<>XzW!N{gQLDi(|I?aZ=jm~N7 zfaTS#cEi?dr=^!W-kn}PG94cAQ`6w7%uFCK@bCrKIJpor^R-%cL`EY&q%Uq)dMrHGbK?bRsXxyT?;UOihzd#kUxAfUec4QQk6{uR48~S>cTeUF}?Kw5!g=EseY+ zL(Ut-=jP}8v42IA$tyf=_txmfdCRb+wTC*3OGBdu-fY#sqkF(jY=0-BPqRCSP^T2h z=hJC4gq!J@i%n_p_ra2UN$oQA*lk4-koNP^Pmyj1t#htl#rfIOXt?gv%MOJtc zWpqbmMKeEb`?^z}ZJyST6`NDmnd`btT@{I+KfmsC_JAO1?eq%5;9%#wskVoRr%#Jo zuDRGIO=!!I19xB%O#}6(lN-!Esx|YD%ZPM7E@hGGUF0FQ z`|c9a9Xn#Fngh&#CE|m6XxrPAAL}n9dtG`g+ZoYO6`>G(d$&Pqs>kkIDu91>j@KoH zb!5k0vh>u0-5#FlP6tkFotr9-jZm7<$ym?JO{z<&Kizynf34ga^5Wj5krlm4m@O@@ zA-5B6SfX_nymyIDjUvk`OUGu{rqrhvt>+yW*%khv*IUl4ztB@ydWgA1$I!8CbX$0G zZ>CK7K%pcy7(Vsc&KmSol6J}jGrg*o?ZXZUG04u=RVMdaubDO>l!(vgCj~sM5nY_p zuZoB|Q-5XGt`#0WZ2PiWCoHe=YYn0AnwU`h0z$I_oH~_W5B?V ztHYO1lnayA*vdDdURTzNLZTY|TuZ(70D#fK#8*xQ+xsp*+?=dy>0(uE{ z+>3K~`62XP?^1txbE(T(qaOntT8f|SZT7=|C^w3OXY0a`3`dRb@zBUAFF=#>>Xdg* zy%9XkKqpZ92VX_QvX;ib5{p~J25l!;wBPaE*1=n_IM;Czcd?qmyJqT7Q?TkL>86tP zFZU@cOt@6)*s7HlZo5F)66!5n^y7)|PJDOGv1}T)S+H2i*3yk{meLjxtueDQD+Xh0 zp6>XB;0^Sv2FBXh`=)k2Z5$U3_nkYHx^<>3T#};(OTA*@ z4}|xB7)J^PNPoU8)r0jizBY<8$2r=Htv<5?MEqkSZMk7I2I zKR<25SdkCe(q&=)l7eh~jreIBg_$byfRX)XmN?g0AC`EpOQAVuhg)vT+lin}@7?Yw z3l)FH^RJyQL%$;LPMR8O9pL3(!gW?7N1aL)x2dnyN`F`GzLGt0BNJzqT7UNCZKW0C zImyb+no_6gFZ91@*3*`Y%GS5Y$es*XoY^!eE95Vjj-81Vq6{)h&6R#G>v=rTwt01{ zhJai}eqprC;&A0T-uBm9(tkEe?E7)Ty5kVl|Fwc$`iU}C@X_7#6NYBQpuRGceuxgP zm(x*(v&f_6>A$XBx*^HFqW|dm`vo<(_t{=5Q8a(IsqfBc|4{<{(c<_Wqbr7^e_1om z?kHaA)MevvUZJ!v<7fS@BE#V)Psqk9R7ywx(aS9bWxZpQy=lU%HLs@k=QL++zj&W* zaeZess-{Bzc>N%esD|vCSn@*gyP0jtFrT!7M;CJ?(%Y-#gibK{r`TQp9qCuNc-iKWdmEc&)uZQ(;Ok65I)h| zr6-LXE!kjZ=k{?`c)!A}Tkl+mgp*V6y0#w83|dOb{8vT@kbKW9SlhXPGU=FVY!Ix< zDOGf}-&;dCd!W1A@ATe)YtLPi4lW(-T(6a*t0P~Hf*u&Is1K zwnM=Yc$yM=>#$+H`s1z-YA2I) zv|aVCO9xh_-Cc6@`@P~@SkJSMCt3=x|7c#|WwAZkvNK5gpcBq);+WG(Xx-2azG;M7 z+kRwCX~}j#7j{1Xh+%!BQqqY-V0-J0LoDK(ro(G0iwyH0zPP8euh)*+=ptvnDM?qa z;a!PqEBodZ){6R~(w6wP8;3w*#m9|CX?NEi-J;W6ms@^q6bKxa_wN@ytE`K;J-kI( z$Vv>`^I)$V-NVsuzt}3wDJ*g3*>MGaW9HPIp+KQi)n(Glz$g3PviEb+7>3qOD_3G$ z+uH}jbM2rO+?{p1r)PD+qt!Q9dU_8O;$RCp>2=|&+{UvAZ57<`7h|E_eI17fy1OH9 zc7>i6j(45)B7b~_tPbk3=dP6*!tvq*AFhWZ zZ!MZyHDNNcZiL*uySuY9V@MX+D;&hw4t48hYzP|m|4?ClZkK4Q$e}w^xS?HE_^Zcx zC;f+ekM8g~kQ3ChUNiBl}+IsAq0EmT_r@mVN+&)n1X- z<|s`HTWYKH5*SyjdjJ!?o<`{WI?aqA$J&Se=6n6v#;&(r#UJXb^iE%CIbIek_A)&g pX@BlPk5$;seVU+_XHD>w_M1T!${tuvk>oF8TPsJ)!p(c4{|BQRY4iX9 literal 0 HcmV?d00001 diff --git a/res_raw/sprites/belt/right_2.png b/res_raw/sprites/belt/right_2.png new file mode 100644 index 0000000000000000000000000000000000000000..79b30f46f0a2501e6b219bdaf78f342610b5c448 GIT binary patch literal 5858 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 E0LwRVyZ`_I literal 0 HcmV?d00001 diff --git a/res_raw/sprites/belt/right_3.png b/res_raw/sprites/belt/right_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7e55e82978e3a42ce663aaa6efd9cc5942b3154d GIT binary patch literal 5879 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 JO3Zfb{y&O$jcWh^ literal 0 HcmV?d00001 diff --git a/res_raw/sprites/belt/right_5.png b/res_raw/sprites/belt/right_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f735403a3d739861685b286c3810b90bd2c9ce03 GIT binary patch literal 5812 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 literal 0 HcmV?d00001 diff --git a/res_raw/sprites/buildings/hub.png b/res_raw/sprites/buildings/hub.png new file mode 100644 index 0000000000000000000000000000000000000000..d7953ee24fddf7dad16d01c7378959ac4d31a27f GIT binary patch literal 62175 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

_6j-%5a=cRoTbgMRPVP#+6X9tW3zj1|pax0NzL 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 G{J#Nq)a2Iy literal 0 HcmV?d00001 diff --git a/res_raw/sprites/buildings/miner.png b/res_raw/sprites/buildings/miner.png new file mode 100644 index 0000000000000000000000000000000000000000..86f15008d9eadbe550122bdf3457c34fb7076eea GIT binary patch literal 10333 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 F{|8gUawY%( literal 0 HcmV?d00001 diff --git a/res_raw/sprites/buildings/mixer.png b/res_raw/sprites/buildings/mixer.png new file mode 100644 index 0000000000000000000000000000000000000000..b68528b579d809ebaf92e3a5a7cd76ba99b8a280 GIT binary patch literal 18208 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

)S2p?`Rqf96s45r5#6&&@Wh%cEr?lYJ z1YOM< z099C4u8dNDL;d*hN4A6|)vpU&IBz0-2smh zaee8c0xaK>cWxhM;;0HmD}T7lcL_r^K=(5Es!DKh*{Q%lA?CJoKjj%FRs9+g*`jMi zFK!YSx``(XW#W3#hqge6`Q)bK-X{J)Zq0Rtr(`EE^ViwPe%XrRQux!`@Uca+bS39o zH@LZ3p_xvK(g!%5Y>?8-#NNW#72*1~n;P}F*Vx5~%6%k#e{ro(vu~{5KctwN7Fg#9 z7|<1vjZrF!WypUpcP2~7mt<}f2J7tX1hjLIYCmk42nD~JD@h&=Kmmqg75 zfv;q;nPsw;HH<0*3~gG2#v^Hzd@8u9%$-ZVtF1(U?K482mr9!}8X452$#1Xp;@xp_ zB6VI`4Lmy|On+1dW4xS2>f`MI@x1gnjZ~2aD5TYpJWb)|=Jr^hHbdvB7b|;vhgCe? zmP(ZEOa#GIZzM#%KvzE@7(9kZGpDFhCJQy9_d!ZCMfHF8w*A%W?7NW$ddrAkQ>Z~o zf+Aa5D+%B^Yw~4&+Q`YGZ3-+rr(6QbRH>pBJOg%=Ntav@r zL_Dpi5&l+kd1#xM5bs*SS=IEADap`w?0SJ&rYue!K<%63wS|}U=#lIky*{^Vr=dX# zqqn^PL+{Q0!aND=W>dDq+0@4iIcv%hb8_2dbufOFU4B28`1YM_q1 zfpIt+gbWy&H51|+mc1iWdz(9@3*9eG-!!xu+3ltxke(;k551KSLge%A0@zG!55 zrI}0J5i|rIMS5%xuuw^W-BD*(ZcFXHiJeX?5#XhTbq~?AJ22=_{89KhImK z@zA}>`P^+dfeq1B4`%~jv6u4)ExwhgfdP68scCYB+%4VOC)eu*;+k2*yRYndHqI>1 zyV8JRp&;hY*w-FbU~96|t%JcMxfLG(=}r&JJ&=9iWdao_Dhn^!UHZFzQe)r>ifjE{pE zWZb4KMzR0QOsemCRx}rmDnS)A(!A=fdCtr$FGt5qqp9VQveQ1T?&o1XzL!QTtI-}F z)FuSzM1I#zJb1LgCx;8PG4NiUQ! z^73`<$N76Ei}OTS-AAnkLt7zoj9onw1)uhDe)#F1;MY;w?gvbpnwmoP5aQxXnfAGA z$L4sar#-U1`Cddaz+LIoF-MWQ8GO8lgZbnR#*jPunNSbp^7A?QoTBFkqX84#TOhAs-x`4}bHi zn2z^fpK2>{uKe=l%fm_yfl@bZQT}sJ&}gvwR*0D&HpRq)<|%{g!h>=Z1+`o4&Uh46 z#wv8pQ&Z+rq4S+t#CJ8hyW7bbfA-$93$)EVA(2(8#Cb&*T&J1dM95U4m|R?*lRx$i z--hpn>u1V}u_&9qn_X4ePwGq#OPiXQkM}l)9EBBs7{&leq3Wh$+v08yL}^JW+|tx@ zjAiv)T?NCI#KUOs22W=F-17ugi>ng8DydkgCkvtM`tT7yu9ssiOOKQ%HI+H7>#c3& z2lAx*F5&vB!(x>Vcv9^XNtqRqU;(eALlqPhB#IPfi07atU*6rWz9yiMTfiLkA$d@m z*j161NDym5K1^sY_MIgwSNk~ZxtZH@jCvDA7@%A3P|uz6k{Ju4$x!xei=Ei-kKi*wS;QE8)`(`lzcf-F{#w zx`I5wkuB!FGeO?HEXWeG6U0F(YuJNpEjmVh>MFlL4QI9sD{9i#(bNRN!>oUeE)N}n zxbrWmL=P_coQ0l*PVLaya>PS?Y$dMeqS0L^-bjHuvk4wLQl7MOu2ClehVJF%<VbM(snW@4BuVch)AqOnHuR5KEN!_|PFo>0Bv-H?!FYezM8%W(j&Y&H(fI3OuU z11vg=Tn=qAd}h|4`H+z(*2Dk>PgdZWaT9kVCkM+EdZ}ogYx(+R4s%7bA8c>uqP^8o zD$UK&KJ)tN?gRSyZ>=Hge##ull^-GT$_iTfzQ2~$z=I2$MDJd=mrK)=^#P~5oD%+f z0*H6@kMo-rj0M+g17fhmVJS>hHv*R>(!o|5`tnEob5zlnx+64W`3wlX^z{hls6Lg_FjEGk>Wh?!gfr$yguv8leM?Ew_G=JTH6JWO#78Y%i~K30ZEfR zjbOrj0&Gm=__#5;B||@4jQ*&c@0&S6=j!&%y6EWfdGiZ64cUag} z;nM>pixw{B;5@}b$q}o6b z?%>L5`pfd0@N$c}Ps)c>D05zVH#AiABE8ir>3;K3kcS013>F(nW&%S75fv5r*ERQv zdNr{cJCl`^UawU&%ScP1X5xv$k3wa*ehxIb`_O<6FeQFiRNkW)8Y+Fk^GCKX()(Ab zh&cR}lXJflgBoL+di-93wjndQgYyPmn8di-)%=RJ~A95A@uP!N9f9Z_5!`RFnzam?Bcg&LX^ zRaN0#$+>-xq?J#O_yHZ_>5J-i0!dP=%W5@|+Rr)MBwLBOMo&)isMbUFDrRm2simoR znssk!Nus-e=P$LDq2zc~#&KCw<{-Kmema&kKyPiv%)~uAR3{1w<^VSbar)C5cUgma zdeD+m9oKci91b4N;)by`yp5Z2i!LrBK}bHiXT|?oxi4mNTO#4cqt+uAUA{Ek@sFFD{t=bR6Bx9l^vPc!D8@2-DQcCNXK8}qoe8nS*36&aJ zTL1KDZ86`VOo5Y=v+&)9qPKlUzwOL^*q}K@Aqk*&NyxZx997DLKu)g}4jM9_D)7H_^`_A|YKO{q)9?YwJb*oiw z=d@OC$~gGgwY7CW`&GE{H<#H~W~;MbqaV*yxgLDx?A}akBz@z_`nssEsQSGvHL96Iv$1CU>>?ZLW0iMfHE8xKg- zR}Rq&`-dLizfjxRl@Qn$H#Z|gHvGfG&$+M`Wgu!?BOX@DpuSgKwj!K3rsn3L`J%9Of3EWz0 za>D!xlh_xZP@!$i%-mdvo`);XgKn+7PRO~j1-2-%MXhs} zB)|%=QPKx*X~|~uIF!JQQy{ovwplW!#iq!S;%uhHe{Sx_QsC9QSgYrfmTBtOd{qvT zrH{>%i&?nfc;rbexAF5Hcwt6Mw4Rw)fu%RD&|?|l0D+H83UlE+n?ME9gv5NXXY0a+-)R8WI4S6)`q@h$>Yug zP$KKJ)BcTp8x#s>irm}je%iNhPExxc8Bw*S9?xHj3+~4_z)8W1&&~fNuUMA{%zy>@ zWne7rn$>vRTPF~ZOVsBX(~I`Z*w!U37^VSB9%EQP7!;lbPY5}c8HU7b{XJ!MUXx6VGiuU&TpT(a5953Qko9f2q$9P(CFZi$)hR0@WZC#^ zJTc=48}EV{$H{Em z0_>SMJU1PlnbGp4*68(0N-%XMH5Fi(k`EwSWYJJA88*bVCW7Kv8!7X43=wqV00t34zsmqP=J?bKyWfeE4wh%NIKVAt4A$JjeWg z_tIA9Pw-4-pOc2NkMZ>gkF5aNMfIvq5N}LYG!k%rJrB>QYCJ}Jg&o!Ku>N@F7P0+F zWHBdDDn|`Ohq7L#`SFe>k29qobQ5+~%5W6ZT1EMXy5Z&Ql>nPsWY@J1pB(O52rN+j~J?bXJQ8?ZkD%>_*b#--YYj6h`Fi=O8rP-ja%a=nlq_*8Ct``5&?UDi^ zR~;5(_GaaNBSN+4F4%-IE|AO1<0rVd#tent`xzTo%qOP_tsLm&3)$7rSwS*5V3D90qH(9jSR7e_vxk>}2k zN$r=HpoMka0CII)S_8Ma_trz<;RA+O!Q^ytT>0!X0j z-=sFrswC}+7w1)5A%96Djy=!%#6*t&%yHY!0iNYkW1z<><43NNxc3V6vh>~4h3&)n zXP-r&!--(8V4QTPQHv2wIt2xCh1qJ}DZ9`0%Qz;UX+db|9Y}#%+lBe~%gh!fUJ_wH znBM0~r;Ih(59M}k*(_=~T9P{m9r87NsrYKiX@Cb8`S#^C1$xI;2_`D~aChG7%a2JI z6Em;o*r8W`LsibF_jNxwFIu1Gyiiek?C6u%U^k{;33)eUWuDGPXb3&>;e-6NqOF`S#P;HfYspzPP{{VY%N_K1qmU6i&BYG>!e$>moMl z#Lk4SHGQkTFxkw0Mq4)WGq>;AG8>nkEwbflcGOS_Qv4Q<1kQcuo=ljcLUM#+mqTf` z!hR`IJVUqOT*c{eR@N)mem_AyMexfXF|)Pg-7Ywr*x{xoVp(DAz>@^p>pIIGW+bui zKwJa1udeNFNu6&*ydOlE?g*>Jj~W=PZ4B|5ltm~Sb8+KZ-klGVt;XHt<}nM@VU^)- z{&t^cvACil+Z2dEJtD%<4PWu52d;MJB_lz&|Ne10Lk~@_T0X6c(FWrm)lTY-e+o3f9el>HRxgYdg9$ za45OKFf#xo;2d;3p)4JZO_Vv~(RrDilwVXrgkg5Pa;V9?Cl17zSqq2mF-Juge?rB+ zl8+-VnS-DxSzN;kAwLM8v4D>$Q;Vo=PUOh~n-JfMqZp{jLNKMD*zUK^_ zC5?ae__P(5afh;_!^4R78eep6t;j_?{}W@p@=ePvd;LZ&G*+hA7wqvY+RGgC zvQqLc>u>}=*1kR)v`ygzN$>k10be5Y%h#lEpE``77!9R+2R*IKj_1at~`>TC=9vynge^gvp_O#zeJMQUD?ia zHmlH;;=CskZfWb!jdx)iz=04JFXot9jXI{c@FDO-?m|6lYj13DorcQ0P0nh^ec_3? zpGfB~182mtQ@x~bb4&&Jdi97qw@(z|EP;JXp68=Ab0ImVZ!>^s8u0&hOcg^`4-kM3 z`_=Xrj9b=U?rVbG?}%dYb0>MJA)VLg+ICegulL_GWzOG!K7Xh+9$6e7O<7Zyoqi9f zTrLWh0kHmafeJTQy^Oa`vdWwSRSI-%z?w$^o2GoBE$<-$8==Uaj4xYQcz8Y;jjbxnqJDDm P-$`mp+KSck*7yDwkJH7; literal 0 HcmV?d00001 diff --git a/res_raw/sprites/buildings/splitter.png b/res_raw/sprites/buildings/splitter.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd9a2ef0a20228f4989a26749c98ef77530131b GIT binary patch literal 19071 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 literal 0 HcmV?d00001 diff --git a/res_raw/sprites/buildings/underground_belt_entry.png b/res_raw/sprites/buildings/underground_belt_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..3b771f60c731606b5de34a7e612c26d093bef267 GIT binary patch literal 10041 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 literal 0 HcmV?d00001 diff --git a/res_raw/sprites/debug/acceptor_slot.png b/res_raw/sprites/debug/acceptor_slot.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab91b5bb436aaf874ab1ec68a9841df32dbb271 GIT binary patch literal 3063 zcmcImd2AF_9Nyh>S1v)V5b8K+L!;BVcXy^NP`U-GZYgbrqA@c2=50H4cV;^??QTJ# zHCS3wKny4#HnqkJW233cX{i?&BQXRJtqA-BCdPvRTC9k^*^6Qd)N7O3dGF2lzTf?O zuerEr?&wjIM%iq((S`H8CFniNdPWRG|J#-76X-QEJa4gKv!ze49=mPpwhXiel(KTO z-1mS8v`~&DYkrs$4TTZfW}7}U8kRs6G%-J{P*e~8)1G}erpO+A5$~gX;e1%B%v+|z z(q%x+l5&$YOVCb{qeOO_g=QYS(lo;& zNk$@(oCuqv=@ld`2m(nlB*PF0K^S$aDMbm@n3`npLIdbZ*i&}wu53u=+XsY%5Qvjkpo%^O*-XOQtjsnB_%|zY46$N}%qBP#K5;O%F-P%SuS9fMi&$h)MJL#6s0D zB^AIzuLnn}<|v9Ry8Xxo7Xt{$(KG>g4iEx_kO**4h7{*#Sm;mg_iCWV$^dJByclE+ zAdZylL|NjTg1|w-$-13{6yRJI8%?+%%lZR+z)w?Bl5M`Opn8;o{aG!oWW>lop5grx zPdJ?dL+~z+Cfos5V^cyZ#4dUjz~19>X_BmBUY7Q$m@n%_TtZ+Y*fb9eWC-g?u^hqE8qd-3r@!jGS2Q?|^dxAncV;;_(FvgfR0O#QBGBv%H5;vD_5S|V}RW5<+-=6ncba{QPXnA*KZZK58XQ? zD}CMkU{S^fhqK}H?(d!uUUycoca5)hGNN9{*X9%85U7#GGrb@+Hwdv8bQ`ugLD=e@o$yBvK^ zSNkWIb$!T24h_1dmkwPOsY?H3cit literal 0 HcmV?d00001 diff --git a/res_raw/sprites/debug/ejector_slot.png b/res_raw/sprites/debug/ejector_slot.png new file mode 100644 index 0000000000000000000000000000000000000000..a1736a7912b88e2f6d3fec669fa9a4f3d8529a7c GIT binary patch literal 3064 zcmcIme{2&~9B&5$2BN@5Lpi@3wcNz+5+&p<`@Qra`moyVvemdw1O3){ZGQ z7!=f)n5ZDK@Ixcu4=^$EBd9F#kAOQ0TFSP+I4)rbGGYd4N5vJaon2dIEv z4C|EHiw#({xV#!Ht_OmQ&zO!)i;KuW6j~A%k498ejQjAUT@j7#X%feh5UbvY7ugQ6 znm`3stQipFU2X!<9FKVf7wu*_L3jvbDB4R>UXo@B+AVUF$S_#?gClQ-91<)2rDvDl43}PArOKvn^a4R6RJ6>*Mc9Kz)*Bc(NxT~C~l~9zGs1$~zu7;D| z0s*m1H7!X6u*~nn5mlF>$f88Spof-u!VM&jpaAD3yg`a3D3%Y>Ue*hOf~R-AUjq%c z0_^pvVvsd}Y-B*=WMAm{Vpa|fhWIiO&RLGs$J7P1}P*6Qek-k=K zRx+~4K%U`)5@O{R7=rh3G~o@=JmMFW1<0|K%t<(Q&2O<5(Tsp5qnNXHH6&Fj&Q?s6 zy{2@1Rl!B+QAEL#LKG!n*NP7ZcAlY(r>B*E;xsTuDYLOUh>YGK`6-yGg{+ulz@jjU z=|J>FUXQ;iHQt!L6mkQK1`Oer+(AMHoJ2^hAP~V2EeirI(~v<~zCL@F?W4w9WS=$< z>LfJ`QTrwFTi*{SL5k&Mif}^;5;V&(gut>$XArWi>;ZznfgA3pZ*~3u`vIET2#r1p z(}aLm%MYvp|1xXI8^`Y55Vmkb5$KlFEV z-3_R_+(38#Tb@Y!fK0Un^6%Xu_3lpvv(!#c^57Bs>k9)_B07mg)Gagp^PhFPlz;8t zc1&A1$&L59DfCXE>xVte+)dRIdiQ7rk)ohq%L$RaoXPs*bPu>CN4hRYiF( z>>l_0T~pR=7$dGmW>xt{Yf;b9xhHq9541XZYIb#OKXRt!*wjx(khK$c z$oF>-Jy$jQ=$jh~K5{>;>*tkJ&zw+z$#)n?3 zb8b!SS$Zt@t=!Ug5`k`K&68C4z=_E7_u=KOqjn71Hs*wSuuD4NFMTaxb{BxFueMaR z40CFUkMB9za&YIPn~B=|9{=vO7dqMxH3lwDl9hK^ulKpwQbG-Khv$p=x^=~9% zt(%W6-ni}ELVobsEKkqp-`*bi>d7|V`K+`4OSizg-52r;JfCJSa5lHsw|^YwyUyk5 zS>p@0Tpri<*xqc?dF9L1`STV$@l|lz;Od?3mEDb7r;P15(6v0+w(w40^pWhBe^gaJ zz2T!3m3Zyr=A;*Mvb8nOWLG~sYu~!MeP7R-S&rro?`of(WxSO?@8apg z;Tt!skkH@V3;nr>?2-nD*J{FKF81Kc~Y{HHzL0 zsK{D`iI}$*SpjHG+r7Og2tDDI9`kXUhsJ~ZKNxz-LgQ{bLQ&DN70eq6D8N%t&T~t+t#~& z3wIpX_g~R%ggpy+7IsYB30xG|wq8F5SSwi)9QR+ZZNVxuCRJ4gmNlQxTXUx+%CUug z-?xx$*|rG?Q=a7&S(v%JzG3KdNz1gTQjzP5k;GzFg$5{HyO0$PZ7%CDLBOm9DJS)8F_j)QZzJB9wnlmw%HZ3jB01%QerSNGR+_S) zgQ@L1*fZ^fIcDs;i5bT{HalGwyNQhx){R%X;C^4wnTnvgzph*+C~!1E3b5UcV}hCK zArhN0bz{>@Vr+KpjvM=(#B-6iVSB4g;pZXK^Q=l014hS9xZ~h1XmNoI3Lc~}-z05} z6B~K9gCSas28k#$0;Q5>WX!E19~=6=YIR;pzf481Z zQ+-u;0imkgLxZY3b7s`r=|iHooz6Awe8PeBg5j|9&h@1Y9Gab)HeD7LO`qmDP?yk!Z!WHk zpo8}Y{k`GngWrF8`58@r_R^0p{j&e@A5TB``~&k-dAYd%?N`^nn{|Hsb%7 literal 0 HcmV?d00001 diff --git a/res_raw/sprites/map_overview/belt_left.png b/res_raw/sprites/map_overview/belt_left.png new file mode 100644 index 0000000000000000000000000000000000000000..9279c743e9b85db026d9a7947f57a8f2e9c4d668 GIT binary patch literal 1669 zcmcIl&x_nt9M7&+wp$7X6^f^jUX+^T4k{6Tg z&g=-H1wj$|2S~+>;z>Pv5PuxKcvw7$J@ud`DfQq%@KC>Re#9c}G8aQ$@?P?JpYP}U zBj3Egz4hYR)u&b^Njlr!Z0*2Z7GvcxxEAB_pKv>!ZC))T>CEF|EJ+{UJTFP7j^j?Z z?D|(+$`g%*JYd==$p9@$moASoLibrI2do#To^to=?-V%>J!Q}Kk)JhLKi(YYYsS8O~(Wb>LOb{@A zL^9pbkZ@@Z^!<~eNm8MUa^n!J%=A8xxab^ZOy6MzKgcQDIAm#gVQws>)!ytNA51(A zsm=y00ayXTjLKBj=Or)t{2_i+uPbjdx0y3i^1Q?OV4kS$Ig8wEio`hb(|d6m@?r6e z5H;JwTBKy2f)Pe4vQ=buFmeqzjf)7o2u-0rltM^KvKW|$adfl@)c4(XT9hQEtljby z5T(U&=wjP3A{II-OpuD}maPVX(@;$lhY@j1>R4=|3--4-JrEHT`=^x~ata((kX(y8 z*d&&v1`SeEF|z7vfb2kZ8WcySVPZ_kobBa2hL48~?q?OMLSQrzu??eUskGq)YRv$~ zMr7M+okiHdh|~iERE5-yc%Bd_l{g_ire|qSk^fcG<&p(4*LRA!Ik2Sjf%om1Ljp8@F!$)Cas9+g9qv-KWCdXf6l zAEv(`hbOCFEcgGf`dM&kpQJqo9aL9@Kf35O)70qy&D!MMeSK*Thh`_HRhNZD)u&ks z)H!rve%pTnI{2&Y)_SM=?wy~F)$i95IGt2X z($fzRMDQR8UOb7n1@YuX#ls#H{0r2@^BzSHUOaeEcB}g3BD+IhY)GY2`F+3d_dW9U zhx>c4U08c|O;MB!t=;CKxC41T`Gi=D@%T@1dn((#St!cW&&aEyeEQj@qMZLRZXcJ& z!5fJ1q>3pIS#_9X0<9=lwuTudC#(b^>%^(A{&D9!6~xq6Z`1-9WDVAhcgHz98t=8q z_=I>=-FgLF86rWDuo8n|(n||8^wkM35_@^9t6%~tPkeP-It0hTK4|cqfm*e$5yP$l z$EzB3%l5p>z=VdYLsvH}&8Q1EPq&YAM&W0w*0$r3lr^3rj?<0we_9$ceAuD)4Cv4}GrRAl$GfEb=SwHVhBBexU zJ(dVqA%qzVS6P>ryy)`B#Ibn2h$cggoZ*t^ZO(i1Lha94K%*fGU%zA+>8(oiZ(Q45}H_cC-+>ShG#nbD~hJo-xrS?3A+L7jYbys7q+cHCkKvM;jpor%Q7OfH|xWn`;?Wo{iH4Wb5dBCa2xg{G~u!|^m<3dz#H2Xx3 z*gLabF9wsoLzu{R_f;b6%!JM(Sogef9r><=RU7|^X}cs`uh6iU(fmf9IgIR*}wYjC*HjS z_}hC2s~@3TcPqCyHv8Xyv2yLX$_+CVFdmF literal 0 HcmV?d00001 diff --git a/res_raw/sprites/misc/slot_bad_arrow.png b/res_raw/sprites/misc/slot_bad_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..27c938ac631e3e6bde907a8a623ea963799d415a GIT binary patch literal 4745 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 T;9sxl{w(tL^yQbhho}7qs4fn2 literal 0 HcmV?d00001 diff --git a/res_raw/sprites/misc/slot_good_arrow.png b/res_raw/sprites/misc/slot_good_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..760ab1711c773a02cb229c9746da6159c9f9b92a GIT binary patch literal 4344 zcmcgw3s@6Z77l^}B8mkUilRfTD=1+yd6H;END1*8qLzzM;r)#!>NziIPl%}q0SBbn5%qNYG^bIYwBY}JD6riqm5U~ zfPPH56>aQsFo1XSxgp_!Q?OyK@h?cA_8#FWwL}!=8&o% zU?+}h(SKLw3K5QwgS?4>$ZY8j|;DQnAdsx2m59H6p5~U2J7=WNCBOLU<9CR-LfXC&sxx?cD zGCd&=5z9cRVo<&arj6akX;JFFd2(~wfF4pkE#ks!mbQW)@P_%&$k@1rMp1i~XwoFPS| zQU;gBabrYqxB>=8%42cZ2#bSo0HH=h&k=G#|K^XB(Vs*=Y#xh3m5~J4jbQqpkB2Yi zBRnp~W=Pp6s0}_S5Ws0rFMK{O6|nh41UF*zcz)9s{`z<@QW;CApJSK`Rij{2CDa-b zU8*J(5UNtiW!PYu!Ldqwc&{>4CZr{yXMJeYyy1je_8b$Q_hNtm{SW>9A@5$TEsn;! zzjB>m>bx-265!u%0U zlAfySUK|m=!)l`ycKq6wa;J+)z8}y(8He@NPp9AU+BMx_{=WUq-i)W_Atr^Q2Z1L< z4|h!;A6oJ-z|M-4Y~NdCbN#&k@uu{q^oH~&&CAZ-exv1dOXlTM>_bmV?v~fr*OzVo zs+OJ6g@l`bKIVtH-zJP*k(j@?r_yv%*E<t;$FIA$@{cv zZD);FrOYdnm&cp$$hwlar_jECK}TCiKd)67{#bv;XqEA;#Wy>y?p7WfQ&C`?5+}Km z*jRS6`r_rsPN{v%^6SW$it>zl3zf?Niy7L`9BTiO?mJqEg=rLQskd~{xx|a^Sr+*m z8|$|J7svJ%`O~ebH34pgiReMQEZ@ExW2C(Axfede8ZyPD*Z!7toK{iLGB$5T(Nu-+ zwo4WtzI(@3k(|f5&_4DbysIgnr8J$1@O1&EN-RR|cU+nw60g3WmD7LYmfsI4({mmo zCAY4;J}+W+*~!icD(fHfJ1=!N`rWSgsX3XB&BTwy#>YG~<~v;Ko*12pPM&8}_NeSi z^~DE8j31=4r%t?54xB*O~s~2xd}*2axUnZaGizNGv!JkX>$p4VEj_ga zt*)uW*{f|rc6wKj!}hg(mzy0<<~TY{`P!*5*lVNxIf9t#@iEQ4p>)oK>xTo1x14C} zmY6R#F{$d8pf~d!S4kwENvjsJfjsnv)tAcxJ(GeK&IND63h&D9+;=>Czx3bibt5t{ zvZw`Fb#Gr+E}cKmw?b6~7N#mhR&|zIv>(Frl$PK5+i^GTH}R1UeoXI*T~9WQ&ra>qU7)Ph z)tfaOJzes}Pw&GUFHaGd5uxwP!={`$zx?59vr>zJ^dP>ryJd@D{`}I@-GxyQD_-~YY5j>$1#h=k zO>*z+e7eyot3O8dbLfWka&#s+r*vm(m{CgN_L`pd9pBU2v75V~vs*$JzSVo)tGc4v z)?@B0+eA3=kyAo-{QA1$iIOVWk|(oT@76hosY@^1p7(3mL1&3*&dS_6r^p$l@43Wp zrtzK5tzA*DBHzT}fzTcPvCzxH%KQI+x3f3rP7kHx&CUq=W={2V{|LEUu8*CNmysM% zGJD}t8|$r=%OTtT!;`u?+>g>aU=K-(XuIR$N7-+eDO%T6_Y{2IxA$K2-lu}|3AC!i Xe(RH7v%5q6H{t8$FV1^2e8ay04{}?h literal 0 HcmV?d00001 diff --git a/shapez.code-workspace b/shapez.code-workspace new file mode 100644 index 00000000..e0766264 --- /dev/null +++ b/shapez.code-workspace @@ -0,0 +1,18 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "files.exclude": { + "**/build": true, + "**/node_modules": true, + "**/typedefs_gen": true + }, + "vetur.format.defaultFormatter.js": "vscode-typescript", + "vetur.format.defaultFormatter.ts": "vscode-typescript", + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + } +} \ No newline at end of file diff --git a/src/css/adinplay.scss b/src/css/adinplay.scss new file mode 100644 index 00000000..8b69bd84 --- /dev/null +++ b/src/css/adinplay.scss @@ -0,0 +1,107 @@ +#aip_gdpr { + &, + * { + text-shadow: none !important; + pointer-events: all; + color: #111 !important; + } + + #aip_gdpr_banner { + padding: 5px 0; + } + + #aip_gdpr_message { + padding: 0px 15px; + } +} + +#adinplayVideoContainer { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 20000; + background: rgba($mainBgColor, 0.9); + pointer-events: all; + cursor: default; + display: flex; + justify-content: center; + align-items: center; + + *, + & { + pointer-events: all; + } + + &:not(.visible) { + display: none; + } + + &.waitingForFinish { + .videoInner { + @include BorderRadius(4px); + overflow: hidden; + + &::after { + content: " "; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba($mainBgColor, 0.9) uiResource("loading.svg") center center / #{D(60px)} no-repeat; + @include InlineAnimation(0.2s ease-in-out) { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + } + } + } + + @include InlineAnimation(1s ease-in-out) { + 0% { + background: rgba($mainBgColor, 0.1); + } + 100% { + background: rgba($mainBgColor, 0.9); + } + } + + .adInner { + @include BoxShadow3D(lighten($mainBgColor, 15)); + @include BorderRadius(4px); + @include S(padding, 15px); + // max-width: 960px; + display: block !important; + + .topbar { + display: grid; + grid-template-columns: 1fr auto; + @include S(margin-bottom, 15px); + @include S(grid-column-gap, 10px); + + .desc { + @include TextShadow3D(#fff); + @include PlainText; + } + + button.getOnSteam { + @include Text; + } + } + + .videoInner { + // width: 960px; + // height: 570px; + // min-width: 960px; + // min-height: 570px; + background: darken($mainBgColor, 1); + display: block !important; + } + } +} diff --git a/src/css/animations.scss b/src/css/animations.scss new file mode 100644 index 00000000..3e9b22f7 --- /dev/null +++ b/src/css/animations.scss @@ -0,0 +1,13 @@ +@include MakeAnimationWrappedEvenOdd(0.2s ease-in-out, "changeAnim") { + 0% { + transform: scale(1, 1); + } + + 50% { + transform: scale(1.03, 1.03); + } + + 100% { + transform: scale(1, 1); + } +} diff --git a/src/css/application_error.scss b/src/css/application_error.scss new file mode 100644 index 00000000..a53e4aa2 --- /dev/null +++ b/src/css/application_error.scss @@ -0,0 +1,67 @@ +#applicationError { + z-index: 9999; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: $mainBgColor; + color: #333; + display: flex; + flex-direction: column; + align-content: center; + align-items: center; + justify-content: center; + @include S(padding, 30px); + + @include Text; + text-align: center; + + h1 { + @include TextShadow3D(#ff0b40); + @include S(margin-top, 20px); + @include S(margin-bottom, 30px); + @include SuperHeading; + @include S(font-size, 35px); + } + + .desc { + // color: rgba(#fff, 0.6); + color: $themeColor; + text-align: left; + @include PlainText; + font-weight: bold; + + a { + cursor: pointer; + pointer-events: all; + font-weight: bold; + display: block; + @include TextShadow3D(#ff0b40); + @include S(margin-top, 10px); + } + + display: block; + @include S(max-width, 350px); + width: 100%; + } + + .details { + font-size: 11px; + line-height: 15px; + color: #888; + font-family: monospace; + text-align: left; + @include S(padding, 6px); + @include BorderRadius(2px); + @include BoxShadow3D(#eee); + position: absolute; + @include S(bottom, 25px); + left: 50%; + transform: translateX(-50%); + max-width: calc(100vw - 40px); + box-sizing: border-box; + @include BreakText; + min-width: 300px; + } +} diff --git a/src/css/common.scss b/src/css/common.scss new file mode 100644 index 00000000..7b8bafd2 --- /dev/null +++ b/src/css/common.scss @@ -0,0 +1,662 @@ +// Common classes and style + +* { + margin: 0; + padding: 0; + touch-action: pan-x pan-y !important; + pointer-events: none; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); +} + +html, +body { + overscroll-behavior: contain; + overflow: hidden; + font-family: $mainFont; + font-synthesis: none; + + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +html { + position: fixed; + // scroll-behavior: smooth; + background: $mainBgColor; + + // Disable zooming and thus + -ms-touch-action: pan-x, pan-y; + touch-action: pan-x, pan-y; + -ms-content-zooming: none; + + top: 0; + left: 0; + bottom: 0; + right: 0; + + background: #dee1ea; +} + +body { + color: #555; + user-select: none; + -moz-user-select: none; + -ms-user-select: none; + background: inherit !important; + + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: break-word; + font-style: normal; + line-break: auto; + font-stretch: 100%; + text-rendering: optimizeLegibility; + text-decoration: none; + text-size-adjust: 100%; + letter-spacing: normal; + scrollbar-width: 6px; + -webkit-font-smoothing: antialiased; + // -webkit-overflow-scrolling: touch; /* stop scrolling immediately */ + -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ + -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ + + // Internet explorer + scrollbar-face-color: #888; + scrollbar-track-color: rgba(255, 255, 255, 0.1); + + overflow: hidden; + @include Text; + + // For recording the bg video + + // filter: blur(5px); + // &::after { + // position: fixed; + // top: 0; + // left: 0; + // right: 0; + // bottom: 0; + // z-index: 9999; + // content: " "; + // background: rgba($ingameHudBg, 0.5); + // } +} + +// Dirty hack +* { + @include TextShadow3DImpl; +} + +img { + -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ +} + +i { + font-style: normal; +} +b, +strong { + font-weight: normal; +} +u, +a { + text-decoration: none; +} +input, +textarea, +select { + font-size: inherit; + font-weight: inherit; + font-family: inherit; + line-height: inherit; +} + +button { + background: transparent; + border: 0; + pointer-events: all; + cursor: pointer; + position: relative; + @include TextShadow3D; + + &.prefab_BuyButtonWithResources { + display: flex; + box-sizing: border-box; + @include S(padding, 6px, 4px); + // letter-spacing: 0; + background-color: color($cyan, 400); + flex-direction: row; + justify-content: center; + align-items: center; + @include S(width, 85px); + + &.tooExpensive { + color: $colorRedBright; + background-color: #555; + cursor: default; + } + + .cost_entry { + display: flex; + flex-grow: 1; + justify-content: center; + align-items: center; + } + + b { + display: flex; + flex-grow: 1; + justify-content: center; + align-items: center; + } + + &.tooExpensive { + cursor: default !important; + background-color: #565859 !important; + b { + color: $colorRedBright !important; + } + .cost_entry { + opacity: 0.6; + } + } + } +} + +.styledButton { + background: $themeColor; + text-transform: uppercase; + box-sizing: content-box; + @include S(padding, 3px, 10px); + @include IncreasedClickArea(10px); + @include BorderRadius(4px); + @include TextShadow3D(#fff, $borderColor: #28292a); + @include ButtonText; + @include Button3D($accentColorBright); + border: #{D(1px)} solid rgba(0, 10, 20, 0.2); + @include S(border-bottom-width, 2px); + color: $accentColorDark; + letter-spacing: 0.05em !important; + box-shadow: 0 #{D(1px)} #{D(2px)} 0 rgba(0, 10, 20, 0.2); + + .keybinding { + @include S(bottom, -2.5px); + @include S(right, -2px); + } +} + +::selection { + background: $colorGreenBright; /* WebKit/Blink Browsers */ +} +::-moz-selection { + background: $colorGreenBright; /* Gecko Browsers */ +} + +input[type="text"], +input[type="email"] { + @include S(padding, 11px, 12px); + @include S(margin, 10px, 0); + border: 0; + cursor: text; + display: block; + text-align: left; + box-sizing: border-box; + background: lighten($mainBgColor, 8); + color: #eee; + text-align: left; + + user-select: text !important; + pointer-events: all !important; + + @include Text; + @include IncreasedClickArea(15px); + @include BorderRadius(4px); + + &::placeholder { + color: #fff; + opacity: 0.4; + } + + transition: background-color 0.4s ease-in-out !important; + @include TextShadow3D(#fff); + @include BoxShadow3D(lighten($mainBgColor, 30)); + + &:focus { + @include BoxShadow3D(lighten($mainBgColor, 35)); + } + + &.errored { + @include BoxShadow3D(mix(lighten($mainBgColor, 30), #f77, 25%)); + + &:focus { + @include BoxShadow3D(mix(lighten($mainBgColor, 50), #f77, 25%)); + } + } + + &.input-token { + @include SuperHeading; + text-align: center; + @include S(letter-spacing, 30px); + @include S(padding-left, 30px); + } +} + +a { + color: $themeColor; +} + +button, +input, +select, +textarea, +a { + &:focus { + outline: none; + } + font-family: inherit; + font-weight: inherit; + pointer-events: all; +} + +a { + text-decoration: none; + cursor: pointer; + pointer-events: all; +} + +i { + font-style: normal; +} + +input { + user-select: text; + -moz-user-select: text; + pointer-events: all; + cursor: text; + border-radius: 0; +} + +canvas { + pointer-events: all; + image-rendering: auto; + // &.smoothed { + // } + // &.unsmoothed { + // } + letter-spacing: 0 !important; + + transform: translateZ(0); + backface-visibility: hidden; + -webkit-backface-visibility: hidden; +} + +.fontPreload { + position: absolute; + top: -100px; + left: -100px; +} + +// Scrollbar +::-webkit-scrollbar { + @include S(width, 6px); + @include S(height, 6px); +} + +::-webkit-scrollbar-track { + background: rgba(#000, 0.05); +} + +::-webkit-scrollbar-thumb { + border-radius: 4px; + background: #cdd0d4; +} + +::-webkit-scrollbar-thumb:hover { + background: #d8dce0; +} + +#uiTestPlaybackCursor { + position: fixed; + top: 100px; + left: 100px; + z-index: 9999; + border-radius: 50%; + background: rgba(255, 255, 0, 0.4); + width: 24px; + height: 24px; + border: 3px solid rgba(0, 0, 0, 0.5); + margin-top: -12px; + margin-left: -12px; + box-sizing: border-box; +} + +.pressed { + transform: scale(0.95) !important; + animation: none !important; +} + +.pressedSmallElement { + transform: scale(0.88) !important; + animation: none !important; +} + +.spritesheetImage { + display: block; + position: absolute; + background-repeat: no-repeat; + z-index: 1; +} + +.inlineTextIconSprite { + position: relative; + vertical-align: middle; + display: inline-block; +} + +.badged { + color: color($purple, 300); +} + +.prefab_LoadingTextWithAnim, +.prefab_LoadingTextWithAnimDelayed { + display: inline-flex; + align-items: center; + justify-content: center; + text-transform: uppercase; + + @include Text; + @include TextShadow3D; + opacity: 1; + z-index: 20; + color: #393747; + + &::after { + content: " "; + background: uiResource("loading.svg") center center / contain no-repeat; + @include S(width, 15px); + @include S(height, 15px); + @include S(margin-top, 1px); + @include S(margin-left, 5px); + display: inline-block; + vertical-align: middle; + } +} + +.prefab_LoadingTextWithAnimDelayed { + @include InlineAnimation(0.6s ease-in-out) { + 0% { + opacity: 0; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } + } +} + +.prefab_FeatureComingSoon { + position: relative; + + &::after { + @include S(top, -5px); + @include S(left, -5px); + @include S(right, -5px); + @include S(bottom, -5px); + content: "Coming soon!"; + z-index: 10000; + background: rgba(lighten($mainBgColor, 0), 0.4); + @include BorderRadius(4px); + position: absolute; + display: flex; + justify-content: center; + align-items: center; + pointer-events: all; + @include PlainText; + text-transform: uppercase; + } + + opacity: 0.6; + + > * { + opacity: 0.5 !important; + } +} + +.prefab_InfoIcon { + @include S(width, 25px); + @include S(height, 25px); + // background: uiResource("icons_small/info.png") center center / contain no-repeat; + z-index: 100; + opacity: 0.8; + cursor: pointer; + pointer-events: all; + display: inline-block; + position: relative; + @include IncreasedClickArea(10px); +} + +.gameState.prefab_LoadingState { + text-align: center; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + + .loadingImage { + background: uiResource("loading.svg") center center / #{D(60px)} no-repeat; + width: 100%; + display: flex; + flex-grow: 1; + } + + .loadingStatus { + position: absolute; + @include S(left, 20px); + @include S(right, 20px); + @include S(bottom, 30px); + @include Text; + @include TextShadow3D(#aaa); + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + > .bar { + display: none; + @include S(margin-top, 15px); + width: 80vw; + @include BoxShadow3D(lighten($mainBgColor, 10), $size: 1px); + position: relative; + @include TextShadow3D(#fff); + height: 2px; + + .inner { + position: absolute !important; + top: 0; + left: 0; + bottom: 0; + z-index: 1; + @include BoxShadow3D($themeColor, $size: 1px); + @include BorderRadius(4px); + + transform-origin: 0% 50%; + + @include InlineAnimation(1.3s ease-in-out infinite) { + 0% { + background-color: darken($themeColor, 5); + transform: none; + } + 50% { + background-color: lighten($themeColor, 10); + transform: scale(1.01); + } + 100% { + background-color: darken($themeColor, 5); + transform: none; + } + } + } + + .status { + display: none; + position: relative; + z-index: 2; + display: inline-flex; + @include S(padding, 5px); + @include PlainText; + } + } + } +} + +.grow { + flex-grow: 1; +} + +.checkbox { + $bgColor: darken($mainBgColor, 0); + background-color: $bgColor; + @include S(width, 45px); + @include S(height, 20px); + display: flex; + @include S(padding, 3px); + box-sizing: content-box; + cursor: pointer; + pointer-events: all; + transition: opacity 0.2s ease-in-out, background-color 0.4s ease-in-out, box-shadow 0.4s ease-in-out !important; + position: relative; + @include BorderRadius(20px); + @include IncreasedClickArea(10px); + @include BoxShadow3D($bgColor, $size: 2px); + &.loading { + opacity: 0.2; + } + + .knob { + @include S(width, 20px); + @include S(height, 20px); + display: inline-block; + transition: margin-left 0.4s ease-in-out !important; + background: #fff; + position: relative; + @include BorderRadius(20px); + @include BoxShadow3D(#fff, $size: 1px); + } + + &.checked { + background-color: $themeColor; + @include BoxShadow3D($themeColor, $size: 2px); + .knob { + @include S(margin-left, 25px); + } + } +} + +.keybinding { + background: #fff; + text-transform: uppercase; + @include S(padding, 2px, 1px, 2px); + @include PlainText; + @include BorderRadius(2px); + &, + > span { + @include S(font-size, 9px); + @include S(line-height, 11px); + font-weight: bold !important; + text-shadow: none !important; + // font-family: Arial, sans-serif !important; + } + + font-weight: bold; + color: $accentColorDark; + text-align: center; + justify-content: center; + align-items: center; + @include S(min-width, 12px); + display: inline-flex; + position: absolute; + @include S(bottom, 0px); + @include S(right, 0px); + z-index: 999; + box-sizing: border-box; + @include S(height, 12px); + overflow: hidden; + border: #{D(1px)} solid $accentColorDark; + + .keybinding_space { + @include S(font-size, 17px); + @include S(line-height, 11px); + @include S(margin-top, -12px); + } +} + +.xpaystation-widget-lightbox { + z-index: 19999; + .xpaystation-widget-lightbox-overlay { + background: rgba($mainBgColor, 0.94); + } + + &, + iframe { + pointer-events: all; + user-select: all; + } +} + +iframe { + pointer-events: all; + user-select: all; +} + +// Steam overlay fiy +#steamOverlayCanvasFix { + position: fixed; + top: 0px; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + opacity: 0.01; + pointer-events: none; + z-index: -1; +} + +.sentry-error-embed-wrapper { + z-index: 10000; + background: rgba(0, 0, 0, 0.9); + * { + text-shadow: none !important; + pointer-events: all; + } +} + +.cpmsrendertarget { + &, + * { + pointer-events: all; + } + + background: rgba($mainBgColor, 0.94) !important; + + .cpmsvideoclosebanner { + font-family: GameFont !important; + font-size: 16px !important; + border-radius: 2px !important; + background: $themeColor !important; + @include BoxShadow3D(darken($mainBgColor, 12)); + color: #eee !important; + &:active { + @include BoxShadow3D(darken($mainBgColor, 12), $size: 1px); + transform: translateY(2px); + } + } +} diff --git a/src/css/dynamic_ui.scss b/src/css/dynamic_ui.scss new file mode 100644 index 00000000..8b005eff --- /dev/null +++ b/src/css/dynamic_ui.scss @@ -0,0 +1,43 @@ +// Removes the unit (px, %, etc) from a value +@function strip-unit($number) { + @if type-of($number) == "number" and not unitless($number) { + @return $number / ($number * 0 + 1); + } + + @return $number; +} + +// Helper method to scale a value, for use in calc() etc +@function D($v) { + $baseValue: strip-unit($v) * 1px; + @return calc(#{$baseValue} * var(--ui-scale)); +} + +// Helper method to scale the font size +@mixin ScaleFont($fontSize, $lineHeight) { + font-size: D($fontSize * $mainFontScale); + line-height: D($lineHeight * $mainFontScale); +} + +// Helper method to scale a property value +@mixin S($propName, $v1, $v2: "", $v3: "", $v4: "", $important: false) { + $impSuffix: ""; + @if $important == true { + $impSuffix: "!important"; + } + + $v1: D($v1); + + @if $v2 != "" { + $v2: D($v2); + } + + @if $v3 != "" { + $v3: D($v3); + } + @if $v4 != "" { + $v4: D($v4); + } + + #{$propName}: #{$v1} #{$v2} #{$v3} #{$v4} #{$impSuffix}; +} diff --git a/src/css/game_state.scss b/src/css/game_state.scss new file mode 100644 index 00000000..60fab61d --- /dev/null +++ b/src/css/game_state.scss @@ -0,0 +1,31 @@ +$gameStateTransition: 0.2s ease-out; + +@mixin StateAnim($properties...) { + transition: all $gameStateTransition; + transition-property: $properties; +} + +.gameState { + display: block; + // background: $mainBgColor; + height: 100%; + width: 100%; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 0; + overflow: hidden !important; + @include Text; + + @include StateAnim(opacity, transform, filter); + opacity: 0; + // transform: scaleX(0.99) skewX(1deg) translate(1%, 0.5%); + + &.arrived { + opacity: 1; + filter: none !important; + transform: none; + } +} diff --git a/src/css/icons.scss b/src/css/icons.scss new file mode 100644 index 00000000..fa124f67 --- /dev/null +++ b/src/css/icons.scss @@ -0,0 +1,22 @@ +// $icons: ; + +// @each $icon in $icons { +// [data-icon="#{$icon}"] { +// background-image: uiResource("res/ui/#{$icon}"); +// } +// } + +$buildings: belt, cutter, miner, mixer, painter, rotater, splitter, stacker, trash, underground_belt; + +@each $building in $buildings { + [data-icon="building_tutorials/#{$building}.png"] { + background-image: uiResource("res/ui/building_tutorials/#{$building}.png") !important; + } +} + +$upgrades: belt, miner, painting, processors; +@each $upgrade in $upgrades { + [data-icon="upgrades/#{$upgrade}.png"] { + background-image: uiResource("res/ui/upgrades/#{$upgrade}.png") !important; + } +} diff --git a/src/css/ingame_hud/beta_overlay.scss b/src/css/ingame_hud/beta_overlay.scss new file mode 100644 index 00000000..816cddb2 --- /dev/null +++ b/src/css/ingame_hud/beta_overlay.scss @@ -0,0 +1,8 @@ +#ingame_HUD_BetaOverlay { + position: fixed; + @include S(top, 10px); + @include S(right, 15px); + color: $colorRedBright; + @include Heading; + text-transform: uppercase; +} diff --git a/src/css/ingame_hud/blur_overlay.scss b/src/css/ingame_hud/blur_overlay.scss new file mode 100644 index 00000000..d821b6b8 --- /dev/null +++ b/src/css/ingame_hud/blur_overlay.scss @@ -0,0 +1,8 @@ +body.ingameDialogOpen { + #ingame_Canvas, + #ingame_HUD_GameMenu, + #ingame_HUD_KeybindingOverlay, + #ingame_HUD_buildings_toolbar { + filter: blur(5px); + } +} diff --git a/src/css/ingame_hud/building_placer.scss b/src/css/ingame_hud/building_placer.scss new file mode 100644 index 00000000..f90f155f --- /dev/null +++ b/src/css/ingame_hud/building_placer.scss @@ -0,0 +1,35 @@ +#ingame_HUD_building_placer { + position: fixed; + @include S(bottom, 60px); + left: 50%; + transform: translateX(-50%); + + display: flex; + flex-direction: column; + + @include S(padding, 6px); + justify-content: center; + align-items: center; + background-color: $ingameHudBg; + @include S(border-radius, 4px); + background: #333; + @include S(width, 300px); + + .buildingLabel { + @include PlainText; + color: #fff; + text-transform: uppercase; + @include S(margin-bottom, 2px); + } + + .instructions, + .description { + text-align: center; + color: mix($accentColorDark, $accentColorBright, 50%); + @include SuperSmallText; + } + + @include StyleBelowWidth(700px) { + display: none !important; + } +} diff --git a/src/css/ingame_hud/buildings_toolbar.scss b/src/css/ingame_hud/buildings_toolbar.scss new file mode 100644 index 00000000..779333ba --- /dev/null +++ b/src/css/ingame_hud/buildings_toolbar.scss @@ -0,0 +1,181 @@ +#ingame_HUD_buildings_toolbar { + position: fixed; + @include S(bottom, 0px); + left: 50%; + transform: translateX(-50%); + + $toolbarBg: rgba($accentColorBright, 0.9); + display: flex; + flex-direction: column; + background-color: $toolbarBg; + // border: $ingameHudBorder; + border-bottom-width: 0; + + @include S(border-radius, 4px, 4px, 0, 0); + // box-shadow: 0 0 0 #{D(2px)} rgba(darken($toolbarBg, 20), 0.5); + transition: transform 0.12s ease-in-out; + + &:not(.visible) { + transform: translateX(-50%) translateY(#{D(100px)}); + } + + .buildings { + display: grid; + grid-auto-flow: column; + @include S(padding, 0, 5px); + + .building { + color: $accentColorDark; + display: flex; + flex-direction: column; + position: relative; + align-items: center; + justify-content: center; + @include S(padding, 5px); + @include S(padding-bottom, 7px); + $buildingIconSize: 32px; + + &:not(.unlocked) { + @include S(width, 30px); + .tooltip { + display: none !important; + } + .keybinding, + .iconWrap { + opacity: 0.01; + } + &::before { + opacity: 0.5; + content: " "; + background: uiResource("locked_building.png") center center / #{D(20px)} #{D(20px)} + no-repeat; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 4; + } + } + + // &:first-child .tooltip { + // display: flex; + // } + + pointer-events: all; + transition: background-color 0.1s ease-in-out; + &.unlocked:hover { + background: rgba($accentColorDark, 0.1); + cursor: pointer; + } + + .iconWrap { + position: relative; + @include S(width, $buildingIconSize); + @include S(height, $buildingIconSize); + @include S(margin-top, 3px); + @include S(margin-bottom, 6px); + } + + .label { + @include SuperSmallText; + display: none; + font-weight: bold; + text-transform: uppercase; + } + + .keybinding { + // position: relative; + right: 50%; + transform: translateX(50%); + background: transparent; + border: 0; + @include S(bottom, 2pxpx); + } + + &[data-tilewidth="2"] { + .iconWrap { + @include S(width, 2 * $buildingIconSize); + } + } + + &:last-child { + border: none; + } + + .tooltip { + position: absolute; + pointer-events: none; + background: #333; + @include S(padding, 7px); + bottom: calc(100% + #{D(10px)}); + left: 50%; + transform: translateX(-50%); + box-sizing: content-box; + @include SuperSmallText; + @include S(width, 200px); + @include S(border-radius, 4px); + + box-shadow: #{D(1px)} #{D(1px)} 0 0 rgba(0, 10, 25, 0.2); + + display: none; + z-index: 9999; + + flex-direction: column; + + .title { + color: #fff; + @include PlainText; + text-transform: uppercase; + margin-bottom: 5px; + } + + .desc { + color: #aaa; + @include SuperSmallText; + margin-bottom: 10px; + strong { + color: #fff; + } + } + + .tutorialImage { + display: inline-block; + @include S(width, 200px); + @include S(height, 200px); + @include S(border-radius, 4px); + background-size: contain; + background-repeat: no-repeat; + } + + &::after { + top: 100%; + left: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-top-color: #333; + @include S(border-width, 5px); + transform: translateX(-50%); + } + } + + &:hover .tooltip { + display: flex; + + @include InlineAnimation(0.5s ease-in-out) { + 90% { + opacity: 0; + } + 0% { + transform: translate(-50%, 5%) scale(0.9); + opacity: 0; + } + } + } + } + } +} diff --git a/src/css/ingame_hud/dialogs.scss b/src/css/ingame_hud/dialogs.scss new file mode 100644 index 00000000..b7aca1e5 --- /dev/null +++ b/src/css/ingame_hud/dialogs.scss @@ -0,0 +1,63 @@ +.ingameDialog { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: all; + background: $modalDialogBg; + + display: flex; + align-items: center; + justify-content: center; + + &.visible { + .dialogInner { + opacity: 1; + } + } + + .dialogInner { + transition: opacity 0.2s ease-in-out; + opacity: 0; + } + + > .dialogInner { + background: #fff; + @include S(min-width, 500px); + max-width: calc(100vw - #{D(50px)}); + max-height: calc(100vh - #{D(50px)}); + @include S(border-radius, 4px); + display: flex; + flex-direction: column; + @include S(padding, 15px); + pointer-events: all; + + > .title { + @include Heading; + margin: 0; + text-transform: uppercase; + display: grid; + grid-template-columns: 1fr auto; + @include S(margin-bottom, 10px); + + > .closeButton { + opacity: 0.7; + @include S(width, 20px); + @include S(height, 20px); + background: uiResource("icons/close.png") center center / 60% no-repeat; + cursor: pointer; + pointer-events: all; + transition: opacity 0.2s ease-in-out; + &:hover { + opacity: 0.4; + } + } + } + + > .content { + overflow-y: auto; + pointer-events: all; + } + } +} diff --git a/src/css/ingame_hud/game_menu.scss b/src/css/ingame_hud/game_menu.scss new file mode 100644 index 00000000..16ac3129 --- /dev/null +++ b/src/css/ingame_hud/game_menu.scss @@ -0,0 +1,59 @@ +#ingame_HUD_GameMenu { + position: absolute; + top: 0; + left: 50%; + display: grid; + transform: translateX(-50%); + @include S(grid-gap, 3px); + grid-auto-flow: column; + + button { + background: $colorGreenBright; + @include PlainText; + color: #fff; + border-color: rgba(0, 0, 0, 0.1); + @include S(padding, 5px, 5px, 5px); + transition: all 0.12s ease-in-out; + transition-property: opacity, transform; + + &:hover { + opacity: 0.9; + transform: translateY(3px); + } + + @include IncreasedClickArea(10px); + @include ButtonText; + border: #{D(2px)} solid rgba(0, 10, 20, 0.2); + @include S(border-width, 2px); + border-radius: 0 0 #{D(4px)} #{D(4px)}; + @include S(border-top-width, 10px); + @include S(padding-left, 30px); + @include S(margin-top, -5px); + @include S(letter-spacing, 1px, $important: true); + background: center #{D(10px)} / #{D(20px)} no-repeat; + @include S(min-height, 47px); + + &[data-button-id="shop"] { + background-color: rgb(141, 70, 223); + background-image: uiResource("icons/shop.png"); + } + &[data-button-id="stats"] { + background-color: rgb(53, 235, 113); + background-image: uiResource("icons/statistics.png"); + } + + .keybinding { + border: 0; + color: #fff; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: unset; + // background: rgba(0, 10, 20, 0.5); + background: transparent; + @include S(top, -5px); + right: unset; + left: 50%; + transform: translateX(-50%); + } + } +} diff --git a/src/css/ingame_hud/keybindings_overlay.scss b/src/css/ingame_hud/keybindings_overlay.scss new file mode 100644 index 00000000..db05aacf --- /dev/null +++ b/src/css/ingame_hud/keybindings_overlay.scss @@ -0,0 +1,78 @@ +#ingame_HUD_KeybindingOverlay { + position: absolute; + @include S(top, 10px); + @include S(left, 10px); + + display: flex; + flex-direction: column; + align-items: flex-start; + + > .binding { + display: inline-grid; + @include PlainText; + align-items: center; + @include S(margin-bottom, 3px); + grid-auto-flow: column; + @include S(grid-gap, 2px); + + i { + display: inline-block; + @include S(height, 10px); + width: 1px; + @include S(margin, 0, 3px); + background-color: #ccc; + transform: rotate(10deg); + // @include S(margin, 0, 3px); + } + + code { + position: relative; + top: unset; + left: unset; + margin: 0; + &.rightMouse { + background: #fff uiResource("icons/mouse_right.png") center center / 85% no-repeat; + } + + &.leftMouse { + background: #fff uiResource("icons/mouse_left.png") center center / 85% no-repeat; + } + } + label { + color: $accentColorDark; + @include SuperSmallText; + text-transform: uppercase; + @include S(margin-left, 5px); + } + } + + &:not(.placementActive) .binding.placementOnly { + display: none; + } + &.placementActive .binding.noPlacementOnly { + display: none; + } + + .binding.placementOnly, + &:not(.placementActive) .binding.noPlacementOnly { + transform-origin: 0% 50%; + @include InlineAnimation(0.3s ease-in-out) { + 0% { + color: $colorRedBright; + transform: scale(1.2); + } + } + } + + .shift .keybinding { + transition: all 0.1s ease-in-out; + transition-property: background-color, color, border-color; + background: $colorRedBright; + border-color: $colorRedBright; + color: #fff; + } + + &.shiftDown .shift .keybinding { + border-color: darken($colorRedBright, 40); + } +} diff --git a/src/css/ingame_hud/shop.scss b/src/css/ingame_hud/shop.scss new file mode 100644 index 00000000..c6ad0711 --- /dev/null +++ b/src/css/ingame_hud/shop.scss @@ -0,0 +1,180 @@ +#ingame_HUD_Shop { + .content { + @include S(padding-right, 10px); + display: flex; + flex-direction: column; + .upgrade { + display: grid; + grid-template-columns: auto 1fr auto; + background: #eee; + @include S(border-radius, 3px); + @include S(margin-bottom, 4px); + @include S(padding, 5px, 10px); + @include S(grid-row-gap, 5px); + @include S(height, 95px); + grid-template-rows: #{D(20px)} auto; + + &:last-child { + margin-bottom: 0; + } + + .title { + grid-column: 2 / 3; + grid-row: 1 / 2; + @include Heading; + display: flex; + align-items: center; + + .tier { + @include S(margin-left, 5px); + background: $colorGreenBright; + @include S(border-radius, 4px); + text-transform: uppercase; + @include PlainText; + color: #fff; + font-weight: bold; + @include S(margin-top, 1px); + + @include S(padding, 0px, 5px); + + &[data-tier="0"] { + background-color: rgb(73, 186, 190); + } + &[data-tier="1"] { + background-color: rgb(73, 94, 190); + } + &[data-tier="2"] { + background-color: rgb(186, 73, 190); + } + &[data-tier="3"] { + background-color: rgb(96, 190, 73); + } + &[data-tier="4"] { + background-color: rgb(190, 91, 73); + } + &[data-tier="5"] { + background-color: rgb(219, 184, 29); + } + &[data-tier="6"] { + background-color: rgb(190, 73, 73); + } + } + } + + .icon { + @include S(width, 40px); + @include S(height, 40px); + background: center center / contain no-repeat; + align-self: center; + justify-self: center; + grid-column: 1 / 2; + grid-row: 1 / 4; + @include S(margin-right, 20px); + opacity: 0.2; + } + + .description { + grid-column: 3 / 4; + grid-row: 1 / 2; + @include PlainText; + color: #aaa; + align-self: start; + justify-self: end; + } + + .requirements { + grid-column: 2 / 3; + grid-row: 3 / 4; + display: grid; + grid-auto-flow: column; + @include S(grid-gap, 15px); + justify-content: start; + + .requirement { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + + canvas { + @include S(width, 40px); + @include S(height, 40px); + } + + .amount { + @include S(margin-top, 4px); + z-index: 10; + @include SuperSmallText; + letter-spacing: 0; + background: #e2e4e6; + + @include S(line-height, 13px); + @include S(border-radius, 2px); + @include S(padding, 0, 2px, 3px); + position: relative; + text-align: center; + @include S(min-width, 50px); + overflow: hidden; + + .progressBar { + bottom: 0; + left: 0; + right: 0; + top: 0; + @include S(border-radius, 2px); + position: absolute; + display: inline-block; + z-index: -1; + transition: all 0.2s ease-in-out; + transition-property: width, background-color; + background: #bdbfca; + + &.complete { + background-color: $colorGreenBright; + } + } + } + } + } + + button.buy { + grid-column: 3 / 4; + grid-row: 3 / 4; + align-self: end; + justify-self: end; + // @include S(padding, 4px, 5px); + // @include PlainText; + background-color: $colorGreenBright; + color: #fff; + + transition: all 0.2s ease-in-out; + transition-property: background-color, opacity; + + &:not(.buyable) { + background-color: #aaa; + cursor: default; + pointer-events: none; + opacity: 0.3; + } + } + + &.maxLevel { + button.buy { + opacity: 0 !important; + } + .requirements { + display: none; + } + .description { + // grid-column: 2 / 4; + // grid-row: 2 / 3; + align-self: end; + justify-self: center; + color: $colorGreenBright; + text-transform: uppercase; + @include S(margin-top, 20px); + } + } + } + } +} diff --git a/src/css/ingame_hud/unlock_notification.scss b/src/css/ingame_hud/unlock_notification.scss new file mode 100644 index 00000000..f81232d0 --- /dev/null +++ b/src/css/ingame_hud/unlock_notification.scss @@ -0,0 +1,134 @@ +#ingame_HUD_UnlockNotification { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(#333538, 0.95) uiResource("dialog_bg_pattern.png") top left / #{D(10px)} repeat; + display: flex; + justify-content: center; + align-items: flex-start; + pointer-events: all; + @include InlineAnimation(0.1s ease-in-out) { + 0% { + opacity: 0; + } + } + + .dialog { + background: rgba(#333539, 0.5); + @include S(padding, 30px); + + @include InlineAnimation(0.5s ease-in-out) { + 0% { + opacity: 0; + } + } + + color: #fff; + text-align: center; + .title, + .subTitle { + @include SuperHeading; + text-transform: uppercase; + @include S(font-size, 50px); + + @include InlineAnimation(0.5s ease-in-out) { + 0% { + transform: translateY(-50vh); + } + 50% { + transform: translateY(5vh); + } + 75% { + transform: translateY(-2vh); + } + } + } + + .subTitle { + @include Heading; + background: $colorGreenBright; + display: inline-block; + @include S(padding, 1px, 6px); + @include S(margin, 20px, 0, 20px); + + @include S(border-radius, 4px); + @include InlineAnimation(0.5s ease-in-out) { + 0% { + transform: translateY(-60vh); + } + 50% { + transform: translateY(6vh); + } + 75% { + transform: translateY(-3vh); + } + } + } + + .contents { + @include S(width, 400px); + @include InlineAnimation(0.5s ease-in-out) { + 0% { + transform: translateX(-100vw); + } + 50% { + transform: translateX(5vw); + } + + 75% { + transform: translateX(-2vw); + } + } + display: grid; + grid-template-columns: auto auto; + align-items: center; + justify-content: center; + @include S(grid-gap, 10px); + + .reward { + grid-column: 1 / 3; + @include InlineAnimation(0.5s ease-in-out) { + 0% { + transform: translateX(200vw); + } + 50% { + transform: translateX(-10vw); + } + + 75% { + transform: translateX(4vw); + } + } + } + + .buildingExplanation { + @include S(width, 200px); + @include S(height, 200px); + display: inline-block; + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + @include S(border-radius, 4px); + box-shadow: #{D(2px)} #{D(3px)} 0 0 rgba(0, 0, 0, 0.15); + } + } + + button.close { + border: 0; + @include InlineAnimation(0.5s ease-in-out) { + 0% { + transform: translateY(50vh); + } + 50% { + transform: translateY(-5vh); + } + 75% { + transform: translateY(2vh); + } + } + @include S(margin-top, 30px); + } + } +} diff --git a/src/css/main.scss b/src/css/main.scss new file mode 100644 index 00000000..6d99f6a5 --- /dev/null +++ b/src/css/main.scss @@ -0,0 +1,50 @@ +// Control here whether to inline all resources or instead load them +@function uiResource($pth) { + @if (str-index($string: $pth, $substring: ".noinline")) { + @return resolve($pth); + } + @return inline($pth); +} + +@import "icons"; +@import "trigonometry"; +@import "material_colors"; +@import "dynamic_ui"; +@import "variables"; + +@import "mixins"; +@import "common"; +@import "animations"; +@import "game_state"; +@import "application_error"; +@import "textual_game_state"; +@import "adinplay"; + +@import "states/preload"; +@import "states/main_menu"; +@import "states/ingame"; + +@import "ingame_hud/buildings_toolbar"; +@import "ingame_hud/building_placer"; +@import "ingame_hud/beta_overlay"; +@import "ingame_hud/keybindings_overlay"; +@import "ingame_hud/unlock_notification"; +@import "ingame_hud/shop"; +@import "ingame_hud/game_menu"; +@import "ingame_hud/blur_overlay"; +@import "ingame_hud/dialogs"; + +// Z-Index +$elements: ingame_Canvas, ingame_HUD_building_placer_overlay, ingame_HUD_building_placer, + ingame_HUD_buildings_toolbar, ingame_HUD_GameMenu, ingame_HUD_KeybindingOverlay, ingame_HUD_Shop, + ingame_HUD_BetaOverlay, ingame_HUD_UnlockNotification; + +$zindex: 100; + +@each $elem in $elements { + ##{$elem} { + z-index: $zindex; + } + + $zindex: $zindex + 10; +} diff --git a/src/css/material_colors.scss b/src/css/material_colors.scss new file mode 100644 index 00000000..dd4bdd1d --- /dev/null +++ b/src/css/material_colors.scss @@ -0,0 +1,319 @@ +// +// color palette + +// sass-lint:disable hex-length + +@function color($color, $value: 500) { + @return map-get($color, $value); +} + +$red: ( + 50: #ffebee, + 100: #ffcdd2, + 200: #ef9a9a, + 300: #e57373, + 400: #ef5350, + 500: #f44336, + 600: #e53935, + 700: #d32f2f, + 800: #c62828, + 900: #b71c1c, + a100: #ff8a80, + a200: #ff5252, + a400: #ff1744, + a700: #d50000, +); + +$pink: ( + 50: #fce4ec, + 100: #f8bbd0, + 200: #f48fb1, + 300: #f06292, + 400: #ec407a, + 500: #e91e63, + 600: #d81b60, + 700: #c2185b, + 800: #ad1457, + 900: #880e4f, + a100: #ff80ab, + a200: #ff4081, + a400: #f50057, + a700: hsl(333, 84%, 42%), +); + +$purple: ( + 50: #f3e5f5, + 100: #e1bee7, + 200: #ce93d8, + 300: #ba68c8, + 400: #ab47bc, + 500: #9c27b0, + 600: #8e24aa, + 700: #7b1fa2, + 800: #6a1b9a, + 900: #4a148c, + a100: #ea80fc, + a200: #e040fb, + a400: #d500f9, + a700: #aa00ff, +); + +$deep-purple: ( + 50: #ede7f6, + 100: #d1c4e9, + 200: #b39ddb, + 300: #9575cd, + 400: #7e57c2, + 500: #673ab7, + 600: #5e35b1, + 700: #512da8, + 800: #4527a0, + 900: #311b92, + a100: #b388ff, + a200: #7c4dff, + a400: #651fff, + a700: #6200ea, +); + +$indigo: ( + 50: #e8eaf6, + 100: #c5cae9, + 200: #9fa8da, + 300: #7986cb, + 400: #5c6bc0, + 500: #3f51b5, + 600: #3949ab, + 700: #303f9f, + 800: #283593, + 900: #1a237e, + a100: #8c9eff, + a200: #536dfe, + a400: #3d5afe, + a700: #304ffe, +); + +$blue: ( + 50: #e3f2fd, + 100: #bbdefb, + 200: #90caf9, + 300: #64b5f6, + 400: #42a5f5, + 500: #2196f3, + 600: #1e88e5, + 700: #1976d2, + 800: #1565c0, + 900: #0d47a1, + a100: #82b1ff, + a200: #448aff, + a400: #2979ff, + a700: #2962ff, +); + +$light-blue: ( + 50: #e1f5fe, + 100: #b3e5fc, + 200: #81d4fa, + 300: #4fc3f7, + 400: #29b6f6, + 500: #03a9f4, + 600: #039be5, + 700: #0288d1, + 800: #0277bd, + 900: #01579b, + a100: #80d8ff, + a200: #40c4ff, + a400: #00b0ff, + a700: #0091ea, +); + +$cyan: ( + 50: #e0f7fa, + 100: #b2ebf2, + 200: #80deea, + 300: #4dd0e1, + 400: #26c6da, + 500: #00bcd4, + 600: #00acc1, + 700: #0097a7, + 800: #00838f, + 900: #006064, + a100: #84ffff, + a200: #18ffff, + a400: #00e5ff, + a700: #00b8d4, +); + +$teal: ( + 50: #e0f2f1, + 100: #b2dfdb, + 200: #80cbc4, + 300: #4db6ac, + 400: #26a69a, + 500: #009688, + 600: #00897b, + 700: #00796b, + 800: #00695c, + 900: #004d40, + a100: #a7ffeb, + a200: #64ffda, + a400: #1de9b6, + a700: #00bfa5, +); + +$green: ( + 50: #e8f5e9, + 100: #c8e6c9, + 200: #a5d6a7, + 300: #81c784, + 400: #66bb6a, + 500: #4caf50, + 600: #43a047, + 700: #388e3c, + 800: #2e7d32, + 900: #1b5e20, + a100: #b9f6ca, + a200: #69f0ae, + a400: #00e676, + a700: #00c853, +); + +$light-green: ( + 50: #f1f8e9, + 100: #dcedc8, + 200: #c5e1a5, + 300: #aed581, + 400: #9ccc65, + 500: #8bc34a, + 600: #7cb342, + 700: #689f38, + 800: #558b2f, + 900: #33691e, + a100: #ccff90, + a200: #b2ff59, + a400: #76ff03, + a700: #64dd17, +); + +$lime: ( + 50: #f9fbe7, + 100: #f0f4c3, + 200: #e6ee9c, + 300: #dce775, + 400: #d4e157, + 500: #cddc39, + 600: #c0ca33, + 700: #afb42b, + 800: #9e9d24, + 900: #827717, + a100: #f4ff81, + a200: #eeff41, + a400: #c6ff00, + a700: #aeea00, +); + +$yellow: ( + 50: #fffde7, + 100: #fff9c4, + 200: #fff59d, + 300: #fff176, + 400: #ffee58, + 500: #ffeb3b, + 600: #fdd835, + 700: #fbc02d, + 800: #f9a825, + 900: #f57f17, + a100: #ffff8d, + a200: #ffff00, + a400: #ffea00, + a700: #ffd600, +); + +$amber: ( + 50: #fff8e1, + 100: #ffecb3, + 200: #ffe082, + 300: #ffd54f, + 400: #ffca28, + 500: #ffc107, + 600: #ffb300, + 700: #ffa000, + 800: #ff8f00, + 900: #ff6f00, + a100: #ffe57f, + a200: #ffd740, + a400: #ffc400, + a700: #ffab00, +); + +$orange: ( + 50: #fff3e0, + 100: #ffe0b2, + 200: #ffcc80, + 300: #ffb74d, + 400: #ffa726, + 500: #ff9800, + 600: #fb8c00, + 700: #f57c00, + 800: #ef6c00, + 900: #e65100, + a100: #ffd180, + a200: #ffab40, + a400: #ff9100, + a700: #ff6d00, +); + +$deep-orange: ( + 50: #fbe9e7, + 100: #ffccbc, + 200: #ffab91, + 300: #ff8a65, + 400: #ff7043, + 500: #ff5722, + 600: #f4511e, + 700: #e64a19, + 800: #d84315, + 900: #bf360c, + a100: #ff9e80, + a200: #ff6e40, + a400: #ff3d00, + a700: #dd2c00, +); + +$brown: ( + 50: #efebe9, + 100: #d7ccc8, + 200: #bcaaa4, + 300: #a1887f, + 400: #8d6e63, + 500: #795548, + 600: #6d4c41, + 700: #5d4037, + 800: #4e342e, + 900: #3e2723, +); + +$grey: ( + 50: #fafafa, + 100: #f5f5f5, + 200: #eeeeee, + 300: #e0e0e0, + 400: #bdbdbd, + 500: #9e9e9e, + 600: #757575, + 700: #616161, + 800: #424242, + 900: #212121, +); + +$blue-grey: ( + 50: #eceff1, + 100: #cfd8dc, + 200: #b0bec5, + 300: #90a4ae, + 400: #78909c, + 500: #607d8b, + 600: #546e7a, + 700: #455a64, + 800: #37474f, + 900: #263238, +); diff --git a/src/css/mixins.scss b/src/css/mixins.scss new file mode 100644 index 00000000..9881ffea --- /dev/null +++ b/src/css/mixins.scss @@ -0,0 +1,379 @@ +// ---------------------------------------- +/* Forces an element to get rendered on its own layer, increasing +the performance when animated. Use only transform and opacity in animations! */ +@mixin FastAnimation { + // will-change: transform, opacity; + transform: translateZ(0); + backface-visibility: hidden; + -webkit-backface-visibility: hidden; +} + +// Helper which includes the translateZ webkit fix, use together with Fast animation +// $hardwareAcc: translateZ(0); +$hardwareAcc: null; + +// ---------------------------------------- +/** Increased click area for this element, helpful on mobile */ +@mixin IncreasedClickArea($size) { + &::after { + content: ""; + position: absolute; + top: #{D(-$size)}; + bottom: #{D(-$size)}; + left: #{D(-$size)}; + right: #{D(-$size)}; + // background: rgba(255, 0, 0, 0.3); + } +} +button, +.increasedClickArea { + position: relative; + @include IncreasedClickArea(15px); +} + +// ---------------------------------------- +/* Duplicates an animation and adds two classes .Even and .Odd which uses the + animation. This can be used to replay the animation by toggling between the classes, because + it is not possible to restart a css animation */ +@mixin MakeAnimationWrappedEvenOdd($duration, $classPrefix: "anim", $childSelector: "") { + $animName: autogen_anim_#{unique-id()}; + + @at-root { + @keyframes #{$animName}_even { + @content; + } + + @keyframes #{$animName}_odd { + @content; + } + } + + &.#{$classPrefix}Even #{$childSelector} { + animation: #{$animName}_even $duration; + } + + &.#{$classPrefix}Odd #{$childSelector} { + animation: #{$animName}_odd $duration; + } +} + +// ---------------------------------------- +/* Allows to use and define an animation without specifying its name */ +@mixin InlineAnimation($duration) { + $animName: autogen_anim_#{unique-id()}; + + @at-root { + @keyframes #{$animName} { + @content; + } + } + + animation: $animName $duration !important; +} + +// ---------------------------------------- +/* Animation prefab for a double bounce pop-in animation, useful for dialogs */ +@mixin DoubleBounceAnim($duration: 0.5s ease-in-out, $amount: 0.2, $initialOpacity: 0) { + @include InlineAnimation($duration) { + 0% { + opacity: $initialOpacity; + transform: scale(0) $hardwareAcc; + } + + 25% { + opacity: 0.5; + transform: scale(1 + $amount) $hardwareAcc; + } + + 50% { + opacity: 1; + transform: scale(1 - $amount * 0.5) $hardwareAcc; + } + + 75% { + transform: scale(1 + $amount * 0.25) $hardwareAcc; + } + + 100% { + transform: scale(1) $hardwareAcc; + } + } + + opacity: 1; +} + +// ---------------------------------------- +/* Define a style which is only applied in horizontal mode */ +@mixin HorizontalStyle { + @include AppendGlobal(".h") { + @content; + } +} + +// ---------------------------------------- +/* Define a style which is only applied in vertical mode */ +@mixin VerticalStyle { + @include AppendGlobal(".v") { + @content; + } +} + +// ---------------------------------------- +/* Define a style which is only while the hardware keyboard is open */ +@mixin AndroidHwKeyboardOpen { + @include AppendGlobal(".kb") { + @content; + } +} + +// ---------------------------------------- +/* Automatically transforms the game state if a hardware keyboard is open */ +@mixin TransformToMatchKeyboard { + transition: transform 0.2s ease-in-out; + @include AndroidHwKeyboardOpen { + @include VerticalStyle { + transform: translateY(#{D(-125px)}) $hardwareAcc; + } + @include HorizontalStyle { + transform: translateY(#{D(-100px)}) $hardwareAcc; + } + } +} + +// ---------------------------------------- +/* Define a style which is only applied when the viewport is at least X pixels wide */ +@mixin StyleAtWidth($minW) { + @media (min-width: #{$minW}) { + @content; + } +} + +// ---------------------------------------- +/* Define a style which is only applied when the viewport is at least X pixels height */ +@mixin StyleAtHeight($minH) { + @media (min-height: #{$minH}) { + @content; + } +} + +// ---------------------------------------- +/* Define a style which is only applied when the viewport has at least the given dimensions */ +@mixin StyleAtDims($minW, $minH) { + @media (min-height: #{$minH}) and (min-width: #{$minW}) { + @content; + } +} + +// ---------------------------------------- +/* Define a style which is only applied when the viewport has at maximum the given dimensions */ +@mixin StyleBelowDims($maxW, $maxH) { + @media (max-height: #{$maxH}) and (max-width: #{$maxW}) { + @content; + } +} + +// ---------------------------------------- +/* Define a style which is only applied when the viewport has at maximum the given height */ +@mixin StyleBelowHeight($maxH) { + @media (max-height: #{$maxH}) { + @content; + } +} +// ---------------------------------------- +/* Define a style which is only applied when the viewport has at maximum the given width */ +@mixin StyleBelowWidth($maxW) { + @media (max-width: #{$maxW}) { + @content; + } +} + +// ---------------------------------------- +// Dynamic graphics quality styles + +@mixin BoxShadow3D($bgColor, $size: 3px, $pressEffect: true) { + background-color: $bgColor; + + $borderSize: 1.5px; + $borderColor: rgb(18, 20, 24); + + // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1), + // 0 D($size) 0 D($borderSize) $borderColor; + + // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 D($borderSize) $borderColor, + // D(-$size * 1.5) D($size * 2) 0 D($borderSize) rgba(0, 0, 0, 0.1); + + // transition: box-shadow 0.1s ease-in-out; + + // @if $pressEffect { + // &.pressed { + // transform: none !important; + // $pSize: max(0, $size - 1.5px); + // transition: none !important; + // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($pSize) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1), + // 0 D($pSize) 0 D($borderSize) $borderColor; + // top: D($size - $pSize); + // } + // } +} + +@mixin BorderRadius($v1: 2px, $v2: "", $v3: "", $v4: "") { + @include S(border-radius, $v1, $v2, $v3, $v4); +} + +@mixin BoxShadow($x, $y, $blur, $offset, $color) { + box-shadow: D($x) D($y) D($blur) D($offset) $color; +} + +@mixin DropShadow($yOffset: 2px, $blur: 2px, $amount: 0.2) { + @include BoxShadow(0, $yOffset, $blur, 0, rgba(#000, $amount)); +} + +@mixin TextShadow($yOffset: 2px, $blur: 1px, $amount: 0.6) { + text-shadow: 0 D($yOffset) D($blur) rgba(#000, $amount); +} + +@mixin Button3D($bgColor, $pressEffect: true) { + @include BoxShadow3D($bgColor, 2px, $pressEffect); +} + +@mixin ButtonDisabled3D($bgColor) { + @include BoxShadow3D($bgColor, 0.5px, false); +} + +@mixin BoxShadowInset($bgColor, $size: 3px) { + background-color: $bgColor; + + $borderSize: 1px; + $borderColor: rgb(15, 19, 24); + box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 rgba(#fff, 0.07); + border-top: D($size) solid rgba(#000, 0.1); + + //, 0 D($size) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1), + // 0 D($size + $borderSize) 0 0 $borderColor; +} + +@mixin TextShadow3D($color: rgb(222, 234, 238), $borderColor: #000) { + // @if $borderColor != #000 { + // @include TextShadow3DImpl($color: $color, $borderColor: $borderColor); + // } + color: $color; +} + +@mixin TextShadow3DImpl( + $color: rgb(222, 234, 238), + $scale: 1, + $additionalShadowAlpha: 1, + $borderColor: #222428 +) { + // color: $text3dColor; + + $borderColor: rgba(15, 18, 23, 0.9); + + // $shadowColor: darken($color, 40%); + + $border: 0.07em; + $borderMid: $border * 1.14; + + $drop1: $borderMid + 0.02; + $drop2: $borderMid + 0.06em; + + // text-shadow: #{$border} #{$border} 0 $borderColor, #{-$border} #{$border} 0 $borderColor, #{$border} #{-$border} 0 $borderColor, + // #{-$border} #{-$border} 0 $borderColor, 0 #{$borderMid} 0 $borderColor, 0 #{-$borderMid} 0 $borderColor, + // #{$borderMid} 0 0 $borderColor, #{-$borderMid} 0 0 $borderColor, 0 #{$drop1} 0 $borderColor, #{$borderMid} #{$drop1} 0 $borderColor, + // #{-$borderMid} #{$drop1} 0 $borderColor, 0 #{$drop2} 0 $borderColor, #{$borderMid} #{$drop2} 0 $borderColor, + // #{-$borderMid} #{$drop2} 0 $borderColor, -0.2em 0.13em 0 rgba(#111, 0.25); // 0px 0.07em 0px $shadowColor, + // 0px 0.15em 0.09em rgba(#333539, $additionalShadowAlpha);; +} + +// ---------------------------------------- +/* Shine animation prefab, useful for buttons etc. Adds a bright shine which moves over + the button like a reflection. Performance heavy. */ +@mixin ShineAnimation($duration, $bgColor, $w: 200px, $shineAlpha: 0.25, $lightenAmount: 7, $bgAnim: true) { + $bgBase: darken($bgColor, 5); + background-color: $bgBase; + + @include HighQualityOrMore { + position: relative; + // overflow: hidden; + // overflow: visible; + + &:before { + content: " "; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: uiResource("misc/shine_bg.png") 0px center / 100% 100% no-repeat; + + @include InlineAnimation($duration ease-in-out infinite) { + 0% { + background-position-x: #{D(-$w)}; + } + 100% { + background-position-x: #{D($w)}; + } + } + } + + @if ($bgAnim) { + @include InlineAnimation($duration ease-in-out infinite) { + 0% { + background-color: $bgBase; + } + 50% { + background-color: lighten($bgBase, $lightenAmount); + } + 100% { + background-color: $bgBase; + } + } + } + } +} + +// ---------------------------------------- +/* String replacement */ +@function str-replace($string, $search, $replace: "") { + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); + } + + @return $string; +} + +@mixin BounceInFromSide($mul, $duration: 0.18s ease-in-out) { + @include InlineAnimation($duration) { + 0% { + transform: translateY(#{D(-100px * $mul)}) scale(0.9); + opacity: 0; + } + + 100% { + opacity: 1; + transform: none; + } + } + opacity: 1; + transform: none; +} + +@mixin BreakText { + word-wrap: break-word; + word-break: break-all; + overflow-wrap: break-all; +} + +@mixin SupportsAndroidNotchQuery { + @supports (color: constant(--notch-inset-left)) { + @content; + } +} +@mixin SupportsiOsNotchQuery { + @supports (color: env(safe-area-inset-left, 0px)) { + @content; + } +} diff --git a/src/css/states/ingame.scss b/src/css/states/ingame.scss new file mode 100644 index 00000000..04e9383a --- /dev/null +++ b/src/css/states/ingame.scss @@ -0,0 +1,16 @@ +#state_InGameState { + .gameLoadingOverlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 9999; + align-items: center; + justify-content: center; + pointer-events: all; + display: flex; + background: $mainBgColor; + flex-direction: column; + } +} diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss new file mode 100644 index 00000000..4e027a4d --- /dev/null +++ b/src/css/states/main_menu.scss @@ -0,0 +1,27 @@ +#state_MainMenuState { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + background: uiResource("menu_bg.noinline.jpg") center center / cover no-repeat !important; + + .logo { + img { + @include S(width, 350px); + } + } + + .mainContainer { + @include S(margin-top, 40px); + display: flex; + + .playButton { + @include SuperHeading; + @include S(width, 150px); + @include S(padding, 15px, 20px); + color: #fff; + background-color: $accentColorDark; + } + } +} diff --git a/src/css/states/preload.scss b/src/css/states/preload.scss new file mode 100644 index 00000000..25b13ead --- /dev/null +++ b/src/css/states/preload.scss @@ -0,0 +1,100 @@ +#state_PreloadState { + &.failure { + .loadingImage, + .loadingStatus { + display: none; + } + } + + .failureBox { + .logo { + img { + @include S(width, 240px); + } + + @include S(margin-bottom, 30px); + } + + @include InlineAnimation(0.3s ease-in-out) { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + + .failureInner { + // background: darken($mainBgColor, 6); + @include S(max-width, 350px); + margin: 0 20px; + text-align: left; + + @include BoxShadow3D(#fff); + @include S(padding, 15px); + @include BorderRadius(4px); + @include DropShadow; + + .errorHeader { + color: #ef5072; + } + + .errorMessage { + @include PlainText; + display: block; + color: #666; + text-align: left; + @include BreakText; + hyphens: auto; + // border: dotted #666; + // @include S(border-width, 1px, 0); + @include S(padding, 10px, 0); + @include S(margin-top, 10px); + } + + .supportHelp { + @include S(margin-top, 10px); + @include PlainText; + + .email { + color: $themeColor; + cursor: pointer; + pointer-events: all; + } + } + + .lower { + display: flex; + align-items: center; + @include S(margin-top, 16px); + + i { + flex-grow: 1; + text-align: right; + color: #777; + @include PlainText; + } + + button.resetApp { + @include Button3D($colorRedBright); + @include PlainText; + @include S(padding, 5px, 8px, 4px); + } + } + } + } + + /* Animations */ + .status { + transform: scale(0.7) $hardwareAcc; + opacity: 0; + @include StateAnim(transform, opacity); + } + + &.arrived { + .status { + opacity: 1; + transform: none; + } + } +} diff --git a/src/css/textual_game_state.scss b/src/css/textual_game_state.scss new file mode 100644 index 00000000..27cd27ba --- /dev/null +++ b/src/css/textual_game_state.scss @@ -0,0 +1,267 @@ +.gameState.textualState { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + $padding: 15px; + + .bottomPoppingInNotification { + position: absolute; + left: 50%; + text-align: center; + @include BoxShadow3D(mix(lighten($mainBgColor, 12), $colorRedBright, 50%)); + @include S(padding, 10px); + max-width: #{D(280px)}; + @include S(bottom, 30px); + box-sizing: border-box; + width: 100%; + @include PlainText; + @include BorderRadius(4px); + + $baseTransform: translateX(-50%); + transform-origin: 0% 100%; + transform: translateY(500%); + opacity: 0; + + display: block; + @include InlineAnimation(5s ease-in-out) { + 0% { + opacity: 0; + transform: scale(0) skew(5deg, 5deg) translateY(100%) $baseTransform; + } + 8% { + transform: scale(1.05) translateY(-2%) $baseTransform; + } + 12% { + transform: scale(1) $baseTransform; + opacity: 1; + } + 97% { + transform: scale(1) $baseTransform; + opacity: 1; + } + 100% { + opacity: 0; + transform: scale(0) skew(5deg, 5deg) translateY(100%) $baseTransform; + } + } + } + + .widthKeeper { + width: 100%; + height: 100%; + + display: flex; + flex-direction: column; + overflow: hidden; + + box-sizing: content-box; + @include S(max-width, 1000px); + + @include StyleAtHeight(800px) { + @include S(padding-top, 30px); + } + + .headerBar { + display: flex; + + @include VerticalStyle { + // margin-top: 1px; + } + + // margin-bottom: 15px; + padding: $padding; + + $h: 25px; + @include S(min-height, $h); + @include S(max-height, $h); + + align-items: center; + justify-content: center; + position: relative; + z-index: 50; + background: transparent; + + @include S(padding-top, $padding); + @include S(padding-left, $padding); + @include S(padding-right, $padding); + background-size: calc(100% - #{D(6px)}) 100%; + $paddingBottom: 20px; + + @include S(padding-bottom, $paddingBottom); + @include S(margin-bottom, -$h - $padding - $paddingBottom); + + h1 { + // text-align: center; + cursor: pointer; + // transform-origin: 0px 50%; + pointer-events: all; + @include S(padding, 5px, 0px, 5px, 30px); + @include S(left, -2px); + @include S(min-width, 100px); + position: relative; + @include IncreasedClickArea(25px); + text-transform: uppercase; + // background: uiResource("back_arrow.png") center center no-repeat; + @include S(background-position-x, -3px); + @include S(background-size, 25px, 25px); + + // Due to back button + color: $text3dColor; + @include TextShadow3D($borderColor: #18151d); + @include SuperHeading; + @include StyleBelowWidth(380px) { + @include Heading; + } + } + + .grow { + flex-grow: 1; + } + } + + .container { + text-align: left; + flex-direction: column; + pointer-events: all; + box-sizing: border-box; + z-index: 25; + position: relative; + + @include S(padding-left, 0px); + @include S(padding-right, 0px); + + height: 100%; + @include SupportsAndroidNotchQuery { + height: calc( + 100% - constant(safe-area-inset-top) - constant(safe-area-inset-bottom) - + var(--notch-inset-top) - var(--notch-inset-bottom) + ); + } + @include SupportsiOsNotchQuery { + height: calc( + 100% - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px) - + var(--notch-inset-top) - var(--notch-inset-bottom) + ); + } + + .loadingIndicator { + display: none; + } + + .errorIndicator { + display: none; + flex-direction: column; + text-align: center; + + .errorInner { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + @include S(max-width, 350px); + + strong { + $col: #ff4564; + @include TextShadow3D($col); + @include Heading; + } + + i { + @include PlainText; + color: #888; + @include S(margin-top, 10px); + display: inline-block; + } + } + } + + .loadingIndicator, + .errorIndicator { + box-sizing: border-box; + justify-content: center; + align-items: center; + height: 100%; + @include S(padding, 30px); + } + + // Loading state + &.loading { + .mainContent { + animation: none; + display: none !important; + } + .loadingIndicator { + display: flex; + } + } + + // Error state + &.errored { + .mainContent { + animation: none; + display: none !important; + } + + .errorIndicator { + animation: none; + display: flex; + } + } + } + + .mainContent { + overflow-y: auto !important; + overflow-x: hidden; + @include S(padding, $padding); + height: 100%; + width: 100%; + box-sizing: border-box; + + @include InlineAnimation(0.4s ease-in-out) { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + + .category_label { + display: block; + @include S(margin-top, 40px); + + text-transform: uppercase; + &:first-child { + margin-top: 0 !important; + } + + @include S(margin-bottom, 16px); + @include Heading; + + @include TextShadow3D(#68a1bb, $borderColor: #141718); + } + + .cardbox { + @include S(padding, 20px, 15px); + $cardBg: lighten($mainBgColor, 9); + background: $cardBg; + margin-bottom: 15px; + @include S(margin-bottom, 15px); + @include BorderRadius(4px); + @include S(padding-bottom, 14px); + @include BoxShadow3D($cardBg); + + &:last-child { + border-bottom: 0; + } + } + } + } + + &.hasTitle { + .mainContent { + @include S(padding-top, 70px, $important: true); + } + } +} diff --git a/src/css/trigonometry.scss b/src/css/trigonometry.scss new file mode 100644 index 00000000..97d2e730 --- /dev/null +++ b/src/css/trigonometry.scss @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////// +// Plain SASS Trigonometry Algorithm in Taylor Expansion // +// // +// Based on // +// http://japborst.net/posts/sass-sines-and-cosines // +/////////////////////////////////////////////////////////// + +$pi: 3.14159265359; +$_precision: 10; + +@function pow($base, $exp) { + $value: $base; + @if $exp > 1 { + @for $i from 2 through $exp { + $value: $value * $base; + } + } + @if $exp < 1 { + @for $i from 0 through -$exp { + $value: $value / $base; + } + } + @return $value; +} + +@function fact($num) { + $fact: 1; + @if $num > 0 { + @for $i from 1 through $num { + $fact: $fact * $i; + } + } + @return $fact; +} + +@function _to_unitless_rad($angle) { + @if unit($angle) == "deg" { + $angle: $angle / 180deg * $pi; + } + @if unit($angle) == "rad" { + $angle: $angle / 1rad; + } + @return $angle; +} + +@function sin($angle) { + $a: _to_unitless_rad($angle); + $sin: $a; + @for $n from 1 through $_precision { + $sin: $sin + (pow(-1, $n) / fact(2 * $n + 1)) * pow($a, (2 * $n + 1)); + } + @return $sin; +} + +@function cos($angle) { + $a: _to_unitless_rad($angle); + $cos: 1; + @for $n from 1 through $_precision { + $cos: $cos + (pow(-1, $n) / fact(2 * $n)) * pow($a, 2 * $n); + } + @return $cos; +} + +@function tan($angle) { + @return sin($angle) / cos($angle); +} diff --git a/src/css/variables.scss b/src/css/variables.scss new file mode 100644 index 00000000..392393d6 --- /dev/null +++ b/src/css/variables.scss @@ -0,0 +1,195 @@ +// When to reduce control elements size for small devices +$layoutExpandMinWidth: 340px; + +// Font sizes and line heights +$superHeadingFontSize: 25px; +$superHeadingLineHeight: 24px; + +$breakTooltipShowStatsPx: 1023px; + +$headingFontSize: 19px; +$headingLineHeight: 21px; + +$textFontSize: 16px; +$textLineHeight: 21px; + +$plainTextFontSize: 13px; +$plainTextLineHeight: 17px; + +$supersmallTextFontSize: 10px; +$supersmallTextLineHeight: 13px; + +$buttonFontSize: 14px; +$buttonLineHeight: 18px; + +// Main background color +$mainBgColor: #dee1ea; + +// Accent colors + +$accentColorBright: #e1e4ed; +$accentColorDark: #7d808a; +$colorGreenBright: #66bb6a; +$colorRedBright: #ef5072; +$themeColor: #393747; +$ingameHudBg: rgba($accentColorBright, 0.9); +$ingameHudBorder: #{D(1.5px)} solid $accentColorDark; + +$text3dColor: #f4ffff; + +// Dialog properties +$modalDialogBg: rgba(#666a73, 0.8); +$dialogBgColor: lighten($mainBgColor, 10); + +$lightFontWeight: normal; +$boldFontWeight: 600; + +$iconSizeSmall: 30px; +$iconSizeMedium: 40px; +$iconSizeLarge: 60px; + +// Poppins 500 +// Rubik 400 +// Cairo 400 +// Viga 400 +// Sniglet 400 + +$mainFont: "GameFont", sans-serif; +// $mainFont: "DK Canoodle"; +// $mainFont: "MADE Florence Sans"; +$numberFont: $mainFont; +$textFont: $mainFont; + +$mainFontWeight: 400; +$mainFontSpacing: 0.04em; +$mainFontScale: 1; + +@mixin DebugText($color) { + // font-size: 3px; + // &, + // * { + // color: $color !important; + // } +} + +@mixin SuperSmallText { + @include ScaleFont($supersmallTextFontSize, $supersmallTextLineHeight); + font-weight: $mainFontWeight; + font-family: $mainFont; + letter-spacing: $mainFontSpacing; + @include DebugText(green); +} + +@mixin PlainText { + @include ScaleFont($plainTextFontSize, $plainTextLineHeight); + font-weight: $mainFontWeight; + font-family: $mainFont; + letter-spacing: $mainFontSpacing; + + @include DebugText(red); +} + +@mixin Text { + @include ScaleFont($textFontSize, $textLineHeight); + font-weight: $mainFontWeight; + font-family: $mainFont; + + letter-spacing: $mainFontSpacing; + + @include DebugText(blue); +} + +@mixin Heading { + @include ScaleFont($headingFontSize, $headingLineHeight); + font-weight: $mainFontWeight; + font-family: $mainFont; + letter-spacing: $mainFontSpacing; + + @include DebugText(yellow); +} + +@mixin SuperHeading { + @include ScaleFont($superHeadingFontSize, $superHeadingLineHeight); + font-weight: $mainFontWeight; + font-family: $mainFont; + letter-spacing: $mainFontSpacing; + + @include DebugText(orange); +} + +@mixin ButtonText { + @include ScaleFont($buttonFontSize, $buttonLineHeight); + font-weight: $mainFontWeight; + font-family: $mainFont; + letter-spacing: $mainFontSpacing; + @include DebugText(purple); +} + +@function str-split($string, $separator) { + // empty array/list + $split-arr: (); + // first index of separator in string + $index: str-index($string, $separator); + // loop through string + @while $index != null { + // get the substring from the first character to the separator + $item: str-slice($string, 1, $index - 1); + // push item to array + $split-arr: append($split-arr, $item); + // remove item and separator from string + $string: str-slice($string, $index + 1); + // find new index of separator + $index: str-index($string, $separator); + } + // add the remaining string to list (the last item) + $split-arr: append($split-arr, $string); + + @return $split-arr; +} + +@function _first-index($string, $direction: "left") { + @for $i from 1 through str-length($string) { + $index: if($direction == "left", $i, -$i); + + @if str-slice($string, $index, $index) != " " { + @return $index; + } + } + + @return 0; +} + +@function trim($string) { + @return str-slice($string, _first-index($string, "left"), _first-index($string, "right")); +} + +@mixin AppendGlobal($prefix) { + $strSelector: quote(&); + $selectors: str-split($strSelector, ","); + + $builtSelector: null; + + @if (& == null) { + $builtSelector: "html" + $prefix; + } @else { + $builtSelector: (); + // @debug ($strSelector, "->>>", $selectors); + @each $srcSelector in $selectors { + $srcSelector: trim($srcSelector); + // @debug ("___", $srcSelector); + $selector: "html" + $prefix + " " + $srcSelector; + @if str-index($srcSelector, "html.") { + $selector: "html" + + $prefix + + "." + + str-slice($srcSelector, str-index($srcSelector, "html.") + 5); + } + // @debug ("_______", $selector); + $builtSelector: append($builtSelector, $selector, comma); + } + } + + @at-root #{$builtSelector} { + @content; + } +} diff --git a/src/html/index.html b/src/html/index.html new file mode 100644 index 00000000..1d4553c0 --- /dev/null +++ b/src/html/index.html @@ -0,0 +1,43 @@ + + + + shapez.io + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/js/application.js b/src/js/application.js new file mode 100644 index 00000000..75d47ab0 --- /dev/null +++ b/src/js/application.js @@ -0,0 +1,362 @@ +import { AnimationFrame } from "./core/animation_frame"; +import { performanceNow } from "./core/builtins"; +import { GameState } from "./core/game_state"; +import { GLOBAL_APP, setGlobalApp } from "./core/globals"; +import { InputDistributor } from "./core/input_distributor"; +import { StateManager } from "./core/state_manager"; +import { getPlatformName, waitNextFrame } from "./core/utils"; +import { SavegameManager } from "./savegame/savegame_manager"; +import { AdProviderInterface } from "./platform/ad_provider"; +import { NoAdProvider } from "./platform/ad_providers/no_ad_provider"; +import { SoundImplBrowser } from "./platform/browser/sound"; +import { StorageImplBrowser } from "./platform/browser/storage"; +import { PlatformWrapperImplBrowser } from "./platform/browser/wrapper"; +import { SoundInterface } from "./platform/sound"; +import { StorageInterface } from "./platform/storage"; +import { PlatformWrapperInterface } from "./platform/wrapper"; +import { ApplicationSettings } from "./profile/application_settings"; +import { Vector } from "./core/vector"; +import { createLogger, logSection } from "./core/logging"; +import { TrackedState } from "./core/tracked_state"; +import { IS_MOBILE } from "./core/config"; +import { BackgroundResourcesLoader } from "./core/background_resources_loader"; +import { PreloadState } from "./states/preload"; +import { MainMenuState } from "./states/main_menu"; +import { InGameState } from "./states/ingame"; +import { AnalyticsInterface } from "./platform/analytics"; +import { GoogleAnalyticsImpl } from "./platform/browser/google_analytics"; +import { Loader } from "./core/loader"; +import { GameAnalyticsInterface } from "./platform/game_analytics"; +import { GameAnalyticsDotCom } from "./platform/browser/game_analytics"; + +const logger = createLogger("application"); + +// Set the name of the hidden property and the change event for visibility +let pageHiddenPropName, pageVisibilityEventName; +if (typeof document.hidden !== "undefined") { + // Opera 12.10 and Firefox 18 and later support + pageHiddenPropName = "hidden"; + pageVisibilityEventName = "visibilitychange"; + // @ts-ignore +} else if (typeof document.msHidden !== "undefined") { + pageHiddenPropName = "msHidden"; + pageVisibilityEventName = "msvisibilitychange"; + // @ts-ignore +} else if (typeof document.webkitHidden !== "undefined") { + pageHiddenPropName = "webkitHidden"; + pageVisibilityEventName = "webkitvisibilitychange"; +} + +export class Application { + constructor() { + assert(!GLOBAL_APP, "Tried to construct application twice"); + logger.log("Creating application, platform =", getPlatformName()); + setGlobalApp(this); + + this.unloaded = false; + + // Global stuff + this.settings = new ApplicationSettings(this); + this.ticker = new AnimationFrame(); + this.stateMgr = new StateManager(this); + this.savegameMgr = new SavegameManager(this); + this.inputMgr = new InputDistributor(this); + this.backgroundResourceLoader = new BackgroundResourcesLoader(this); + + // Platform dependent stuff + + /** @type {StorageInterface} */ + this.storage = null; + + /** @type {SoundInterface} */ + this.sound = null; + + /** @type {PlatformWrapperInterface} */ + this.platformWrapper = null; + + /** @type {AdProviderInterface} */ + this.adProvider = null; + + /** @type {AnalyticsInterface} */ + this.analytics = null; + + /** @type {GameAnalyticsInterface} */ + this.gameAnalytics = null; + + this.initPlatformDependentInstances(); + + // Track if the window is focused (only relevant for browser) + this.focused = true; + + // Track if the window is visible + this.pageVisible = true; + + // Track if the app is paused (cordova) + this.applicationPaused = false; + + /** @type {TypedTrackedState} */ + this.trackedIsRenderable = new TrackedState(this.onAppRenderableStateChanged, this); + + // Dimensions + this.screenWidth = 0; + this.screenHeight = 0; + + // Store the timestamp where we last checked for a screen resize, since orientationchange is unreliable with cordova + this.lastResizeCheck = null; + + // Store the mouse position, or null if not available + /** @type {Vector|null} */ + this.mousePosition = null; + } + + /** + * Initializes all platform instances + */ + initPlatformDependentInstances() { + logger.log("Creating platform dependent instances"); + + // Start with empty ad provider + this.adProvider = new NoAdProvider(this); + this.storage = new StorageImplBrowser(this); + this.sound = new SoundImplBrowser(this); + this.platformWrapper = new PlatformWrapperImplBrowser(this); + this.analytics = new GoogleAnalyticsImpl(this); + this.gameAnalytics = new GameAnalyticsDotCom(this); + } + + /** + * Registers all game states + */ + registerStates() { + /** @type {Array} */ + const states = [PreloadState, MainMenuState, InGameState]; + + for (let i = 0; i < states.length; ++i) { + this.stateMgr.register(states[i]); + } + } + + /** + * Registers all event listeners + */ + registerEventListeners() { + window.addEventListener("focus", this.onFocus.bind(this)); + window.addEventListener("blur", this.onBlur.bind(this)); + + window.addEventListener("resize", () => this.checkResize(), true); + window.addEventListener("orientationchange", () => this.checkResize(), true); + + if (!G_IS_MOBILE_APP && !IS_MOBILE) { + window.addEventListener("mousemove", this.handleMousemove.bind(this)); + } + + // Unload events + window.addEventListener("beforeunload", this.onBeforeUnload.bind(this), true); + window.addEventListener("unload", this.onUnload.bind(this), true); + + document.addEventListener(pageVisibilityEventName, this.handleVisibilityChange.bind(this), false); + + // Track touches so we can update the focus appropriately + document.addEventListener("touchstart", this.updateFocusAfterUserInteraction.bind(this), true); + document.addEventListener("touchend", this.updateFocusAfterUserInteraction.bind(this), true); + } + + /** + * Checks the focus after a touch + * @param {TouchEvent} event + */ + updateFocusAfterUserInteraction(event) { + const target = /** @type {HTMLElement} */ (event.target); + if (!target || !target.tagName) { + // Safety check + logger.warn("Invalid touchstart/touchend event:", event); + return; + } + + // When clicking an element which is not the currently focused one, defocus it + if (target !== document.activeElement) { + // @ts-ignore + if (document.activeElement.blur) { + // @ts-ignore + document.activeElement.blur(); + } + } + + // If we click an input field, focus it now + if (target.tagName.toLowerCase() === "input") { + // We *really* need the focus + waitNextFrame().then(() => target.focus()); + } + } + + /** + * Handles a page visibility change event + * @param {Event} event + */ + handleVisibilityChange(event) { + const pageVisible = !document[pageHiddenPropName]; + if (pageVisible !== this.pageVisible) { + this.pageVisible = pageVisible; + logger.log("Visibility changed:", this.pageVisible); + this.trackedIsRenderable.set(this.isRenderable()); + } + } + + /** + * Handles a mouse move event + * @param {MouseEvent} event + */ + handleMousemove(event) { + this.mousePosition = new Vector(event.clientX, event.clientY); + } + + /** + * Internal on focus handler + */ + onFocus() { + this.focused = true; + } + + /** + * Internal blur handler + */ + onBlur() { + this.focused = false; + } + + /** + * Returns if the app is currently visible + */ + isRenderable() { + return !this.applicationPaused && this.pageVisible; + } + + onAppRenderableStateChanged(renderable) { + logger.log("Application renderable:", renderable); + if (!renderable) { + this.stateMgr.getCurrentState().onAppPause(); + } else { + // Got resume + this.stateMgr.getCurrentState().onAppResume(); + this.checkResize(); + } + + this.sound.onPageRenderableStateChanged(renderable); + } + + /** + * Internal unload handler + */ + onUnload(event) { + if (!this.unloaded) { + logSection("UNLOAD HANDLER", "#f77"); + this.unloaded = true; + this.stateMgr.getCurrentState().onBeforeExit(); + this.deinitialize(); + } + } + + /** + * Internal before-unload handler + */ + onBeforeUnload(event) { + logSection("BEFORE UNLOAD HANDLER", "#f77"); + + if (!G_IS_DEV && this.stateMgr.getCurrentState().getHasUnloadConfirmation()) { + if (G_IS_STANDALONE) { + } else { + // Need to show a "Are you sure you want to exit" + event.preventDefault(); + event.returnValue = "Are you sure you want to exit?"; + } + } + } + + /** + * Boots the application + */ + boot() { + this.registerStates(); + this.registerEventListeners(); + + Loader.linkAppAfterBoot(this); + + this.stateMgr.moveToState("PreloadState"); + + // Starting rendering + this.ticker.frameEmitted.add(this.onFrameEmitted, this); + this.ticker.bgFrameEmitted.add(this.onBackgroundFrame, this); + this.ticker.start(); + } + + /** + * Deinitializes the application + */ + deinitialize() { + return this.sound.deinitialize(); + } + + /** + * Background frame update callback + * @param {number} dt + */ + onBackgroundFrame(dt) { + if (this.isRenderable()) { + return; + } + + this.stateMgr.getCurrentState().onBackgroundTick(dt); + } + + /** + * Frame update callback + * @param {number} dt + */ + onFrameEmitted(dt) { + if (!this.isRenderable()) { + return; + } + + const time = performanceNow(); + + // Periodically check for resizes, this is expensive (takes 2-3ms so only do it once in a while!) + if (!this.lastResizeCheck || time - this.lastResizeCheck > 1000) { + this.checkResize(); + this.lastResizeCheck = time; + } + + this.stateMgr.getCurrentState().onRender(dt); + } + + /** + * Checks if the app resized. Only does this once in a while + * @param {boolean} forceUpdate Forced update of the dimensions + */ + checkResize(forceUpdate = false) { + const w = window.innerWidth; + const h = window.innerHeight; + if (this.screenWidth !== w || this.screenHeight !== h || forceUpdate) { + this.screenWidth = w; + this.screenHeight = h; + this.stateMgr.getCurrentState().onResized(this.screenWidth, this.screenHeight); + + const scale = this.getEffectiveUiScale(); + waitNextFrame().then(() => document.documentElement.style.setProperty("--ui-scale", scale)); + window.focus(); + } + } + + /** + * Returns the effective ui sclae + */ + getEffectiveUiScale() { + return this.platformWrapper.getUiScale() * this.settings.getInterfaceScaleValue(); + } + + /** + * Callback after ui scale has changed + */ + updateAfterUiScaleChanged() { + this.checkResize(true); + } +} diff --git a/src/js/core/animation_frame.js b/src/js/core/animation_frame.js new file mode 100644 index 00000000..b7243af7 --- /dev/null +++ b/src/js/core/animation_frame.js @@ -0,0 +1,71 @@ +import { Signal } from "./signal"; + +// @ts-ignore +import BackgroundAnimationFrameEmitterWorker from "../webworkers/background_animation_frame_emittter.worker"; + +import { createLogger } from "./logging"; +import { performanceNow } from "./builtins"; + +const logger = createLogger("animation_frame"); + +const maxDtMs = 1000; +const resetDtMs = 16; + +export class AnimationFrame { + constructor() { + this.frameEmitted = new Signal(); + this.bgFrameEmitted = new Signal(); + + this.lastTime = null; + this.bgLastTime = null; + + this.boundMethod = this.handleAnimationFrame.bind(this); + + /** @type {Worker} */ + this.backgroundWorker = new BackgroundAnimationFrameEmitterWorker(); + this.backgroundWorker.addEventListener("error", err => { + logger.error("Error in background fps worker:", err); + }); + this.backgroundWorker.addEventListener("message", this.handleBackgroundTick.bind(this)); + } + + /** + * + * @param {MessageEvent} event + */ + handleBackgroundTick(event) { + const time = performanceNow(); + if (!this.bgLastTime) { + // First update, first delta is always 16ms + this.bgFrameEmitted.dispatch(1000 / 60); + } else { + let dt = time - this.bgLastTime; + if (dt > maxDtMs) { + dt = resetDtMs; + } + this.bgFrameEmitted.dispatch(dt); + } + this.bgLastTime = time; + } + + start() { + assertAlways(window.requestAnimationFrame, "requestAnimationFrame is not supported!"); + this.handleAnimationFrame(); + } + + handleAnimationFrame(time) { + if (!this.lastTime) { + // First update, first delta is always 16ms + this.frameEmitted.dispatch(1000 / 60); + } else { + let dt = time - this.lastTime; + if (dt > maxDtMs) { + // warn(this, "Clamping", dt, "to", resetDtMs); + dt = resetDtMs; + } + this.frameEmitted.dispatch(dt); + } + this.lastTime = time; + window.requestAnimationFrame(this.boundMethod); + } +} diff --git a/src/js/core/assert.js b/src/js/core/assert.js new file mode 100644 index 00000000..2d15660d --- /dev/null +++ b/src/js/core/assert.js @@ -0,0 +1,26 @@ +import { createLogger } from "./logging"; + +const logger = createLogger("assert"); + +let assertionErrorShown = false; + +function initAssert() { + /** + * Expects a given condition to be true + * @param {Boolean} condition + * @param {...String} failureMessage + */ + // @ts-ignore + window.assert = function (condition, ...failureMessage) { + if (!condition) { + logger.error("assertion failed:", ...failureMessage); + if (!assertionErrorShown) { + // alert("Assertion failed (the game will try to continue to run): \n\n" + failureMessage); + assertionErrorShown = true; + } + throw new Error("AssertionError: " + failureMessage.join(" ")); + } + }; +} + +initAssert(); diff --git a/src/js/core/async_compression.js b/src/js/core/async_compression.js new file mode 100644 index 00000000..479ee80b --- /dev/null +++ b/src/js/core/async_compression.js @@ -0,0 +1,143 @@ +// @ts-ignore +import CompressionWorker from "../webworkers/compression.worker"; +import { createLogger } from "./logging"; +import { compressX64 } from "./lzstring"; +import { performanceNow, JSON_stringify } from "./builtins"; + +const logger = createLogger("async_compression"); + +export let compressionPrefix = String.fromCodePoint(1); + +function checkCryptPrefix(prefix) { + try { + window.localStorage.setItem("prefix_test", prefix); + window.localStorage.removeItem("prefix_test"); + return true; + } catch (ex) { + logger.warn("Prefix '" + prefix + "' not available"); + return false; + } +} + +if (!checkCryptPrefix(compressionPrefix)) { + logger.warn("Switching to basic prefix"); + compressionPrefix = " "; + if (!checkCryptPrefix(compressionPrefix)) { + logger.warn("Prefix not available, ls seems to be unavailable"); + } +} + +/** + * @typedef {{ + * errorHandler: function(any) : void, + * resolver: function(any) : void, + * startTime: number + * }} JobEntry + */ + +class AsynCompression { + constructor() { + /** @type {Worker} */ + this.worker = new CompressionWorker(); + + this.currentJobId = 1000; + + /** @type {Object.} */ + this.currentJobs = {}; + + this.worker.addEventListener("message", event => { + const { jobId, result } = event.data; + const jobData = this.currentJobs[jobId]; + if (!jobData) { + logger.error("Failed to resolve job result, job id", jobId, "is not known"); + return; + } + + const duration = performanceNow() - jobData.startTime; + // log(this, "Got response from worker within", duration.toFixed(2), "ms"); + const resolver = jobData.resolver; + delete this.currentJobs[jobId]; + resolver(result); + }); + + this.worker.addEventListener("error", err => { + logger.error("Got error from webworker:", err, "aborting all jobs"); + const failureCalls = []; + for (const jobId in this.currentJobs) { + failureCalls.push(this.currentJobs[jobId].errorHandler); + } + this.currentJobs = {}; + for (let i = 0; i < failureCalls.length; ++i) { + failureCalls[i](err); + } + }); + } + + /** + * Compresses file + * @param {string} text + */ + compressFileAsync(text) { + return this.internalQueueJob("compressFile", { + text, + compressionPrefix, + }); + } + + /** + * Compresses regulary + * @param {string} text + */ + compressX64Async(text) { + if (text.length < 1024) { + // Ok so this is not worth it + return Promise.resolve(compressX64(text)); + } + return this.internalQueueJob("compressX64", text); + } + + /** + * Compresses with checksum + * @param {any} obj + */ + compressWithChecksum(obj) { + const stringified = JSON_stringify(obj); + return this.internalQueueJob("compressWithChecksum", stringified); + } + + /** + * Compresses with checksum + * @param {any} data The packets data + * @param {number} packetId The numeric packet id + */ + compressPacket(data, packetId) { + return this.internalQueueJob("compressPacket", { + data, + packetId, + }); + } + + /** + * Queues a new job + * @param {string} job + * @param {any} data + * @returns {Promise} + */ + internalQueueJob(job, data) { + const jobId = ++this.currentJobId; + return new Promise((resolve, reject) => { + const errorHandler = err => { + logger.error("Failed to compress job", jobId, ":", err); + reject(err); + }; + this.currentJobs[jobId] = { + errorHandler, + resolver: resolve, + startTime: performanceNow(), + }; + this.worker.postMessage({ jobId, job, data }); + }); + } +} + +export const asyncCompressor = new AsynCompression(); diff --git a/src/js/core/atlas_definitions.js b/src/js/core/atlas_definitions.js new file mode 100644 index 00000000..043b3996 --- /dev/null +++ b/src/js/core/atlas_definitions.js @@ -0,0 +1,38 @@ +/** + * @typedef {{ + * frame: { x: number, y: number, w: number, h: number }, + * rotated: false, + * spriteSourceSize: { x: number, y: number, w: number, h: number }, + * sourceSize: { w: number, h: number}, + * trimmed: true + * }} SpriteDefinition + */ + +export class AtlasDefinition { + constructor(sourceData) { + this.sourceFileName = sourceData.meta.image; + this.meta = sourceData.meta; + + /** @type {Object.} */ + this.sourceData = sourceData.frames; + } + + getFullSourcePath() { + return this.sourceFileName; + } +} + +// @ts-ignore +export const atlasFiles = require + .context("../../../res_built/atlas/", false, /.*\.json/i) + .keys() + .map(f => f.replace(/^\.\//gi, "")) + .map(f => require("../../../res_built/atlas/" + f)) + .map(data => new AtlasDefinition(data)); + +// export const atlasDefinitions = { +// qualityPreload: atlasFiles.filter((atlas) => atlas.meta.image.indexOf("_preload") >= 0), +// qualityLow: atlasFiles.filter((atlas) => atlas.meta.image.indexOf("_low") >= 0), +// qualityMedium: atlasFiles.filter((atlas) => atlas.meta.image.indexOf("_medium") >= 0), +// qualityHigh: atlasFiles.filter((atlas) => atlas.meta.image.indexOf("_high") >= 0), +// }; diff --git a/src/js/core/background_resources_loader.js b/src/js/core/background_resources_loader.js new file mode 100644 index 00000000..44bb598e --- /dev/null +++ b/src/js/core/background_resources_loader.js @@ -0,0 +1,216 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +import { Loader } from "./loader"; +import { createLogger } from "./logging"; +import { Signal } from "./signal"; +import { SOUNDS, MUSIC } from "../platform/sound"; +import { AtlasDefinition, atlasFiles } from "./atlas_definitions"; + +const logger = createLogger("background_loader"); + +const essentialMainMenuSprites = ["logo.png", ...G_ALL_UI_IMAGES.filter(src => src.startsWith("ui/"))]; +const essentialMainMenuSounds = [ + SOUNDS.uiClick, + SOUNDS.uiError, + SOUNDS.dialogError, + SOUNDS.dialogOk, + SOUNDS.swishShow, + SOUNDS.swishHide, +]; + +const essentialBareGameAtlases = atlasFiles; +const essentialBareGameSprites = G_ALL_UI_IMAGES; +const essentialBareGameSounds = [MUSIC.gameBg]; + +const additionalGameSprites = []; +const additionalGameSounds = []; +for (const key in SOUNDS) { + additionalGameSounds.push(SOUNDS[key]); +} +for (const key in MUSIC) { + additionalGameSounds.push(MUSIC[key]); +} + +export class BackgroundResourcesLoader { + /** + * + * @param {Application} app + */ + constructor(app) { + this.app = app; + + this.registerReady = false; + this.mainMenuReady = false; + this.bareGameReady = false; + this.additionalReady = false; + + this.signalMainMenuLoaded = new Signal(); + this.signalBareGameLoaded = new Signal(); + this.signalAdditionalLoaded = new Signal(); + + this.numAssetsLoaded = 0; + this.numAssetsToLoadTotal = 0; + + // Avoid loading stuff twice + this.spritesLoaded = []; + this.soundsLoaded = []; + } + + getNumAssetsLoaded() { + return this.numAssetsLoaded; + } + + getNumAssetsTotal() { + return this.numAssetsToLoadTotal; + } + + getPromiseForMainMenu() { + if (this.mainMenuReady) { + return Promise.resolve(); + } + + return new Promise(resolve => { + this.signalMainMenuLoaded.add(resolve); + }); + } + + getPromiseForBareGame() { + if (this.bareGameReady) { + return Promise.resolve(); + } + + return new Promise(resolve => { + this.signalBareGameLoaded.add(resolve); + }); + } + + startLoading() { + this.internalStartLoadingEssentialsForMainMenu(); + } + + internalStartLoadingEssentialsForMainMenu() { + logger.log("⏰ Start load: main menu"); + this.internalLoadSpritesAndSounds(essentialMainMenuSprites, essentialMainMenuSounds) + .catch(err => { + logger.warn("⏰ Failed to load essentials for main menu:", err); + }) + .then(() => { + logger.log("⏰ Finish load: main menu"); + this.mainMenuReady = true; + this.signalMainMenuLoaded.dispatch(); + this.internalStartLoadingEssentialsForBareGame(); + }); + } + + internalStartLoadingEssentialsForBareGame() { + logger.log("⏰ Start load: bare game"); + this.internalLoadSpritesAndSounds( + essentialBareGameSprites, + essentialBareGameSounds, + essentialBareGameAtlases + ) + .catch(err => { + logger.warn("⏰ Failed to load essentials for bare game:", err); + }) + .then(() => { + logger.log("⏰ Finish load: bare game"); + Loader.createAtlasLinks(); + this.bareGameReady = true; + this.signalBareGameLoaded.dispatch(); + this.internalStartLoadingAdditionalGameAssets(); + }); + } + + internalStartLoadingAdditionalGameAssets() { + const additionalAtlases = []; + logger.log("⏰ Start load: additional assets (", additionalAtlases.length, "images)"); + this.internalLoadSpritesAndSounds(additionalGameSprites, additionalGameSounds, additionalAtlases) + .catch(err => { + logger.warn("⏰ Failed to load additional assets:", err); + }) + .then(() => { + logger.log("⏰ Finish load: additional assets"); + this.additionalReady = true; + this.signalAdditionalLoaded.dispatch(); + }); + } + + /** + * @param {Array} sprites + * @param {Array} sounds + * @param {Array} atlases + * @returns {Promise} + */ + internalLoadSpritesAndSounds(sprites, sounds, atlases = []) { + this.numAssetsToLoadTotal = sprites.length + sounds.length + atlases.length; + this.numAssetsLoaded = 0; + + let promises = []; + + for (let i = 0; i < sounds.length; ++i) { + if (this.soundsLoaded.indexOf(sounds[i]) >= 0) { + // Already loaded + continue; + } + + this.soundsLoaded.push(sounds[i]); + promises.push( + this.app.sound + .loadSound(sounds[i]) + .catch(err => { + logger.warn("Failed to load sound:", sounds[i]); + }) + .then(() => { + this.numAssetsLoaded++; + }) + ); + } + + for (let i = 0; i < sprites.length; ++i) { + if (this.spritesLoaded.indexOf(sprites[i]) >= 0) { + // Already loaded + continue; + } + this.spritesLoaded.push(sprites[i]); + promises.push( + Loader.preloadCSSSprite(sprites[i]) + .catch(err => { + logger.warn("Failed to load css sprite:", sprites[i]); + }) + .then(() => { + this.numAssetsLoaded++; + }) + ); + } + + for (let i = 0; i < atlases.length; ++i) { + const atlas = atlases[i]; + promises.push( + Loader.preloadAtlas(atlas) + .catch(err => { + logger.warn("Failed to load atlas:", atlas.sourceFileName); + }) + .then(() => { + this.numAssetsLoaded++; + }) + ); + } + + return ( + Promise.all(promises) + + // // Remove some pressure by waiting a bit + // .then(() => { + // return new Promise(resolve => { + // setTimeout(resolve, 200); + // }); + // }) + .then(() => { + this.numAssetsToLoadTotal = 0; + this.numAssetsLoaded = 0; + }) + ); + } +} diff --git a/src/js/core/buffer_maintainer.js b/src/js/core/buffer_maintainer.js new file mode 100644 index 00000000..3be1c08f --- /dev/null +++ b/src/js/core/buffer_maintainer.js @@ -0,0 +1,146 @@ +import { GameRoot } from "../game/root"; +import { + makeOffscreenBuffer, + freeCanvas, + getBufferVramUsageBytes, + getBufferStats, + clearBufferBacklog, +} from "./buffer_utils"; +import { createLogger } from "./logging"; +import { round2Digits, round1Digit } from "./utils"; + +/** + * @typedef {{ + * canvas: HTMLCanvasElement, + * context: CanvasRenderingContext2D, + * lastUse: number, + * }} CacheEntry + */ + +const logger = createLogger("buffers"); + +const bufferGcDurationSeconds = 3; + +export class BufferMaintainer { + /** + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + + /** @type {Map>} */ + this.cache = new Map(); + + this.iterationIndex = 1; + this.lastIteration = 0; + } + + /** + * Goes to the next buffer iteration, clearing all buffers which were not used + * for a few iterations + */ + garbargeCollect() { + let totalKeys = 0; + let deletedKeys = 0; + const minIteration = this.iterationIndex; + + this.cache.forEach((subCache, key) => { + let unusedSubKeys = []; + + // Filter sub cache + subCache.forEach((cacheEntry, subKey) => { + if (cacheEntry.lastUse < minIteration) { + unusedSubKeys.push(subKey); + freeCanvas(cacheEntry.canvas); + ++deletedKeys; + } else { + ++totalKeys; + } + }); + + // Delete unused sub keys + for (let i = 0; i < unusedSubKeys.length; ++i) { + subCache.delete(unusedSubKeys[i]); + } + }); + + // Make sure our backlog never gets too big + clearBufferBacklog(); + + const bufferStats = getBufferStats(); + const mbUsed = round1Digit(bufferStats.vramUsage / (1024 * 1024)); + logger.log( + "GC: Remove", + (deletedKeys + "").padStart(4), + ", Remain", + (totalKeys + "").padStart(4), + "(", + (bufferStats.bufferCount + "").padStart(4), + "total", + ")", + + "(", + (bufferStats.backlog + "").padStart(4), + "backlog", + ")", + + "VRAM:", + mbUsed, + "MB" + ); + + ++this.iterationIndex; + } + + update() { + const now = this.root.time.realtimeNow(); + if (now - this.lastIteration > bufferGcDurationSeconds) { + this.lastIteration = now; + this.garbargeCollect(); + } + } + + /** + * + * @param {string} key + * @param {string} subKey + * @param {function(HTMLCanvasElement, CanvasRenderingContext2D, number, number, number, object?) : void} redrawMethod + * @param {object=} additionalParams + * @returns {HTMLCanvasElement} + * + */ + getForKey(key, subKey, w, h, dpi, redrawMethod, additionalParams) { + // First, create parent key + let parent = this.cache.get(key); + if (!parent) { + parent = new Map(); + this.cache.set(key, parent); + } + + // Now search for sub key + const cacheHit = parent.get(subKey); + if (cacheHit) { + cacheHit.lastUse = this.iterationIndex; + return cacheHit.canvas; + } + + // Need to generate new buffer + const effectiveWidth = w * dpi; + const effectiveHeight = h * dpi; + + const [canvas, context] = makeOffscreenBuffer(effectiveWidth, effectiveHeight, { + reusable: true, + label: "buffer-" + key + "/" + subKey, + smooth: true, + }); + + redrawMethod(canvas, context, w, h, dpi, additionalParams); + + parent.set(subKey, { + canvas, + context, + lastUse: this.iterationIndex, + }); + return canvas; + } +} diff --git a/src/js/core/buffer_utils.js b/src/js/core/buffer_utils.js new file mode 100644 index 00000000..3c087d1b --- /dev/null +++ b/src/js/core/buffer_utils.js @@ -0,0 +1,201 @@ +import { globalConfig } from "./config"; +import { Math_max, Math_floor, Math_abs } from "./builtins"; +import { fastArrayDelete } from "./utils"; +import { createLogger } from "./logging"; + +const logger = createLogger("buffer_utils"); + +/** + * Enables images smoothing on a context + * @param {CanvasRenderingContext2D} context + */ +export function enableImageSmoothing(context) { + context.imageSmoothingEnabled = true; + context.webkitImageSmoothingEnabled = true; + + // @ts-ignore + context.imageSmoothingQuality = globalConfig.smoothing.quality; +} + +/** + * Disables image smoothing on a context + * @param {CanvasRenderingContext2D} context + */ +export function disableImageSmoothing(context) { + context.imageSmoothingEnabled = false; + context.webkitImageSmoothingEnabled = false; +} + +const registeredCanvas = []; +const freeCanvasList = []; + +let vramUsage = 0; +let bufferCount = 0; + +/** + * + * @param {HTMLCanvasElement} canvas + */ +export function getBufferVramUsageBytes(canvas) { + return canvas.width * canvas.height * 4; +} + +/** + * Returns stats on the allocated buffers + */ +export function getBufferStats() { + return { + vramUsage, + bufferCount, + backlog: freeCanvasList.length, + }; +} + +export function clearBufferBacklog() { + while (freeCanvasList.length > 50) { + freeCanvasList.pop(); + } +} + +/** + * Creates a new offscreen buffer + * @param {Number} w + * @param {Number} h + * @returns {[HTMLCanvasElement, CanvasRenderingContext2D]} + */ +export function makeOffscreenBuffer(w, h, { smooth = true, reusable = true, label = "buffer" }) { + assert(w > 0 && h > 0, "W or H < 0"); + if (w % 1 !== 0 || h % 1 !== 0) { + // console.warn("Subpixel offscreen buffer size:", w, h); + } + if (w < 1 || h < 1) { + logger.error("Offscreen buffer size < 0:", w, "x", h); + w = Math_max(1, w); + h = Math_max(1, h); + } + + const recommendedSize = 1024 * 1024; + if (w * h > recommendedSize) { + logger.warn("Creating huge buffer:", w, "x", h, "with label", label); + } + + w = Math_floor(w); + h = Math_floor(h); + + let canvas = null; + let context = null; + + let bestMatchingOne = null; + let bestMatchingPixelsDiff = 1e50; + + const currentPixels = w * h; + + // Ok, search in cache first + for (let i = 0; i < freeCanvasList.length; ++i) { + const { canvas: useableCanvas, context: useableContext } = freeCanvasList[i]; + if (useableCanvas.width === w && useableCanvas.height === h) { + // Ok we found one + canvas = useableCanvas; + context = useableContext; + + fastArrayDelete(freeCanvasList, i); + break; + } + + const otherPixels = useableCanvas.width * useableCanvas.height; + const diff = Math_abs(otherPixels - currentPixels); + if (diff < bestMatchingPixelsDiff) { + bestMatchingPixelsDiff = diff; + bestMatchingOne = { + canvas: useableCanvas, + context: useableContext, + index: i, + }; + } + } + + // Ok none matching, reuse one though + if (!canvas && bestMatchingOne) { + canvas = bestMatchingOne.canvas; + context = bestMatchingOne.context; + canvas.width = w; + canvas.height = h; + fastArrayDelete(freeCanvasList, bestMatchingOne.index); + } + + // Reset context + if (context) { + // Restore past state + context.restore(); + context.save(); + context.clearRect(0, 0, canvas.width, canvas.height); + + delete canvas.style.width; + delete canvas.style.height; + } + + // None found , create new one + if (!canvas) { + canvas = document.createElement("canvas"); + context = canvas.getContext("2d" /*, { alpha } */); + + canvas.width = w; + canvas.height = h; + + // Initial state + context.save(); + } + + canvas.label = label; + + if (smooth) { + enableImageSmoothing(context); + } else { + disableImageSmoothing(context); + } + + if (reusable) { + registerCanvas(canvas, context); + } + + return [canvas, context]; +} + +/** + * Frees a canvas + * @param {HTMLCanvasElement} canvas + */ +export function registerCanvas(canvas, context) { + registeredCanvas.push({ canvas, context }); + + bufferCount += 1; + vramUsage += getBufferVramUsageBytes(canvas); +} + +/** + * Frees a canvas + * @param {HTMLCanvasElement} canvas + */ +export function freeCanvas(canvas) { + assert(canvas, "Canvas is empty"); + + let index = -1; + let data = null; + for (let i = 0; i < registeredCanvas.length; ++i) { + if (registeredCanvas[i].canvas === canvas) { + index = i; + data = registeredCanvas[i]; + break; + } + } + + if (index < 0) { + logger.error("Tried to free unregistered canvas of size", canvas.width, canvas.height); + return; + } + fastArrayDelete(registeredCanvas, index); + freeCanvasList.push(data); + + bufferCount -= 1; + vramUsage -= getBufferVramUsageBytes(canvas); +} diff --git a/src/js/core/builtins.js b/src/js/core/builtins.js new file mode 100644 index 00000000..77f40b77 --- /dev/null +++ b/src/js/core/builtins.js @@ -0,0 +1,34 @@ +// Store the original version of all builtins to prevent modification + +export const JSON_stringify = JSON.stringify.bind(JSON); +export const JSON_parse = JSON.parse.bind(JSON); + +export function Math_radians(degrees) { + return (degrees * Math_PI) / 180.0; +} + +export function Math_degrees(radians) { + return (radians * 180.0) / Math_PI; +} + +export const performanceNow = performance.now.bind(performance); + +export const Math_abs = Math.abs.bind(Math); +export const Math_ceil = Math.ceil.bind(Math); +export const Math_floor = Math.floor.bind(Math); +export const Math_round = Math.round.bind(Math); +export const Math_sign = Math.sign.bind(Math); +export const Math_sqrt = Math.sqrt.bind(Math); +export const Math_min = Math.min.bind(Math); +export const Math_max = Math.max.bind(Math); +export const Math_sin = Math.sin.bind(Math); +export const Math_cos = Math.cos.bind(Math); +export const Math_tan = Math.tan.bind(Math); +export const Math_hypot = Math.hypot.bind(Math); +export const Math_atan2 = Math.atan2.bind(Math); +export const Math_pow = Math.pow.bind(Math); +export const Math_random = Math.random.bind(Math); +export const Math_exp = Math.exp.bind(Math); +export const Math_log10 = Math.log10.bind(Math); + +export const Math_PI = 3.1415926; diff --git a/src/js/core/cachebust.js b/src/js/core/cachebust.js new file mode 100644 index 00000000..26be0449 --- /dev/null +++ b/src/js/core/cachebust.js @@ -0,0 +1,10 @@ +/** + * Generates a cachebuster string. This only modifies the path in the browser version + * @param {string} path + */ +export function cachebust(path) { + if (G_IS_BROWSER && !G_IS_STANDALONE && !G_IS_DEV) { + return "/v/" + G_BUILD_COMMIT_HASH + "/" + path; + } + return path; +} diff --git a/src/js/core/click_detector.js b/src/js/core/click_detector.js new file mode 100644 index 00000000..abe666da --- /dev/null +++ b/src/js/core/click_detector.js @@ -0,0 +1,431 @@ +import { performanceNow } from "../core/builtins"; +import { createLogger } from "../core/logging"; +import { Signal } from "../core/signal"; +import { fastArrayDelete, fastArrayDeleteValueIfContained } from "./utils"; +import { Vector } from "./vector"; +import { IS_MOBILE } from "./config"; + +const logger = createLogger("click_detector"); + +export const MAX_MOVE_DISTANCE_PX = IS_MOBILE ? 20 : 40; + +// For debugging +const registerClickDetectors = G_IS_DEV && true; +if (registerClickDetectors) { + /** @type {Array} */ + window.activeClickDetectors = []; +} + +// Store active click detectors so we can cancel them +/** @type {Array} */ +const ongoingClickDetectors = []; + +// Store when the last touch event was registered, to avoid accepting a touch *and* a click event + +export let clickDetectorGlobals = { + lastTouchTime: -1000, +}; + +/** + * Click detector creation payload typehints + * @typedef {{ + * consumeEvents?: boolean, + * preventDefault?: boolean, + * applyCssClass?: string, + * captureTouchmove?: boolean, + * targetOnly?: boolean, + * maxDistance?: number, + * clickSound?: string, + * }} ClickDetectorConstructorArgs + */ + +// Detects clicks +export class ClickDetector { + /** + * + * @param {Element} element + * @param {object} param1 + * @param {boolean=} param1.consumeEvents Whether to call stopPropagation + * (Useful for nested elements where the parent has a click handler as wel) + * @param {boolean=} param1.preventDefault Whether to call preventDefault (Usually makes the handler faster) + * @param {string=} param1.applyCssClass The css class to add while the element is pressed + * @param {boolean=} param1.captureTouchmove Whether to capture touchmove events as well + * @param {boolean=} param1.targetOnly Whether to also accept clicks on child elements (e.target !== element) + * @param {number=} param1.maxDistance The maximum distance in pixels to accept clicks + * @param {string=} param1.clickSound Sound key to play on touchdown + */ + constructor( + element, + { + consumeEvents = false, + preventDefault = true, + applyCssClass = "pressed", + captureTouchmove = false, + targetOnly = false, + maxDistance = MAX_MOVE_DISTANCE_PX, + clickSound = null, + } + ) { + assert(element, "No element given!"); + this.clickDownPosition = null; + + this.consumeEvents = consumeEvents; + this.preventDefault = preventDefault; + this.applyCssClass = applyCssClass; + this.captureTouchmove = captureTouchmove; + this.targetOnly = targetOnly; + this.clickSound = clickSound; + this.maxDistance = maxDistance; + + // Signals + this.click = new Signal(); + this.rightClick = new Signal(); + this.touchstart = new Signal(); + this.touchmove = new Signal(); + this.touchend = new Signal(); + this.touchcancel = new Signal(); + + // Simple signals which just receive the touch position + this.touchstartSimple = new Signal(); + this.touchmoveSimple = new Signal(); + this.touchendSimple = new Signal(); + + // Store time of touch start + this.clickStartTime = null; + + // A click can be cancelled if another detector registers a click + this.cancelled = false; + + this.internalBindTo(/** @type {HTMLElement} */ (element)); + } + + /** + * Cleans up all event listeners of this detector + */ + cleanup() { + if (this.element) { + if (registerClickDetectors) { + const index = window.activeClickDetectors.indexOf(this); + if (index < 0) { + logger.error("Click detector cleanup but is not active"); + } else { + window.activeClickDetectors.splice(index, 1); + } + } + const options = this.internalGetEventListenerOptions(); + this.element.removeEventListener("touchstart", this.handlerTouchStart, options); + this.element.removeEventListener("touchend", this.handlerTouchEnd, options); + this.element.removeEventListener("touchcancel", this.handlerTouchCancel, options); + + this.element.removeEventListener("mouseup", this.handlerTouchStart, options); + this.element.removeEventListener("mousedown", this.handlerTouchEnd, options); + this.element.removeEventListener("mouseout", this.handlerTouchCancel, options); + + if (this.captureTouchmove) { + this.element.removeEventListener("touchmove", this.handlerTouchMove, options); + this.element.removeEventListener("mousemove", this.handlerTouchMove, options); + } + + this.click.removeAll(); + this.touchstart.removeAll(); + this.touchmove.removeAll(); + this.touchend.removeAll(); + this.touchcancel.removeAll(); + + // TODO: Remove pointer captures + + this.element = null; + } + } + + // INTERNAL METHODS + + /** + * Internal method to get the options to pass to an event listener + */ + internalGetEventListenerOptions() { + return { + capture: this.consumeEvents, + passive: !this.preventDefault, + }; + } + + /** + * Binds the click detector to an element + * @param {HTMLElement} element + */ + internalBindTo(element) { + const options = this.internalGetEventListenerOptions(); + + this.handlerTouchStart = this.internalOnPointerDown.bind(this); + this.handlerTouchEnd = this.internalOnPointerEnd.bind(this); + this.handlerTouchMove = this.internalOnPointerMove.bind(this); + this.handlerTouchCancel = this.internalOnTouchCancel.bind(this); + + element.addEventListener("touchstart", this.handlerTouchStart, options); + element.addEventListener("touchend", this.handlerTouchEnd, options); + element.addEventListener("touchcancel", this.handlerTouchCancel, options); + + element.addEventListener("mousedown", this.handlerTouchStart, options); + element.addEventListener("mouseup", this.handlerTouchEnd, options); + element.addEventListener("mouseout", this.handlerTouchCancel, options); + + if (this.captureTouchmove) { + element.addEventListener("touchmove", this.handlerTouchMove, options); + element.addEventListener("mousemove", this.handlerTouchMove, options); + } + + if (registerClickDetectors) { + window.activeClickDetectors.push(this); + } + this.element = element; + } + + /** + * Returns if the bound element is currently in the DOM. + */ + internalIsDomElementAttached() { + return this.element && document.documentElement.contains(this.element); + } + + /** + * Checks if the given event is relevant for this detector + * @param {TouchEvent|MouseEvent} event + */ + internalEventPreHandler(event, expectedRemainingTouches = 1) { + if (!this.element) { + // Already cleaned up + return false; + } + + if (this.targetOnly && event.target !== this.element) { + // Clicked a child element + return false; + } + + // Stop any propagation and defaults if configured + if (this.consumeEvents && event.cancelable) { + event.stopPropagation(); + } + + if (this.preventDefault && event.cancelable) { + event.preventDefault(); + } + + if (window.TouchEvent && event instanceof TouchEvent) { + clickDetectorGlobals.lastTouchTime = performanceNow(); + + // console.log("Got touches", event.targetTouches.length, "vs", expectedRemainingTouches); + if (event.targetTouches.length !== expectedRemainingTouches) { + return false; + } + } + + if (event instanceof MouseEvent) { + if (performanceNow() - clickDetectorGlobals.lastTouchTime < 1000.0) { + return false; + } + } + + return true; + } + + /** + * Extracts the mous position from an event + * @param {TouchEvent|MouseEvent} event + * @returns {Vector} The client space position + */ + static extractPointerPosition(event) { + if (window.TouchEvent && event instanceof TouchEvent) { + if (event.changedTouches.length !== 1) { + logger.warn( + "Got unexpected target touches:", + event.targetTouches.length, + "->", + event.targetTouches + ); + return new Vector(0, 0); + } + + const touch = event.changedTouches[0]; + return new Vector(touch.clientX, touch.clientY); + } + + if (event instanceof MouseEvent) { + return new Vector(event.clientX, event.clientY); + } + + assertAlways(false, "Got unknown event: " + event); + + return new Vector(0, 0); + } + + /** + * Cacnels all ongoing events on this detector + */ + cancelOngoingEvents() { + if (this.applyCssClass && this.element) { + this.element.classList.remove(this.applyCssClass); + } + this.clickDownPosition = null; + this.clickStartTime = null; + this.cancelled = true; + fastArrayDeleteValueIfContained(ongoingClickDetectors, this); + } + + /** + * Internal pointer down handler + * @param {TouchEvent|MouseEvent} event + */ + internalOnPointerDown(event) { + if (!this.internalEventPreHandler(event, 1)) { + return false; + } + + const position = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event); + + if (event instanceof MouseEvent) { + const isRightClick = event.which == 3; + if (isRightClick) { + // Ignore right clicks + this.rightClick.dispatch(position, event); + this.cancelled = true; + return; + } + } + + if (this.clickDownPosition) { + logger.warn("Ignoring double click"); + return false; + } + + this.cancelled = false; + this.touchstart.dispatch(event); + + // Store where the touch started + this.clickDownPosition = position; + this.clickStartTime = performanceNow(); + this.touchstartSimple.dispatch(this.clickDownPosition.x, this.clickDownPosition.y); + + // If we are not currently within a click, register it + if (ongoingClickDetectors.indexOf(this) < 0) { + ongoingClickDetectors.push(this); + } else { + logger.warn("Click detector got pointer down of active pointer twice"); + } + + // If we should apply any classes, do this now + if (this.applyCssClass) { + this.element.classList.add(this.applyCssClass); + } + + // If we should play any sound, do this + if (this.clickSound) { + throw new Error("TODO: Play sounds on click"); + // GLOBAL_APP.sound.playUiSound(this.clickSound); + } + + return false; + } + + /** + * Internal pointer move handler + * @param {TouchEvent|MouseEvent} event + */ + internalOnPointerMove(event) { + if (!this.internalEventPreHandler(event, 1)) { + return false; + } + this.touchmove.dispatch(event); + const pos = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event); + this.touchmoveSimple.dispatch(pos.x, pos.y); + return false; + } + + /** + * Internal pointer end handler + * @param {TouchEvent|MouseEvent} event + */ + internalOnPointerEnd(event) { + if (!this.internalEventPreHandler(event, 0)) { + return false; + } + + if (this.cancelled) { + // warn(this, "Not dispatching touchend on cancelled listener"); + return false; + } + + if (event instanceof MouseEvent) { + const isRightClick = event.which == 3; + if (isRightClick) { + return; + } + } + + const index = ongoingClickDetectors.indexOf(this); + if (index < 0) { + logger.warn("Got pointer end but click detector is not in pressed state"); + } else { + fastArrayDelete(ongoingClickDetectors, index); + } + + let dispatchClick = false; + let dispatchClickPos = null; + + // Check for correct down position, otherwise must have pinched or so + if (this.clickDownPosition) { + const pos = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event); + const distance = pos.distance(this.clickDownPosition); + if (distance <= this.maxDistance) { + dispatchClick = true; + dispatchClickPos = pos; + } else { + // console.warn("[ClickDetector] Touch does not count as click: ms=", timeSinceStart, "-> tolerance:", tolerance, "(was", distance, ")"); + } + } + + this.clickDownPosition = null; + this.clickStartTime = null; + + if (this.applyCssClass) { + this.element.classList.remove(this.applyCssClass); + } + + // Dispatch in the end to avoid the element getting invalidated + // Also make sure that the element is still in the dom + if (this.internalIsDomElementAttached()) { + this.touchend.dispatch(event); + this.touchendSimple.dispatch(); + + if (dispatchClick) { + const detectors = ongoingClickDetectors.slice(); + for (let i = 0; i < detectors.length; ++i) { + detectors[i].cancelOngoingEvents(); + } + this.click.dispatch(dispatchClickPos, event); + } + } + return false; + } + + /** + * Internal touch cancel handler + * @param {TouchEvent|MouseEvent} event + */ + internalOnTouchCancel(event) { + if (!this.internalEventPreHandler(event, 0)) { + return false; + } + + if (this.cancelled) { + // warn(this, "Not dispatching touchcancel on cancelled listener"); + return false; + } + + this.cancelOngoingEvents(); + this.touchcancel.dispatch(event); + this.touchendSimple.dispatch(event); + return false; + } +} diff --git a/src/js/core/config.js b/src/js/core/config.js new file mode 100644 index 00000000..b9153cfa --- /dev/null +++ b/src/js/core/config.js @@ -0,0 +1,104 @@ +export const IS_DEBUG = + G_IS_DEV && + typeof window !== "undefined" && + window.location.port === "3005" && + (window.location.host.indexOf("localhost:") >= 0 || window.location.host.indexOf("192.168.0.") >= 0) && + window.location.search.indexOf("nodebug") < 0; + +const smoothCanvas = true; + +export const globalConfig = { + // Size of a single tile in Pixels. + // NOTICE: Update webpack.production.config too! + tileSize: 32, + halfTileSize: 16, + + // Which dpi the assets have + assetsDpi: 192 / 32, + assetsSharpness: 1.2, + shapesSharpness: 1.4, + + // [Calculated] physics step size + physicsDeltaMs: 0, + physicsDeltaSeconds: 0, + + // Update physics at N fps, independent of rendering + physicsUpdateRate: 60, + + // Map + mapChunkSize: 32, + mapChunkPrerenderMinZoom: 0.7, + mapChunkOverviewMinZoom: 0.7, + + // Belt speeds + // NOTICE: Update webpack.production.config too! + beltSpeedItemsPerSecond: 1, + itemSpacingOnBelts: 0.63, + minerSpeedItemsPerSecond: 0, // COMPUTED + + undergroundBeltMaxTiles: 5, + + buildingSpeeds: { + cutter: 1 / 6, + rotater: 1 / 2, + painter: 1 / 3, + mixer: 1 / 2, + stacker: 1 / 5, + }, + + // Zooming + initialZoom: 1.9, + minZoomLevel: 0.1, + maxZoomLevel: 3, + + // Global game speed + gameSpeed: 1, + + warmupTimeSecondsFast: 0.1, + warmupTimeSecondsRegular: 1, + + smoothing: { + smoothMainCanvas: smoothCanvas && true, + quality: "low", // Low is CRUCIAL for mobile performance! + }, + + rendering: {}, + + debug: { + /* dev:start */ + fastGameEnter: true, + noArtificialDelays: true, + disableSavegameWrite: false, + showEntityBounds: false, + showAcceptorEjectors: false, + usePlainShapeIds: true, + disableMusic: true, + doNotRenderStatics: false, + disableZoomLimits: false, + showChunkBorders: false, + rewardsInstant: false, + allBuildingsUnlocked: true, + upgradesNoCost: true, + disableUnlockDialog: true, + /* dev:end */ + }, + + // Secret vars + info: { + // Binary file salt + file: "Ec'])@^+*9zMevK3uMV4432x9%iK'=", + + // Savegame salt + sgSalt: "}95Q3%8/.837Lqym_BJx%q7)pAHJbF", + }, +}; + +export const IS_MOBILE = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + +// Automatic calculations + +globalConfig.physicsDeltaMs = 1000.0 / globalConfig.physicsUpdateRate; +globalConfig.physicsDeltaSeconds = 1.0 / globalConfig.physicsUpdateRate; + +globalConfig.minerSpeedItemsPerSecond = + globalConfig.beltSpeedItemsPerSecond / globalConfig.itemSpacingOnBelts / 6; diff --git a/src/js/core/dpi_manager.js b/src/js/core/dpi_manager.js new file mode 100644 index 00000000..2045a5e0 --- /dev/null +++ b/src/js/core/dpi_manager.js @@ -0,0 +1,117 @@ +import { globalConfig } from "../core/config"; +import { Math_ceil, Math_floor, Math_round } from "./builtins"; +import { round1Digit, round2Digits } from "./utils"; + +/** + * Returns the current dpi + * @returns {number} + */ +export function getDeviceDPI() { + return window.devicePixelRatio || 1; +} + +/** + * + * @param {number} dpi + * @returns {number} Smoothed dpi + */ +export function smoothenDpi(dpi) { + if (dpi < 0.05) { + return 0.05; + } else if (dpi < 0.1) { + return round2Digits(dpi); + } else if (dpi < 1) { + return round1Digit(dpi); + } else { + return round1Digit(Math_round(dpi / 0.5) * 0.5); + } +} + +// Initial dpi +// setDPIMultiplicator(1); + +/** + * Prepares a context for hihg dpi rendering + * @param {CanvasRenderingContext2D} context + */ +export function prepareHighDPIContext(context, smooth = true) { + const dpi = getDeviceDPI(); + context.scale(dpi, dpi); + + if (smooth) { + context.imageSmoothingEnabled = true; + context.webkitImageSmoothingEnabled = true; + + // @ts-ignore + context.imageSmoothingQuality = globalConfig.smoothing.quality; + } else { + context.imageSmoothingEnabled = false; + context.webkitImageSmoothingEnabled = false; + } +} + +/** + * Resizes a high dpi canvas + * @param {HTMLCanvasElement} canvas + * @param {number} w + * @param {number} h + */ +export function resizeHighDPICanvas(canvas, w, h, smooth = true) { + const dpi = getDeviceDPI(); + + const wNumber = Math_floor(w); + const hNumber = Math_floor(h); + + const targetW = Math_floor(wNumber * dpi); + const targetH = Math_floor(hNumber * dpi); + + if (targetW !== canvas.width || targetH !== canvas.height) { + // console.log("Resize Canvas from", canvas.width, canvas.height, "to", targetW, targetH) + canvas.width = targetW; + canvas.height = targetH; + canvas.style.width = wNumber + "px"; + canvas.style.height = hNumber + "px"; + prepareHighDPIContext(canvas.getContext("2d"), smooth); + } +} + +/** + * Resizes a canvas + * @param {HTMLCanvasElement} canvas + * @param {number} w + * @param {number} h + */ +export function resizeCanvas(canvas, w, h, setStyle = true) { + const actualW = Math_ceil(w); + const actualH = Math_ceil(h); + if (actualW !== canvas.width || actualH !== canvas.height) { + canvas.width = actualW; + canvas.height = actualH; + if (setStyle) { + canvas.style.width = actualW + "px"; + canvas.style.height = actualH + "px"; + } + // console.log("Resizing canvas to", actualW, "x", actualH); + } +} + +/** + * Resizes a canvas and makes sure its cleared + * @param {HTMLCanvasElement} canvas + * @param {CanvasRenderingContext2D} context + * @param {number} w + * @param {number} h + */ +export function resizeCanvasAndClear(canvas, context, w, h) { + const actualW = Math_ceil(w); + const actualH = Math_ceil(h); + if (actualW !== canvas.width || actualH !== canvas.height) { + canvas.width = actualW; + canvas.height = actualH; + canvas.style.width = actualW + "px"; + canvas.style.height = actualH + "px"; + // console.log("Resizing canvas to", actualW, "x", actualH); + } else { + context.clearRect(0, 0, actualW, actualH); + } +} diff --git a/src/js/core/draw_parameters.js b/src/js/core/draw_parameters.js new file mode 100644 index 00000000..5e06c59f --- /dev/null +++ b/src/js/core/draw_parameters.js @@ -0,0 +1,25 @@ +import { Rectangle } from "./rectangle"; + +/* typehints:start */ +import { GameRoot } from "../game/root"; +/* typehints:end */ + +export class DrawParameters { + constructor({ context, visibleRect, desiredAtlasScale, zoomLevel, root }) { + /** @type {CanvasRenderingContext2D} */ + this.context = context; + + /** @type {Rectangle} */ + this.visibleRect = visibleRect; + + /** @type {number} */ + this.desiredAtlasScale = desiredAtlasScale; + + /** @type {number} */ + this.zoomLevel = zoomLevel; + + // FIXME: Not really nice + /** @type {GameRoot} */ + this.root = root; + } +} diff --git a/src/js/core/draw_utils.js b/src/js/core/draw_utils.js new file mode 100644 index 00000000..8057a211 --- /dev/null +++ b/src/js/core/draw_utils.js @@ -0,0 +1,321 @@ +/* typehints:start */ +import { AtlasSprite } from "./sprites"; +import { DrawParameters } from "./draw_parameters"; +/* typehints:end */ + +import { Math_PI, Math_round, Math_atan2, Math_hypot, Math_floor } from "./builtins"; +import { Vector } from "./vector"; +import { Rectangle } from "./rectangle"; +import { createLogger } from "./logging"; + +const logger = createLogger("draw_utils"); + +export function initDrawUtils() { + CanvasRenderingContext2D.prototype.beginRoundedRect = function (x, y, w, h, r) { + if (r < 0.05) { + this.beginPath(); + this.rect(x, y, w, h); + return; + } + + if (w < 2 * r) { + r = w / 2; + } + if (h < 2 * r) { + r = h / 2; + } + this.beginPath(); + this.moveTo(x + r, y); + this.arcTo(x + w, y, x + w, y + h, r); + this.arcTo(x + w, y + h, x, y + h, r); + this.arcTo(x, y + h, x, y, r); + this.arcTo(x, y, x + w, y, r); + // this.closePath(); + }; + + CanvasRenderingContext2D.prototype.beginCircle = function (x, y, r) { + if (r < 0.05) { + this.beginPath(); + this.rect(x, y, 1, 1); + return; + } + this.beginPath(); + this.arc(x, y, r, 0, 2.0 * Math_PI); + }; +} + +/** + * + * @param {object} param0 + * @param {DrawParameters} param0.parameters + * @param {AtlasSprite} param0.sprite + * @param {number} param0.x + * @param {number} param0.y + * @param {number} param0.angle + * @param {number} param0.size + * @param {number=} param0.offsetX + * @param {number=} param0.offsetY + */ +export function drawRotatedSprite({ parameters, sprite, x, y, angle, size, offsetX = 0, offsetY = 0 }) { + parameters.context.translate(x, y); + parameters.context.rotate(angle); + sprite.drawCachedCentered(parameters, offsetX, offsetY, size, false); + parameters.context.rotate(-angle); + parameters.context.translate(-x, -y); +} + +export function drawLineFast(context, { x1, x2, y1, y2, color = null, lineSize = 1 }) { + const dX = x2 - x1; + const dY = y2 - y1; + + const angle = Math_atan2(dY, dX) + 0.0 * Math_PI; + const len = Math_hypot(dX, dY); + + context.translate(x1, y1); + context.rotate(angle); + + if (color) { + context.fillStyle = color; + } + + context.fillRect(0, -lineSize / 2, len, lineSize); + + context.rotate(-angle); + context.translate(-x1, -y1); +} + +const INSIDE = 0; +const LEFT = 1; +const RIGHT = 2; +const BOTTOM = 4; +const TOP = 8; + +// https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm + +function computeOutCode(x, y, xmin, xmax, ymin, ymax) { + let code = INSIDE; + + if (x < xmin) + // to the left of clip window + code |= LEFT; + else if (x > xmax) + // to the right of clip window + code |= RIGHT; + if (y < ymin) + // below the clip window + code |= BOTTOM; + else if (y > ymax) + // above the clip window + code |= TOP; + + return code; +} + +// Cohen–Sutherland clipping algorithm clips a line from +// P0 = (x0, y0) to P1 = (x1, y1) against a rectangle with +// diagonal from (xmin, ymin) to (xmax, ymax). +/** + * + * @param {CanvasRenderingContext2D} context + */ +export function drawLineFastClipped(context, rect, { x0, y0, x1, y1, color = null, lineSize = 1 }) { + const xmin = rect.x; + const ymin = rect.y; + const xmax = rect.right(); + const ymax = rect.bottom(); + + // compute outcodes for P0, P1, and whatever point lies outside the clip rectangle + let outcode0 = computeOutCode(x0, y0, xmin, xmax, ymin, ymax); + let outcode1 = computeOutCode(x1, y1, xmin, xmax, ymin, ymax); + let accept = false; + + // eslint-disable-next-line no-constant-condition + while (true) { + if (!(outcode0 | outcode1)) { + // bitwise OR is 0: both points inside window; trivially accept and exit loop + accept = true; + break; + } else if (outcode0 & outcode1) { + // bitwise AND is not 0: both points share an outside zone (LEFT, RIGHT, TOP, + // or BOTTOM), so both must be outside window; exit loop (accept is false) + break; + } else { + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + let x, y; + + // At least one endpoint is outside the clip rectangle; pick it. + let outcodeOut = outcode0 ? outcode0 : outcode1; + + // Now find the intersection point; + // use formulas: + // slope = (y1 - y0) / (x1 - x0) + // x = x0 + (1 / slope) * (ym - y0), where ym is ymin or ymax + // y = y0 + slope * (xm - x0), where xm is xmin or xmax + // No need to worry about divide-by-zero because, in each case, the + // outcode bit being tested guarantees the denominator is non-zero + if (outcodeOut & TOP) { + // point is above the clip window + x = x0 + ((x1 - x0) * (ymax - y0)) / (y1 - y0); + y = ymax; + } else if (outcodeOut & BOTTOM) { + // point is below the clip window + x = x0 + ((x1 - x0) * (ymin - y0)) / (y1 - y0); + y = ymin; + } else if (outcodeOut & RIGHT) { + // point is to the right of clip window + y = y0 + ((y1 - y0) * (xmax - x0)) / (x1 - x0); + x = xmax; + } else if (outcodeOut & LEFT) { + // point is to the left of clip window + y = y0 + ((y1 - y0) * (xmin - x0)) / (x1 - x0); + x = xmin; + } + + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut == outcode0) { + x0 = x; + y0 = y; + outcode0 = computeOutCode(x0, y0, xmin, xmax, ymin, ymax); + } else { + x1 = x; + y1 = y; + outcode1 = computeOutCode(x1, y1, xmin, xmax, ymin, ymax); + } + } + } + if (accept) { + // Following functions are left for implementation by user based on + // their platform (OpenGL/graphics.h etc.) + // DrawRectangle(xmin, ymin, xmax, ymax); + // LineSegment(x0, y0, x1, y1); + drawLineFast(context, { + x1: x0, + y1: y0, + x2: x1, + y2: y1, + color, + lineSize, + }); + } +} + +/** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h, s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * + * @param {number} h The hue + * @param {number} s The saturation + * @param {number} l The lightness + * @return {Array} The RGB representation + */ +export function hslToRgb(h, s, l) { + let r; + let g; + let b; + + if (s === 0) { + r = g = b = l; // achromatic + } else { + // tslint:disable-next-line:no-shadowed-variable + const hue2rgb = function (p, q, t) { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1 / 6) { + return p + (q - p) * 6 * t; + } + if (t < 1 / 2) { + return q; + } + if (t < 2 / 3) { + return p + (q - p) * (2 / 3 - t) * 6; + } + return p; + }; + + let q = l < 0.5 ? l * (1 + s) : l + s - l * s; + let p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + + return [Math_round(r * 255), Math_round(g * 255), Math_round(b * 255)]; +} + +export function wrapText(context, text, x, y, maxWidth, lineHeight, stroke = false) { + var words = text.split(" "); + var line = ""; + + for (var n = 0; n < words.length; n++) { + var testLine = line + words[n] + " "; + var metrics = context.measureText(testLine); + var testWidth = metrics.width; + if (testWidth > maxWidth && n > 0) { + if (stroke) { + context.strokeText(line, x, y); + } else { + context.fillText(line, x, y); + } + line = words[n] + " "; + y += lineHeight; + } else { + line = testLine; + } + } + + if (stroke) { + context.strokeText(line, x, y); + } else { + context.fillText(line, x, y); + } +} + +/** + * Returns a rotated trapez, used for spotlight culling + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @param {number} leftHeight + * @param {number} angle + */ +export function rotateTrapezRightFaced(x, y, w, h, leftHeight, angle) { + const halfY = y + h / 2; + const points = [ + new Vector(x, halfY - leftHeight / 2), + new Vector(x + w, y), + new Vector(x, halfY + leftHeight / 2), + new Vector(x + w, y + h), + ]; + + return Rectangle.getAroundPointsRotated(points, angle); +} + +/** + * Converts values from 0 .. 255 to values like 07, 7f, 5d etc + * @param {number} value + * @returns {string} + */ +export function mapClampedColorValueToHex(value) { + const hex = "0123456789abcdef"; + return hex[Math_floor(value / 16)] + hex[value % 16]; +} + +/** + * Converts rgb to a hex string + * @param {number} r + * @param {number} g + * @param {number} b + * @returns {string} + */ +export function rgbToHex(r, g, b) { + return mapClampedColorValueToHex(r) + mapClampedColorValueToHex(g) + mapClampedColorValueToHex(b); +} diff --git a/src/js/core/error_handler.js b/src/js/core/error_handler.js new file mode 100644 index 00000000..bcb6fcf4 --- /dev/null +++ b/src/js/core/error_handler.js @@ -0,0 +1,126 @@ +import { logSection } from "./logging"; +import { stringifyObjectContainingErrors } from "./logging"; +import { removeAllChildren } from "./utils"; + +export let APPLICATION_ERROR_OCCURED = false; + +/** + * + * @param {Event|string} message + * @param {string} source + * @param {number} lineno + * @param {number} colno + * @param {Error} source + */ +function catchErrors(message, source, lineno, colno, error) { + let fullPayload = JSON.parse( + stringifyObjectContainingErrors({ + message, + source, + lineno, + colno, + error, + }) + ); + + if (("" + message).indexOf("Script error.") >= 0) { + console.warn("Thirdparty script error:", message); + return; + } + + if (("" + message).indexOf("NS_ERROR_FAILURE") >= 0) { + console.warn("Firefox NS_ERROR_FAILURE error:", message); + return; + } + + if (("" + message).indexOf("Cannot read property 'postMessage' of null") >= 0) { + console.warn("Safari can not read post message error:", message); + return; + } + + if (!G_IS_DEV && G_IS_BROWSER && ("" + source).indexOf("shapez.io") < 0) { + console.warn("Thirdparty error:", message); + return; + } + + console.log("\n\n\n⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️\n\n\n"); + console.log(" APPLICATION CRASHED "); + console.log("\n\n⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️\n\n\n"); + + logSection("APPLICATION CRASH", "#e53935"); + console.log("Error:", message, "->", error); + console.log("Payload:", fullPayload); + + if (window.Sentry && !window.anyModLoaded) { + window.Sentry.withScope(scope => { + window.Sentry.setTag("message", message); + window.Sentry.setTag("source", source); + + window.Sentry.setExtra("message", message); + window.Sentry.setExtra("source", source); + window.Sentry.setExtra("lineno", lineno); + window.Sentry.setExtra("colno", colno); + window.Sentry.setExtra("error", error); + window.Sentry.setExtra("fullPayload", fullPayload); + + try { + const userName = window.localStorage.getItem("tracking_context") || null; + window.Sentry.setTag("username", userName); + } catch (ex) { + // ignore + } + + window.Sentry.captureException(error || source); + }); + } + + if (APPLICATION_ERROR_OCCURED) { + console.warn("ERROR: Only showing and submitting first error"); + return; + } + + APPLICATION_ERROR_OCCURED = true; + const element = document.createElement("div"); + element.id = "applicationError"; + + const title = document.createElement("h1"); + title.innerText = "Whoops!"; + element.appendChild(title); + + const desc = document.createElement("div"); + desc.classList.add("desc"); + desc.innerHTML = ` + It seems the application crashed - I am sorry for that!

+ An anonymized crash report has been sent, and I will have a look as soon as possible.

+ If you have additional information how I can reproduce this error, please E-Mail me:  +
bugs@shapez.io`; + element.appendChild(desc); + + const details = document.createElement("pre"); + details.classList.add("details"); + details.innerText = (error && error.stack) || message; + element.appendChild(details); + + const inject = function () { + if (!G_IS_DEV) { + removeAllChildren(document.body); + } + if (document.body.parentElement) { + document.body.parentElement.appendChild(element); + } else { + document.body.appendChild(element); + } + }; + + if (document.body) { + inject(); + } else { + setTimeout(() => { + inject(); + }, 200); + } + + return true; +} + +window.onerror = catchErrors; diff --git a/src/js/core/explained_result.js b/src/js/core/explained_result.js new file mode 100644 index 00000000..11371129 --- /dev/null +++ b/src/js/core/explained_result.js @@ -0,0 +1,40 @@ +export class ExplainedResult { + constructor(result = true, reason = null, additionalProps = {}) { + /** @type {boolean} */ + this.result = result; + + /** @type {string} */ + this.reason = reason; + + // Copy additional props + for (const key in additionalProps) { + this[key] = additionalProps[key]; + } + } + + isGood() { + return !!this.result; + } + + isBad() { + return !this.result; + } + + static good() { + return new ExplainedResult(true); + } + + static bad(reason, additionalProps) { + return new ExplainedResult(false, reason, additionalProps); + } + + static requireAll(...args) { + for (let i = 0; i < args.length; ++i) { + const subResult = args[i].call(); + if (!subResult.isGood()) { + return subResult; + } + } + return this.good(); + } +} diff --git a/src/js/core/factory.js b/src/js/core/factory.js new file mode 100644 index 00000000..f2587f69 --- /dev/null +++ b/src/js/core/factory.js @@ -0,0 +1,81 @@ +import { createLogger } from "./logging"; + +const logger = createLogger("factory"); + +// simple factory pattern +export class Factory { + constructor(id) { + this.id = id; + + // Store array as well as dictionary, to speed up lookups + this.entries = []; + this.entryIds = []; + this.idToEntry = {}; + } + + getId() { + return this.id; + } + + register(entry) { + // Extract id + const id = entry.getId(); + assert(id, "Factory: Invalid id for class: " + entry); + + // Check duplicates + assert(!this.idToEntry[id], "Duplicate factory entry for " + id); + + // Insert + this.entries.push(entry); + this.entryIds.push(id); + this.idToEntry[id] = entry; + } + + /** + * Checks if a given id is registered + * @param {string} id + * @returns {boolean} + */ + hasId(id) { + return !!this.idToEntry[id]; + } + + /** + * Finds an instance by a given id + * @param {string} id + * @returns {object} + */ + findById(id) { + const entry = this.idToEntry[id]; + if (!entry) { + logger.error("Object with id", id, "is not registered on factory", this.id, "!"); + assert(false, "Factory: Object with id '" + id + "' is not registered!"); + return null; + } + return entry; + } + + /** + * Returns all entries + * @returns {Array} + */ + getEntries() { + return this.entries; + } + + /** + * Returns all registered ids + * @returns {Array} + */ + getAllIds() { + return this.entryIds; + } + + /** + * Returns amount of stored entries + * @returns {number} + */ + getNumEntries() { + return this.entries.length; + } +} diff --git a/src/js/core/game_state.js b/src/js/core/game_state.js new file mode 100644 index 00000000..81744089 --- /dev/null +++ b/src/js/core/game_state.js @@ -0,0 +1,365 @@ +/* typehints:start */ +import { Application } from "../application"; +import { StateManager } from "./state_manager"; +/* typehints:end */ + +import { globalConfig } from "./config"; +import { ClickDetector } from "./click_detector"; +import { logSection, createLogger } from "./logging"; +import { InputReceiver } from "./input_receiver"; +import { waitNextFrame } from "./utils"; +import { RequestChannel } from "./request_channel"; +import { MUSIC } from "../platform/sound"; + +const logger = createLogger("game_state"); + +/** + * Basic state of the game state machine. This is the base of the whole game + */ +export class GameState { + /** + * Constructs a new state with the given id + * @param {string} key The id of the state. We use ids to refer to states because otherwise we get + * circular references + */ + constructor(key) { + this.key = key; + + /** @type {StateManager} */ + this.stateManager = null; + + /** @type {Application} */ + this.app = null; + + // Store if we are currently fading out + this.fadingOut = false; + + /** @type {Array} */ + this.clickDetectors = []; + + // Every state captures keyboard events by default + this.inputReciever = new InputReceiver("state-" + key); + this.inputReciever.backButton.add(this.onBackButton, this); + + // A channel we can use to perform async ops + this.asyncChannel = new RequestChannel(); + } + + //// GETTERS / HELPER METHODS //// + + /** + * Returns the states key + * @returns {string} + */ + getKey() { + return this.key; + } + + /** + * Returns the html element of the state + * @returns {HTMLElement} + */ + getDivElement() { + return document.getElementById("state_" + this.key); + } + + /** + * Transfers to a new state + * @param {string} stateKey The id of the new state + */ + moveToState(stateKey, payload = {}, skipFadeOut = false) { + if (this.fadingOut) { + logger.warn("Skipping move to '" + stateKey + "' since already fading out"); + return; + } + + // Clean up event listeners + this.internalCleanUpClickDetectors(); + + // Fading + const fadeTime = this.internalGetFadeInOutTime(); + const doFade = !skipFadeOut && this.getHasFadeOut() && fadeTime !== 0; + logger.log("Moving to", stateKey, "(fading=", doFade, ")"); + if (doFade) { + this.htmlElement.classList.remove("arrived"); + this.fadingOut = true; + setTimeout(() => { + this.stateManager.moveToState(stateKey, payload); + }, fadeTime); + } else { + this.stateManager.moveToState(stateKey, payload); + } + } + + /** + * + * @param {string} nextStateId + * @param {object=} nextStatePayload + */ + watchAdAndMoveToState(nextStateId, nextStatePayload = {}) { + if (this.app.adProvider.getCanShowVideoAd() && this.app.isRenderable()) { + this.moveToState( + "WatchAdState", + { + nextStateId, + nextStatePayload, + }, + true + ); + } else { + this.moveToState(nextStateId, nextStatePayload); + } + } + + /** + * Tracks clicks on a given element and calls the given callback *on this state*. + * If you want to call another function wrap it inside a lambda. + * @param {Element} element The element to track clicks on + * @param {function():void} handler The handler to call + * @param {import("./click_detector").ClickDetectorConstructorArgs=} args Click detector arguments + */ + trackClicks(element, handler, args = {}) { + const detector = new ClickDetector(element, args); + detector.click.add(handler, this); + if (G_IS_DEV) { + // Append a source so we can check where the click detector is from + // @ts-ignore + detector._src = "state-" + this.key; + } + this.clickDetectors.push(detector); + } + + /** + * Cancels all promises on the api as well as our async channel + */ + cancelAllAsyncOperations() { + this.asyncChannel.cancelAll(); + // TODO + // this.app.api.cancelRequests(); + } + + //// CALLBACKS //// + + /** + * Callback when entering the state, to be overriddemn + * @param {any} payload Arbitrary data passed from the state which we are transferring from + */ + onEnter(payload) {} + + /** + * Callback when leaving the state + */ + onLeave() {} + + /** + * Callback before leaving the game state or when the page is unloaded + */ + onBeforeExit() {} + + /** + * Callback when the app got paused (on android, this means in background) + */ + onAppPause() {} + + /** + * Callback when the app got resumed (on android, this means in foreground again) + */ + onAppResume() {} + + /** + * Render callback + * @param {number} dt Delta time in ms since last render + */ + onRender(dt) {} + + /** + * Background tick callback, called while the game is inactiev + * @param {number} dt Delta time in ms since last tick + */ + onBackgroundTick(dt) {} + + /** + * Called when the screen resized + * @param {number} w window/screen width + * @param {number} h window/screen height + */ + onResized(w, h) {} + + /** + * Internal backbutton handler, called when the hardware back button is pressed or + * the escape key is pressed + */ + onBackButton() {} + + //// INTERFACE //// + + /** + * Should return how many mulliseconds to fade in / out the state. Not recommended to override! + * @returns {number} Time in milliseconds to fade out + */ + getInOutFadeTime() { + if (globalConfig.debug.noArtificialDelays) { + return 0; + } + return 200; + } + + /** + * Should return whether to fade in the game state. This will then apply the right css classes + * for the fadein. + * @returns {boolean} + */ + getHasFadeIn() { + return true; + } + + /** + * Should return whether to fade out the game state. This will then apply the right css classes + * for the fadeout and wait the delay before moving states + * @returns {boolean} + */ + getHasFadeOut() { + return true; + } + + /** + * Returns if this state should get paused if it does not have focus + * @returns {boolean} true to pause the updating of the game + */ + getPauseOnFocusLost() { + return true; + } + + /** + * Should return the html code of the state. + * @returns {string} + */ + getInnerHTML() { + abstract; + return ""; + } + + /** + * Returns if the state has an unload confirmation, this is the + * "Are you sure you want to leave the page" message. + */ + getHasUnloadConfirmation() { + return false; + } + + /** + * Should return the theme music for this state + * @returns {string|null} + */ + getThemeMusic() { + return MUSIC.mainMenu; + } + + //////////////////// + + //// INTERNAL //// + + /** + * Internal callback from the manager. Do not override! + * @param {StateManager} stateManager + */ + internalRegisterCallback(stateManager, app) { + assert(stateManager, "No state manager"); + assert(app, "No app"); + this.stateManager = stateManager; + this.app = app; + } + + /** + * Internal callback when entering the state. Do not override! + * @param {any} payload Arbitrary data passed from the state which we are transferring from + * @param {boolean} callCallback Whether to call the onEnter callback + */ + internalEnterCallback(payload, callCallback = true) { + logSection(this.key, "#26a69a"); + this.app.inputMgr.pushReciever(this.inputReciever); + + this.htmlElement = this.getDivElement(); + this.htmlElement.classList.add("active"); + + // Apply classes in the next frame so the css transition keeps up + waitNextFrame().then(() => { + if (this.htmlElement) { + this.htmlElement.classList.remove("fadingOut"); + this.htmlElement.classList.remove("fadingIn"); + } + }); + + // Call handler + if (callCallback) { + this.onEnter(payload); + } + } + + /** + * Internal callback when the state is left. Do not override! + */ + internalLeaveCallback() { + this.onLeave(); + + this.htmlElement.classList.remove("active"); + this.app.inputMgr.popReciever(this.inputReciever); + this.internalCleanUpClickDetectors(); + this.asyncChannel.cancelAll(); + } + + /** + * Internal callback *before* the state is left. Also is called on page unload + */ + internalOnBeforeExitCallback() { + this.onBeforeExit(); + } + + /** + * Internal app pause callback + */ + internalOnAppPauseCallback() { + this.onAppPause(); + } + + /** + * Internal app resume callback + */ + internalOnAppResumeCallback() { + this.onAppResume(); + } + + /** + * Cleans up all click detectors + */ + internalCleanUpClickDetectors() { + if (this.clickDetectors) { + for (let i = 0; i < this.clickDetectors.length; ++i) { + this.clickDetectors[i].cleanup(); + } + this.clickDetectors = []; + } + } + + /** + * Internal method to get the HTML of the game state. + * @returns {string} + */ + internalGetFullHtml() { + return this.getInnerHTML(); + } + + /** + * Internal method to compute the time to fade in / out + * @returns {number} time to fade in / out in ms + */ + internalGetFadeInOutTime() { + if (G_IS_DEV && globalConfig.debug.fastGameEnter) { + return 1; + } + if (G_IS_DEV && globalConfig.debug.noArtificialDelays) { + return 1; + } + return this.getInOutFadeTime(); + } +} diff --git a/src/js/core/global_registries.js b/src/js/core/global_registries.js new file mode 100644 index 00000000..321732e0 --- /dev/null +++ b/src/js/core/global_registries.js @@ -0,0 +1,35 @@ +import { SingletonFactory } from "./singleton_factory"; +import { Factory } from "./factory"; + +/* typehints:start */ +import { BaseGameSpeed } from "../game/time/base_game_speed"; +import { Component } from "../game/component"; +import { BaseItem } from "../game/base_item"; +import { MetaBuilding } from "../game/meta_building"; +/* typehints:end */ + +// These factories are here to remove circular dependencies + +/** @type {SingletonFactoryTemplate} */ +export let gMetaBuildingRegistry = new SingletonFactory(); + +/** @type {Object.>} */ +export let gBuildingsByCategory = null; + +/** @type {FactoryTemplate} */ +export let gComponentRegistry = new Factory("component"); + +/** @type {FactoryTemplate} */ +export let gGameSpeedRegistry = new Factory("gamespeed"); + +/** @type {FactoryTemplate} */ +export let gItemRegistry = new Factory("item"); + +// Helpers + +/** + * @param {Object.>} buildings + */ +export function initBuildingsByCategory(buildings) { + gBuildingsByCategory = buildings; +} diff --git a/src/js/core/globals.js b/src/js/core/globals.js new file mode 100644 index 00000000..15197880 --- /dev/null +++ b/src/js/core/globals.js @@ -0,0 +1,17 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +/** + * Used for the bug reporter, and the click detector which both have no handles to this. + * It would be nicer to have no globals, but this is the only one. I promise! + * @type {Application} */ +export let GLOBAL_APP = null; + +/** + * @param {Application} app + */ +export function setGlobalApp(app) { + assert(!GLOBAL_APP, "Create application twice!"); + GLOBAL_APP = app; +} diff --git a/src/js/core/input_distributor.js b/src/js/core/input_distributor.js new file mode 100644 index 00000000..668cdcec --- /dev/null +++ b/src/js/core/input_distributor.js @@ -0,0 +1,235 @@ +/* typehints:start */ +import { Application } from "../application"; +import { InputReceiver } from "./input_receiver"; +/* typehints:end */ + +import { Signal, STOP_PROPAGATION } from "./signal"; +import { createLogger } from "./logging"; +import { arrayDeleteValue, fastArrayDeleteValue } from "./utils"; + +const logger = createLogger("input_distributor"); + +export class InputDistributor { + /** + * + * @param {Application} app + */ + constructor(app) { + this.app = app; + + /** @type {Array} */ + this.recieverStack = []; + + /** @type {Array} */ + this.filters = []; + + this.shiftIsDown = false; + this.altIsDown = false; + + this.bindToEvents(); + } + + /** + * Attaches a new filter which can filter and reject events + * @param {function(any): boolean} filter + */ + installFilter(filter) { + this.filters.push(filter); + } + + /** + * Removes an attached filter + * @param {function(any) : boolean} filter + */ + dismountFilter(filter) { + fastArrayDeleteValue(this.filters, filter); + } + + /** + * @param {InputReceiver} reciever + */ + pushReciever(reciever) { + if (this.isRecieverAttached(reciever)) { + assert(false, "Can not add reciever " + reciever.context + " twice"); + logger.error("Can not add reciever", reciever.context, "twice"); + return; + } + this.recieverStack.push(reciever); + + if (this.recieverStack.length > 10) { + logger.error( + "Reciever stack is huge, probably some dead receivers arround:", + this.recieverStack.map(x => x.context) + ); + } + } + + /** + * @param {InputReceiver} reciever + */ + popReciever(reciever) { + if (this.recieverStack.indexOf(reciever) < 0) { + assert(false, "Can not pop reciever " + reciever.context + " since its not contained"); + logger.error("Can not pop reciever", reciever.context, "since its not contained"); + return; + } + if (this.recieverStack[this.recieverStack.length - 1] !== reciever) { + logger.warn( + "Popping reciever", + reciever.context, + "which is not on top of the stack. Stack is: ", + this.recieverStack.map(x => x.context) + ); + } + arrayDeleteValue(this.recieverStack, reciever); + } + + /** + * @param {InputReceiver} reciever + */ + isRecieverAttached(reciever) { + return this.recieverStack.indexOf(reciever) >= 0; + } + + /** + * @param {InputReceiver} reciever + */ + isRecieverOnTop(reciever) { + return ( + this.isRecieverAttached(reciever) && + this.recieverStack[this.recieverStack.length - 1] === reciever + ); + } + + /** + * @param {InputReceiver} reciever + */ + makeSureAttachedAndOnTop(reciever) { + this.makeSureDetached(reciever); + this.pushReciever(reciever); + } + + /** + * @param {InputReceiver} reciever + */ + makeSureDetached(reciever) { + if (this.isRecieverAttached(reciever)) { + arrayDeleteValue(this.recieverStack, reciever); + } + } + + /** + * + * @param {InputReceiver} reciever + */ + destroyReceiver(reciever) { + this.makeSureDetached(reciever); + reciever.cleanup(); + } + + // Internal + + getTopReciever() { + if (this.recieverStack.length > 0) { + return this.recieverStack[this.recieverStack.length - 1]; + } + return null; + } + + bindToEvents() { + window.addEventListener("popstate", this.handleBackButton.bind(this), false); + document.addEventListener("backbutton", this.handleBackButton.bind(this), false); + window.addEventListener("keydown", this.handleKeydown.bind(this)); + window.addEventListener("keyup", this.handleKeyup.bind(this)); + window.addEventListener("blur", this.handleBlur.bind(this)); + } + + forwardToReceiver(eventId, payload = null) { + // Check filters + for (let i = 0; i < this.filters.length; ++i) { + if (!this.filters[i](eventId)) { + return STOP_PROPAGATION; + } + } + + const reciever = this.getTopReciever(); + if (!reciever) { + logger.warn("Dismissing event because not reciever was found:", eventId); + return; + } + const signal = reciever[eventId]; + assert(signal instanceof Signal, "Not a valid event id"); + return signal.dispatch(payload); + } + + /** + * @param {Event} event + */ + handleBackButton(event) { + event.preventDefault(); + event.stopPropagation(); + this.forwardToReceiver("backButton"); + } + + /** + * Handles when the page got blurred + */ + handleBlur() { + this.shiftIsDown = false; + this.forwardToReceiver("pageBlur", {}); + this.forwardToReceiver("shiftUp", {}); + } + + /** + * @param {KeyboardEvent} event + */ + handleKeydown(event) { + if (event.keyCode === 16) { + this.shiftIsDown = true; + } + + if ( + // TAB + event.keyCode === 9 || + // F1 - F10 + (event.keyCode >= 112 && event.keyCode < 122 && !G_IS_DEV) + ) { + event.preventDefault(); + } + + if ( + this.forwardToReceiver("keydown", { + keyCode: event.keyCode, + shift: event.shiftKey, + alt: event.altKey, + event, + }) === STOP_PROPAGATION + ) { + return; + } + + const code = event.keyCode; + if (code === 27) { + // Escape key + event.preventDefault(); + event.stopPropagation(); + return this.forwardToReceiver("backButton"); + } + } + + /** + * @param {KeyboardEvent} event + */ + handleKeyup(event) { + if (event.keyCode === 16) { + this.shiftIsDown = false; + this.forwardToReceiver("shiftUp", {}); + } + + this.forwardToReceiver("keyup", { + keyCode: event.keyCode, + shift: event.shiftKey, + alt: event.altKey, + }); + } +} diff --git a/src/js/core/input_receiver.js b/src/js/core/input_receiver.js new file mode 100644 index 00000000..f2fdf32f --- /dev/null +++ b/src/js/core/input_receiver.js @@ -0,0 +1,25 @@ +import { Signal } from "./signal"; + +export class InputReceiver { + constructor(context = "unknown") { + this.context = context; + + this.backButton = new Signal(); + + this.keydown = new Signal(); + this.keyup = new Signal(); + this.pageBlur = new Signal(); + this.shiftUp = new Signal(); + + // Dispatched on destroy + this.destroyed = new Signal(); + } + + cleanup() { + this.backButton.removeAll(); + this.keydown.removeAll(); + this.keyup.removeAll(); + + this.destroyed.dispatch(); + } +} diff --git a/src/js/core/loader.js b/src/js/core/loader.js new file mode 100644 index 00000000..5c8e17ec --- /dev/null +++ b/src/js/core/loader.js @@ -0,0 +1,243 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +import { AtlasDefinition } from "./atlas_definitions"; +import { makeOffscreenBuffer } from "./buffer_utils"; +import { AtlasSprite, BaseSprite, RegularSprite, SpriteAtlasLink } from "./sprites"; +import { cachebust } from "./cachebust"; +import { createLogger } from "./logging"; + +const logger = createLogger("loader"); + +const missingSpriteIds = {}; + +class LoaderImpl { + constructor() { + /** @type {Application} */ + this.app = null; + + /** @type {Map} */ + this.sprites = new Map(); + + this.rawImages = []; + } + + linkAppAfterBoot(app) { + this.app = app; + this.makeSpriteNotFoundCanvas(); + } + + /** + * Fetches a given sprite from the cache + * @param {string} key + * @returns {BaseSprite} + */ + getSpriteInternal(key) { + const sprite = this.sprites.get(key); + if (!sprite) { + if (!missingSpriteIds[key]) { + // Only show error once + missingSpriteIds[key] = true; + logger.error("Sprite '" + key + "' not found!"); + } + return this.spriteNotFoundSprite; + } + return sprite; + } + + /** + * Returns an atlas sprite from the cache + * @param {string} key + * @returns {AtlasSprite} + */ + getSprite(key) { + const sprite = this.getSpriteInternal(key); + assert(sprite instanceof AtlasSprite || sprite === this.spriteNotFoundSprite, "Not an atlas sprite"); + return /** @type {AtlasSprite} */ (sprite); + } + + /** + * Retursn a regular sprite from the cache + * @param {string} key + * @returns {RegularSprite} + */ + getRegularSprite(key) { + const sprite = this.getSpriteInternal(key); + assert( + sprite instanceof RegularSprite || sprite === this.spriteNotFoundSprite, + "Not a regular sprite" + ); + return /** @type {RegularSprite} */ (sprite); + } + + /** + * + * @param {string} key + * @returns {Promise} + */ + internalPreloadImage(key) { + const url = cachebust("res/" + key); + const image = new Image(); + + let triesSoFar = 0; + + return Promise.race([ + new Promise((resolve, reject) => { + setTimeout(reject, G_IS_DEV ? 3000 : 60000); + }), + + new Promise(resolve => { + image.onload = () => { + image.onerror = null; + image.onload = null; + + if (typeof image.decode === "function") { + // SAFARI: Image.decode() fails on safari with svgs -> we dont want to fail + // on that + // FIREFOX: Decode never returns if the image is in cache, so call it in background + image.decode().then( + () => null, + () => null + ); + } + resolve(image); + }; + + image.onerror = reason => { + logger.warn("Failed to load '" + url + "':", reason); + if (++triesSoFar < 4) { + logger.log("Retrying to load image from", url); + image.src = url + "?try=" + triesSoFar; + } else { + logger.warn("Failed to load", url, "after", triesSoFar, "tries with reason", reason); + image.onerror = null; + image.onload = null; + resolve(null); + } + }; + + image.src = url; + }), + ]); + } + + /** + * Preloads a sprite + * @param {string} key + * @returns {Promise} + */ + preloadCSSSprite(key) { + return this.internalPreloadImage(key).then(image => { + if (key.indexOf("game_misc") >= 0) { + // Allow access to regular sprites + this.sprites.set(key, new RegularSprite(image, image.width, image.height)); + } + this.rawImages.push(image); + }); + } + + /** + * Preloads an atlas + * @param {AtlasDefinition} atlas + * @returns {Promise} + */ + preloadAtlas(atlas) { + return this.internalPreloadImage(atlas.getFullSourcePath()).then(image => { + // @ts-ignore + image.label = atlas.sourceFileName; + return this.internalParseAtlas(atlas, image); + }); + } + + /** + * + * @param {AtlasDefinition} atlas + * @param {HTMLImageElement} loadedImage + */ + internalParseAtlas(atlas, loadedImage) { + this.rawImages.push(loadedImage); + + for (const spriteKey in atlas.sourceData) { + const spriteData = atlas.sourceData[spriteKey]; + + let sprite = /** @type {AtlasSprite} */ (this.sprites.get(spriteKey)); + + if (!sprite) { + sprite = new AtlasSprite({ + spriteName: spriteKey, + }); + this.sprites.set(spriteKey, sprite); + } + + const link = new SpriteAtlasLink({ + packedX: spriteData.frame.x, + packedY: spriteData.frame.y, + packedW: spriteData.frame.w, + packedH: spriteData.frame.h, + packOffsetX: spriteData.spriteSourceSize.x, + packOffsetY: spriteData.spriteSourceSize.y, + atlas: loadedImage, + w: spriteData.sourceSize.w, + h: spriteData.sourceSize.h, + }); + sprite.linksByResolution[atlas.meta.scale] = link; + } + } + + /** + * Creates the links for the sprites after the atlas has been loaded. Used so we + * don't have to store duplicate sprites. + */ + createAtlasLinks() { + // NOT USED + } + + /** + * Makes the canvas which shows the question mark, shown when a sprite was not found + */ + makeSpriteNotFoundCanvas() { + const dims = 128; + + const [canvas, context] = makeOffscreenBuffer(dims, dims, { + smooth: false, + label: "not-found-sprite", + }); + context.fillStyle = "#f77"; + context.fillRect(0, 0, dims, dims); + + context.textAlign = "center"; + context.textBaseline = "middle"; + context.fillStyle = "#eee"; + context.font = "25px Arial"; + context.fillText("???", dims / 2, dims / 2); + + // TODO: Not sure why this is set here + // @ts-ignore + canvas.src = "not-found"; + + const resolutions = ["0.1", "0.25", "0.5", "0.75", "1"]; + const sprite = new AtlasSprite({ + spriteName: "not-found", + }); + + for (let i = 0; i < resolutions.length; ++i) { + const res = resolutions[i]; + const link = new SpriteAtlasLink({ + packedX: 0, + packedY: 0, + w: dims, + h: dims, + packOffsetX: 0, + packOffsetY: 0, + packedW: dims, + packedH: dims, + atlas: canvas, + }); + sprite.linksByResolution[res] = link; + } + this.spriteNotFoundSprite = sprite; + } +} + +export const Loader = new LoaderImpl(); diff --git a/src/js/core/logging.js b/src/js/core/logging.js new file mode 100644 index 00000000..e84d4159 --- /dev/null +++ b/src/js/core/logging.js @@ -0,0 +1,249 @@ +import { globalConfig } from "../core/config"; +import { Math_floor, performanceNow } from "./builtins"; + +const circularJson = require("circular-json"); + +/* +Logging functions +- To be extended +*/ + +/** + * Base logger class + */ +class Logger { + constructor(context) { + this.context = context; + } + + debug(...args) { + globalDebug(this.context, ...args); + } + + log(...args) { + globalLog(this.context, ...args); + } + + warn(...args) { + globalWarn(this.context, ...args); + } + + error(...args) { + globalError(this.context, ...args); + } +} + +export function createLogger(context) { + return new Logger(context); +} + +function prepareObjectForLogging(obj, maxDepth = 1) { + if (!window.Sentry) { + // Not required without sentry + return obj; + } + + if (typeof obj !== "object" && !Array.isArray(obj)) { + return obj; + } + const result = {}; + for (const key in obj) { + const val = obj[key]; + + if (typeof val === "object") { + if (maxDepth > 0) { + result[key] = prepareObjectForLogging(val, maxDepth - 1); + } else { + result[key] = "[object]"; + } + } else { + result[key] = val; + } + } + return result; +} + +/** + * Serializes an error + * @param {Error|ErrorEvent} err + */ +export function serializeError(err) { + if (!err) { + return null; + } + const result = { + type: err.constructor.name, + }; + + if (err instanceof Error) { + result.message = err.message; + result.name = err.name; + result.stack = err.stack; + result.type = "{type.Error}"; + } else if (err instanceof ErrorEvent) { + result.filename = err.filename; + result.message = err.message; + result.lineno = err.lineno; + result.colno = err.colno; + result.type = "{type.ErrorEvent}"; + + if (err.error) { + result.error = serializeError(err.error); + } else { + result.error = "{not-provided}"; + } + } else { + result.type = "{unkown-type:" + typeof err + "}"; + } + + return result; +} + +/** + * Serializes an event + * @param {Event} event + */ +function serializeEvent(event) { + let result = { + type: "{type.Event:" + typeof event + "}", + }; + result.eventType = event.type; + return result; +} + +/** + * Prepares a json payload + * @param {string} key + * @param {any} value + */ +function preparePayload(key, value) { + if (value instanceof Error || value instanceof ErrorEvent) { + return serializeError(value); + } + if (value instanceof Event) { + return serializeEvent(value); + } + if (typeof value === "undefined") { + return null; + } + return value; +} + +/** + * Stringifies an object containing circular references and errors + * @param {any} payload + */ +export function stringifyObjectContainingErrors(payload) { + return circularJson.stringify(payload, preparePayload); +} + +export function globalDebug(context, ...args) { + if (G_IS_DEV) { + logInternal(context, console.log, prepareArgsForLogging(args)); + } +} + +export function globalLog(context, ...args) { + // eslint-disable-next-line no-console + logInternal(context, console.log, prepareArgsForLogging(args)); +} + +export function globalWarn(context, ...args) { + // eslint-disable-next-line no-console + logInternal(context, console.warn, prepareArgsForLogging(args)); +} + +export function globalError(context, ...args) { + args = prepareArgsForLogging(args); + // eslint-disable-next-line no-console + logInternal(context, console.error, args); + + if (window.Sentry) { + window.Sentry.withScope(scope => { + scope.setExtra("args", args); + window.Sentry.captureMessage(internalBuildStringFromArgs(args), "error"); + }); + } +} + +function prepareArgsForLogging(args) { + let result = []; + for (let i = 0; i < args.length; ++i) { + result.push(prepareObjectForLogging(args[i])); + } + return result; +} + +/** + * @param {Array} args + */ +function internalBuildStringFromArgs(args) { + let result = []; + + for (let i = 0; i < args.length; ++i) { + let arg = args[i]; + if ( + typeof arg === "string" || + typeof arg === "number" || + typeof arg === "boolean" || + arg === null || + arg === undefined + ) { + result.push("" + arg); + } else if (arg instanceof Error) { + result.push(arg.message); + } else { + result.push("[object]"); + } + } + return result.join(" "); +} + +export function logSection(name, color) { + while (name.length <= 14) { + name = " " + name + " "; + } + name = name.padEnd(19, " "); + + const lineCss = + "letter-spacing: -3px; color: " + color + "; font-size: 6px; background: #eee; color: #eee;"; + const line = "%c----------------------------"; + console.log("\n" + line + " %c" + name + " " + line + "\n", lineCss, "color: " + color, lineCss); +} + +function extractHandleContext(handle) { + let context = handle || "unknown"; + if (handle && handle.constructor && handle.constructor.name) { + context = handle.constructor.name; + if (context === "String") { + context = handle; + } + } + + if (handle && handle.name) { + context = handle.name; + } + return context + ""; +} + +function logInternal(handle, consoleMethod, args) { + const context = extractHandleContext(handle).padEnd(20, " "); + const labelColor = handle && handle.LOG_LABEL_COLOR ? handle.LOG_LABEL_COLOR : "#aaa"; + + if (G_IS_DEV && globalConfig.debug.logTimestamps) { + const timestamp = "⏱ %c" + (Math_floor(performanceNow()) + "").padEnd(6, " ") + ""; + consoleMethod.call( + console, + timestamp + " %c" + context, + "color: #7f7;", + "color: " + labelColor + ";", + ...args + ); + } else { + if (G_IS_DEV && !globalConfig.debug.disableLoggingLogSources) { + consoleMethod.call(console, "%c" + context, "color: " + labelColor, ...args); + } else { + consoleMethod.call(console, ...args); + } + } +} diff --git a/src/js/core/lzstring.js b/src/js/core/lzstring.js new file mode 100644 index 00000000..79d0523c --- /dev/null +++ b/src/js/core/lzstring.js @@ -0,0 +1,493 @@ +// Copyright (c) 2013 Pieroxy +// This work is free. You can redistribute it and/or modify it +// under the terms of the WTFPL, Version 2 +// For more information see LICENSE.txt or http://www.wtfpl.net/ +// +// For more information, the home page: +// http://pieroxy.net/blog/pages/lz-string/testing.html +// +// LZ-based compression algorithm, version 1.4.4 + +const fromCharCode = String.fromCharCode; +const hasOwnProperty = Object.prototype.hasOwnProperty; + +const keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$"; +const baseReverseDic = {}; + +function getBaseValue(alphabet, character) { + if (!baseReverseDic[alphabet]) { + baseReverseDic[alphabet] = {}; + for (let i = 0; i < alphabet.length; i++) { + baseReverseDic[alphabet][alphabet.charAt(i)] = i; + } + } + return baseReverseDic[alphabet][character]; +} + +//compress into uint8array (UCS-2 big endian format) +export function compressU8(uncompressed) { + let compressed = compress(uncompressed); + let buf = new Uint8Array(compressed.length * 2); // 2 bytes per character + + for (let i = 0, TotalLen = compressed.length; i < TotalLen; i++) { + let current_value = compressed.charCodeAt(i); + buf[i * 2] = current_value >>> 8; + buf[i * 2 + 1] = current_value % 256; + } + return buf; +} + +// Compreses with header +/** + * @param {string} uncompressed + * @param {number} header + */ +export function compressU8WHeader(uncompressed, header) { + let compressed = compress(uncompressed); + let buf = new Uint8Array(2 + compressed.length * 2); // 2 bytes per character + + buf[0] = header >>> 8; + buf[1] = header % 256; + for (let i = 0, TotalLen = compressed.length; i < TotalLen; i++) { + let current_value = compressed.charCodeAt(i); + buf[2 + i * 2] = current_value >>> 8; + buf[2 + i * 2 + 1] = current_value % 256; + } + return buf; +} + +//decompress from uint8array (UCS-2 big endian format) +/** + * + * @param {Uint8Array} compressed + */ +export function decompressU8WHeader(compressed) { + // let buf = new Array(compressed.length / 2); // 2 bytes per character + // for (let i = 0, TotalLen = buf.length; i < TotalLen; i++) { + // buf[i] = compressed[i * 2] * 256 + compressed[i * 2 + 1]; + // } + + // let result = []; + // buf.forEach(function (c) { + // result.push(fromCharCode(c)); + // }); + let result = []; + for (let i = 2, n = compressed.length; i < n; i += 2) { + const code = compressed[i] * 256 + compressed[i + 1]; + result.push(fromCharCode(code)); + } + return decompress(result.join("")); +} + +//compress into a string that is already URI encoded +export function compressX64(input) { + if (input == null) return ""; + return _compress(input, 6, function (a) { + return keyStrUriSafe.charAt(a); + }); +} + +//decompress from an output of compressToEncodedURIComponent +export function decompressX64(input) { + if (input == null) return ""; + if (input == "") return null; + input = input.replace(/ /g, "+"); + return _decompress(input.length, 32, function (index) { + return getBaseValue(keyStrUriSafe, input.charAt(index)); + }); +} + +function compress(uncompressed) { + return _compress(uncompressed, 16, function (a) { + return fromCharCode(a); + }); +} + +function _compress(uncompressed, bitsPerChar, getCharFromInt) { + if (uncompressed == null) return ""; + let i, + value, + context_dictionary = {}, + context_dictionaryToCreate = {}, + context_c = "", + context_wc = "", + context_w = "", + context_enlargeIn = 2, // Compensate for the first entry which should not count + context_dictSize = 3, + context_numBits = 2, + context_data = [], + context_data_val = 0, + context_data_position = 0, + ii; + + for (ii = 0; ii < uncompressed.length; ii += 1) { + context_c = uncompressed.charAt(ii); + if (!hasOwnProperty.call(context_dictionary, context_c)) { + context_dictionary[context_c] = context_dictSize++; + context_dictionaryToCreate[context_c] = true; + } + + context_wc = context_w + context_c; + if (hasOwnProperty.call(context_dictionary, context_wc)) { + context_w = context_wc; + } else { + if (hasOwnProperty.call(context_dictionaryToCreate, context_w)) { + if (context_w.charCodeAt(0) < 256) { + for (i = 0; i < context_numBits; i++) { + context_data_val = context_data_val << 1; + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + } + value = context_w.charCodeAt(0); + for (i = 0; i < 8; i++) { + context_data_val = (context_data_val << 1) | (value & 1); + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = value >> 1; + } + } else { + value = 1; + for (i = 0; i < context_numBits; i++) { + context_data_val = (context_data_val << 1) | value; + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = 0; + } + value = context_w.charCodeAt(0); + for (i = 0; i < 16; i++) { + context_data_val = (context_data_val << 1) | (value & 1); + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = value >> 1; + } + } + context_enlargeIn--; + if (context_enlargeIn == 0) { + context_enlargeIn = Math.pow(2, context_numBits); + context_numBits++; + } + delete context_dictionaryToCreate[context_w]; + } else { + value = context_dictionary[context_w]; + for (i = 0; i < context_numBits; i++) { + context_data_val = (context_data_val << 1) | (value & 1); + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = value >> 1; + } + } + context_enlargeIn--; + if (context_enlargeIn == 0) { + context_enlargeIn = Math.pow(2, context_numBits); + context_numBits++; + } + // Add wc to the dictionary. + context_dictionary[context_wc] = context_dictSize++; + context_w = String(context_c); + } + } + + // Output the code for w. + if (context_w !== "") { + if (hasOwnProperty.call(context_dictionaryToCreate, context_w)) { + if (context_w.charCodeAt(0) < 256) { + for (i = 0; i < context_numBits; i++) { + context_data_val = context_data_val << 1; + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + } + value = context_w.charCodeAt(0); + for (i = 0; i < 8; i++) { + context_data_val = (context_data_val << 1) | (value & 1); + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = value >> 1; + } + } else { + value = 1; + for (i = 0; i < context_numBits; i++) { + context_data_val = (context_data_val << 1) | value; + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = 0; + } + value = context_w.charCodeAt(0); + for (i = 0; i < 16; i++) { + context_data_val = (context_data_val << 1) | (value & 1); + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = value >> 1; + } + } + context_enlargeIn--; + if (context_enlargeIn == 0) { + context_enlargeIn = Math.pow(2, context_numBits); + context_numBits++; + } + delete context_dictionaryToCreate[context_w]; + } else { + value = context_dictionary[context_w]; + for (i = 0; i < context_numBits; i++) { + context_data_val = (context_data_val << 1) | (value & 1); + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = value >> 1; + } + } + context_enlargeIn--; + if (context_enlargeIn == 0) { + context_enlargeIn = Math.pow(2, context_numBits); + context_numBits++; + } + } + + // Mark the end of the stream + value = 2; + for (i = 0; i < context_numBits; i++) { + context_data_val = (context_data_val << 1) | (value & 1); + if (context_data_position == bitsPerChar - 1) { + context_data_position = 0; + context_data.push(getCharFromInt(context_data_val)); + context_data_val = 0; + } else { + context_data_position++; + } + value = value >> 1; + } + + // Flush the last char + // eslint-disable-next-line no-constant-condition + while (true) { + context_data_val = context_data_val << 1; + if (context_data_position == bitsPerChar - 1) { + context_data.push(getCharFromInt(context_data_val)); + break; + } else context_data_position++; + } + return context_data.join(""); +} + +function decompress(compressed) { + if (compressed == null) return ""; + if (compressed == "") return null; + return _decompress(compressed.length, 32768, function (index) { + return compressed.charCodeAt(index); + }); +} + +function _decompress(length, resetValue, getNextValue) { + let dictionary = [], + next, + enlargeIn = 4, + dictSize = 4, + numBits = 3, + entry = "", + result = [], + i, + w, + bits, + resb, + maxpower, + power, + c, + data = { val: getNextValue(0), position: resetValue, index: 1 }; + + for (i = 0; i < 3; i += 1) { + dictionary[i] = i; + } + + bits = 0; + maxpower = Math.pow(2, 2); + power = 1; + while (power != maxpower) { + resb = data.val & data.position; + data.position >>= 1; + if (data.position == 0) { + data.position = resetValue; + data.val = getNextValue(data.index++); + } + bits |= (resb > 0 ? 1 : 0) * power; + power <<= 1; + } + + switch ((next = bits)) { + case 0: + bits = 0; + maxpower = Math.pow(2, 8); + power = 1; + while (power != maxpower) { + resb = data.val & data.position; + data.position >>= 1; + if (data.position == 0) { + data.position = resetValue; + data.val = getNextValue(data.index++); + } + bits |= (resb > 0 ? 1 : 0) * power; + power <<= 1; + } + c = fromCharCode(bits); + break; + case 1: + bits = 0; + maxpower = Math.pow(2, 16); + power = 1; + while (power != maxpower) { + resb = data.val & data.position; + data.position >>= 1; + if (data.position == 0) { + data.position = resetValue; + data.val = getNextValue(data.index++); + } + bits |= (resb > 0 ? 1 : 0) * power; + power <<= 1; + } + c = fromCharCode(bits); + break; + case 2: + return ""; + } + dictionary[3] = c; + w = c; + result.push(c); + + // eslint-disable-next-line no-constant-condition + while (true) { + if (data.index > length) { + return ""; + } + + bits = 0; + maxpower = Math.pow(2, numBits); + power = 1; + while (power != maxpower) { + resb = data.val & data.position; + data.position >>= 1; + if (data.position == 0) { + data.position = resetValue; + data.val = getNextValue(data.index++); + } + bits |= (resb > 0 ? 1 : 0) * power; + power <<= 1; + } + + switch ((c = bits)) { + case 0: + bits = 0; + maxpower = Math.pow(2, 8); + power = 1; + while (power != maxpower) { + resb = data.val & data.position; + data.position >>= 1; + if (data.position == 0) { + data.position = resetValue; + data.val = getNextValue(data.index++); + } + bits |= (resb > 0 ? 1 : 0) * power; + power <<= 1; + } + + dictionary[dictSize++] = fromCharCode(bits); + c = dictSize - 1; + enlargeIn--; + break; + case 1: + bits = 0; + maxpower = Math.pow(2, 16); + power = 1; + while (power != maxpower) { + resb = data.val & data.position; + data.position >>= 1; + if (data.position == 0) { + data.position = resetValue; + data.val = getNextValue(data.index++); + } + bits |= (resb > 0 ? 1 : 0) * power; + power <<= 1; + } + dictionary[dictSize++] = fromCharCode(bits); + c = dictSize - 1; + enlargeIn--; + break; + case 2: + return result.join(""); + } + + if (enlargeIn == 0) { + enlargeIn = Math.pow(2, numBits); + numBits++; + } + + if (dictionary[c]) { + // @ts-ignore + entry = dictionary[c]; + } else { + if (c === dictSize) { + entry = w + w.charAt(0); + } else { + return null; + } + } + result.push(entry); + + // Add w+entry[0] to the dictionary. + dictionary[dictSize++] = w + entry.charAt(0); + enlargeIn--; + + w = entry; + + if (enlargeIn == 0) { + enlargeIn = Math.pow(2, numBits); + numBits++; + } + } +} diff --git a/src/js/core/perlin_noise.js b/src/js/core/perlin_noise.js new file mode 100644 index 00000000..0cce61ed --- /dev/null +++ b/src/js/core/perlin_noise.js @@ -0,0 +1,175 @@ +import { perlinNoiseData } from "./perlin_noise_data"; +import { Math_sqrt } from "./builtins"; + +class Grad { + constructor(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + } + + dot2(x, y) { + return this.x * x + this.y * y; + } + + dot3(x, y, z) { + return this.x * x + this.y * y + this.z * z; + } +} + +function fade(t) { + return t * t * t * (t * (t * 6 - 15) + 10); +} + +function lerp(a, b, t) { + return (1 - t) * a + t * b; +} + +const F2 = 0.5 * (Math_sqrt(3) - 1); +const G2 = (3 - Math_sqrt(3)) / 6; + +const F3 = 1 / 3; +const G3 = 1 / 6; + +export class PerlinNoise { + constructor(seed) { + this.perm = new Array(512); + this.gradP = new Array(512); + this.grad3 = [ + new Grad(1, 1, 0), + new Grad(-1, 1, 0), + new Grad(1, -1, 0), + new Grad(-1, -1, 0), + new Grad(1, 0, 1), + new Grad(-1, 0, 1), + new Grad(1, 0, -1), + new Grad(-1, 0, -1), + new Grad(0, 1, 1), + new Grad(0, -1, 1), + new Grad(0, 1, -1), + new Grad(0, -1, -1), + ]; + + this.seed = seed; + this.initializeFromSeed(seed); + } + + initializeFromSeed(seed) { + const P = perlinNoiseData; + + if (seed > 0 && seed < 1) { + // Scale the seed out + seed *= 65536; + } + + seed = Math.floor(seed); + if (seed < 256) { + seed |= seed << 8; + } + + for (let i = 0; i < 256; i++) { + let v; + if (i & 1) { + v = P[i] ^ (seed & 255); + } else { + v = P[i] ^ ((seed >> 8) & 255); + } + + this.perm[i] = this.perm[i + 256] = v; + this.gradP[i] = this.gradP[i + 256] = this.grad3[v % 12]; + } + } + + /** + * 2d Perlin Noise + * @param {number} x + * @param {number} y + * @returns {number} + */ + computePerlin2(x, y) { + // Find unit grid cell containing point + let X = Math.floor(x), + Y = Math.floor(y); + + // Get relative xy coordinates of point within that cell + x = x - X; + y = y - Y; + + // Wrap the integer cells at 255 (smaller integer period can be introduced here) + X = X & 255; + Y = Y & 255; + + // Calculate noise contributions from each of the four corners + let n00 = this.gradP[X + this.perm[Y]].dot2(x, y); + let n01 = this.gradP[X + this.perm[Y + 1]].dot2(x, y - 1); + let n10 = this.gradP[X + 1 + this.perm[Y]].dot2(x - 1, y); + let n11 = this.gradP[X + 1 + this.perm[Y + 1]].dot2(x - 1, y - 1); + + // Compute the fade curve value for x + let u = fade(x); + + // Interpolate the four results + return lerp(lerp(n00, n10, u), lerp(n01, n11, u), fade(y)); + } + + computeSimplex2(xin, yin) { + var n0, n1, n2; // Noise contributions from the three corners + // Skew the input space to determine which simplex cell we're in + var s = (xin + yin) * F2; // Hairy factor for 2D + var i = Math.floor(xin + s); + var j = Math.floor(yin + s); + var t = (i + j) * G2; + var x0 = xin - i + t; // The x,y distances from the cell origin, unskewed. + var y0 = yin - j + t; + // For the 2D case, the simplex shape is an equilateral triangle. + // Determine which simplex we are in. + var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords + if (x0 > y0) { + // lower triangle, XY order: (0,0)->(1,0)->(1,1) + i1 = 1; + j1 = 0; + } else { + // upper triangle, YX order: (0,0)->(0,1)->(1,1) + i1 = 0; + j1 = 1; + } + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords + var y1 = y0 - j1 + G2; + var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords + var y2 = y0 - 1 + 2 * G2; + // Work out the hashed gradient indices of the three simplex corners + i &= 255; + j &= 255; + var gi0 = this.gradP[i + this.perm[j]]; + var gi1 = this.gradP[i + i1 + this.perm[j + j1]]; + var gi2 = this.gradP[i + 1 + this.perm[j + 1]]; + // Calculate the contribution from the three corners + var t0 = 0.5 - x0 * x0 - y0 * y0; + if (t0 < 0) { + n0 = 0; + } else { + t0 *= t0; + n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient + } + var t1 = 0.5 - x1 * x1 - y1 * y1; + if (t1 < 0) { + n1 = 0; + } else { + t1 *= t1; + n1 = t1 * t1 * gi1.dot2(x1, y1); + } + var t2 = 0.5 - x2 * x2 - y2 * y2; + if (t2 < 0) { + n2 = 0; + } else { + t2 *= t2; + n2 = t2 * t2 * gi2.dot2(x2, y2); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 70 * (n0 + n1 + n2); + } +} diff --git a/src/js/core/perlin_noise_data.js b/src/js/core/perlin_noise_data.js new file mode 100644 index 00000000..14a25ba0 --- /dev/null +++ b/src/js/core/perlin_noise_data.js @@ -0,0 +1,258 @@ +export const perlinNoiseData = [ + 151, + 160, + 137, + 91, + 90, + 15, + 131, + 13, + 201, + 95, + 96, + 53, + 194, + 233, + 7, + 225, + 140, + 36, + 103, + 30, + 69, + 142, + 8, + 99, + 37, + 240, + 21, + 10, + 23, + 190, + 6, + 148, + 247, + 120, + 234, + 75, + 0, + 26, + 197, + 62, + 94, + 252, + 219, + 203, + 117, + 35, + 11, + 32, + 57, + 177, + 33, + 88, + 237, + 149, + 56, + 87, + 174, + 20, + 125, + 136, + 171, + 168, + 68, + 175, + 74, + 165, + 71, + 134, + 139, + 48, + 27, + 166, + 77, + 146, + 158, + 231, + 83, + 111, + 229, + 122, + 60, + 211, + 133, + 230, + 220, + 105, + 92, + 41, + 55, + 46, + 245, + 40, + 244, + 102, + 143, + 54, + 65, + 25, + 63, + 161, + 1, + 216, + 80, + 73, + 209, + 76, + 132, + 187, + 208, + 89, + 18, + 169, + 200, + 196, + 135, + 130, + 116, + 188, + 159, + 86, + 164, + 100, + 109, + 198, + 173, + 186, + 3, + 64, + 52, + 217, + 226, + 250, + 124, + 123, + 5, + 202, + 38, + 147, + 118, + 126, + 255, + 82, + 85, + 212, + 207, + 206, + 59, + 227, + 47, + 16, + 58, + 17, + 182, + 189, + 28, + 42, + 223, + 183, + 170, + 213, + 119, + 248, + 152, + 2, + 44, + 154, + 163, + 70, + 221, + 153, + 101, + 155, + 167, + 43, + 172, + 9, + 129, + 22, + 39, + 253, + 19, + 98, + 108, + 110, + 79, + 113, + 224, + 232, + 178, + 185, + 112, + 104, + 218, + 246, + 97, + 228, + 251, + 34, + 242, + 193, + 238, + 210, + 144, + 12, + 191, + 179, + 162, + 241, + 81, + 51, + 145, + 235, + 249, + 14, + 239, + 107, + 49, + 192, + 214, + 31, + 181, + 199, + 106, + 157, + 184, + 84, + 204, + 176, + 115, + 121, + 50, + 45, + 127, + 4, + 150, + 254, + 138, + 236, + 205, + 93, + 222, + 114, + 67, + 29, + 24, + 72, + 243, + 141, + 128, + 195, + 78, + 66, + 215, + 61, + 156, + 180, +]; diff --git a/src/js/core/polyfills.js b/src/js/core/polyfills.js new file mode 100644 index 00000000..22688836 --- /dev/null +++ b/src/js/core/polyfills.js @@ -0,0 +1,69 @@ +function mathPolyfills() { + // Converts from degrees to radians. + Math.radians = function (degrees) { + return (degrees * Math_PI) / 180.0; + }; + + // Converts from radians to degrees. + Math.degrees = function (radians) { + return (radians * 180.0) / Math_PI; + }; +} + +function stringPolyfills() { + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart + if (!String.prototype.padStart) { + String.prototype.padStart = function padStart(targetLength, padString) { + targetLength = targetLength >> 0; //truncate if number, or convert non-number to 0; + padString = String(typeof padString !== "undefined" ? padString : " "); + if (this.length >= targetLength) { + return String(this); + } else { + targetLength = targetLength - this.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed + } + return padString.slice(0, targetLength) + String(this); + } + }; + } + + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd + if (!String.prototype.padEnd) { + String.prototype.padEnd = function padEnd(targetLength, padString) { + targetLength = targetLength >> 0; //floor if number or convert non-number to 0; + padString = String(typeof padString !== "undefined" ? padString : " "); + if (this.length > targetLength) { + return String(this); + } else { + targetLength = targetLength - this.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed + } + return String(this) + padString.slice(0, targetLength); + } + }; + } +} + +function initPolyfills() { + mathPolyfills(); + stringPolyfills(); +} + +function initExtensions() { + String.prototype.replaceAll = function (search, replacement) { + var target = this; + return target.split(search).join(replacement); + }; +} + +// Fetch polyfill +import "whatwg-fetch"; +import { Math_PI } from "./builtins"; + +// Other polyfills +initPolyfills(); +initExtensions(); diff --git a/src/js/core/query_parameters.js b/src/js/core/query_parameters.js new file mode 100644 index 00000000..b3dab1b3 --- /dev/null +++ b/src/js/core/query_parameters.js @@ -0,0 +1,10 @@ +const queryString = require("query-string"); +const options = queryString.parse(location.search); + +export let queryParamOptions = { + embedProvider: null, +}; + +if (options.embed) { + queryParamOptions.embedProvider = options.embed; +} diff --git a/src/js/core/read_write_proxy.js b/src/js/core/read_write_proxy.js new file mode 100644 index 00000000..07bf5667 --- /dev/null +++ b/src/js/core/read_write_proxy.js @@ -0,0 +1,300 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +import { sha1 } from "./sensitive_utils.encrypt"; +import { createLogger } from "./logging"; +import { FILE_NOT_FOUND } from "../platform/storage"; +import { accessNestedPropertyReverse } from "./utils"; +import { IS_DEBUG, globalConfig } from "./config"; +import { JSON_stringify, JSON_parse } from "./builtins"; +import { ExplainedResult } from "./explained_result"; +import { decompressX64, compressX64 } from ".//lzstring"; +import { asyncCompressor, compressionPrefix } from "./async_compression"; + +const logger = createLogger("read_write_proxy"); + +const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]); + +// Helper which only writes / reads if verify() works. Also performs migration +export class ReadWriteProxy { + constructor(app, filename) { + /** @type {Application} */ + this.app = app; + + this.filename = filename; + + /** @type {object} */ + this.currentData = null; + + // TODO: EXTREMELY HACKY! To verify we need to do this a step later + if (G_IS_DEV && IS_DEBUG) { + setTimeout(() => { + assert( + this.verify(this.getDefaultData()).result, + "Verify() failed for default data: " + this.verify(this.getDefaultData()).reason + ); + }); + } + } + + // -- Methods to override + + /** @returns {ExplainedResult} */ + verify(data) { + abstract; + return ExplainedResult.bad(); + } + + // Should return the default data + getDefaultData() { + abstract; + return {}; + } + + // Should return the current version as an integer + getCurrentVersion() { + abstract; + return 0; + } + + // Should migrate the data (Modify in place) + /** @returns {ExplainedResult} */ + migrate(data) { + abstract; + return ExplainedResult.bad(); + } + + // -- / Methods + + // Resets whole data, returns promise + resetEverythingAsync() { + logger.warn("Reset data to default"); + this.currentData = this.getDefaultData(); + return this.writeAsync(); + } + + getCurrentData() { + return this.currentData; + } + + /** + * Writes the data asychronously, fails if verify() fails + * @returns {Promise} + */ + writeAsync() { + const verifyResult = this.internalVerifyEntry(this.currentData); + + if (!verifyResult.result) { + logger.error("Tried to write invalid data to", this.filename, "reason:", verifyResult.reason); + return Promise.reject(verifyResult.reason); + } + const jsonString = JSON_stringify(this.currentData); + + if (!this.app.pageVisible || this.app.unloaded) { + logger.log("Saving file sync because in unload handler"); + const checksum = sha1(jsonString + salt); + let compressed = compressionPrefix + compressX64(checksum + jsonString); + if (G_IS_DEV && IS_DEBUG) { + compressed = jsonString; + } + + if (!this.app.storage.writeFileSyncIfSupported(this.filename, compressed)) { + return Promise.reject("Failed to write " + this.filename + " sync!"); + } else { + logger.log("📄 Wrote (sync!)", this.filename); + return Promise.resolve(compressed); + } + } + + return asyncCompressor + .compressFileAsync(jsonString) + .then(compressed => { + if (G_IS_DEV && IS_DEBUG) { + compressed = jsonString; + } + return this.app.storage.writeFileAsync(this.filename, compressed); + }) + .then(() => { + logger.log("📄 Wrote", this.filename); + return jsonString; + }) + .catch(err => { + logger.error("Failed to write", this.filename, ":", err); + throw err; + }); + } + + // Reads the data asynchronously, fails if verify() fails + readAsync() { + // Start read request + return ( + this.app.storage + .readFileAsync(this.filename) + + // Check for errors during read + .catch(err => { + if (err === FILE_NOT_FOUND) { + logger.log("File not found, using default data"); + + // File not found or unreadable, assume default file + return Promise.resolve(null); + } + + return Promise.reject("file-error: " + err); + }) + + // Decrypt data (if its encrypted) + // @ts-ignore + .then(rawData => { + if (rawData == null) { + // So, the file has not been found, use default data + return JSON_stringify(this.getDefaultData()); + } + + if (rawData.startsWith(compressionPrefix)) { + const decompressed = decompressX64(rawData.substr(compressionPrefix.length)); + if (!decompressed) { + // LZ string decompression failure + return Promise.reject("bad-content / decompression-failed"); + } + if (decompressed.length < 40) { + // String too short + return Promise.reject("bad-content / payload-too-small"); + } + + // Compare stored checksum with actual checksum + const checksum = decompressed.substring(0, 40); + const jsonString = decompressed.substr(40); + const desiredChecksum = sha1(jsonString + salt); + if (desiredChecksum !== checksum) { + // Checksum mismatch + return Promise.reject("bad-content / checksum-mismatch"); + } + return jsonString; + } else { + if (!G_IS_DEV) { + return Promise.reject("bad-content / missing-compression"); + } + } + return rawData; + }) + + // Parse JSON, this could throw but thats fine + .then(res => { + try { + return JSON_parse(res); + } catch (ex) { + logger.error( + "Failed to parse file content of", + this.filename, + ":", + ex, + "(content was:", + res, + ")" + ); + throw new Error("invalid-serialized-data"); + } + }) + + // Verify basic structure + .then(contents => { + const result = this.internalVerifyBasicStructure(contents); + if (!result.isGood()) { + return Promise.reject("verify-failed: " + result.reason); + } + return contents; + }) + + // Check version and migrate if required + .then(contents => { + if (contents.version > this.getCurrentVersion()) { + return Promise.reject("stored-data-is-newer"); + } + + if (contents.version < this.getCurrentVersion()) { + logger.log( + "Trying to migrate data object from version", + contents.version, + "to", + this.getCurrentVersion() + ); + const migrationResult = this.migrate(contents); // modify in place + if (migrationResult.isBad()) { + return Promise.reject("migration-failed: " + migrationResult.reason); + } + } + return contents; + }) + + // Verify + .then(contents => { + const verifyResult = this.internalVerifyEntry(contents); + if (!verifyResult.result) { + logger.error( + "Read invalid data from", + this.filename, + "reason:", + verifyResult.reason, + "contents:", + contents + ); + return Promise.reject("invalid-data: " + verifyResult.reason); + } + return contents; + }) + + // Store + .then(contents => { + this.currentData = contents; + logger.log("📄 Read data with version", this.currentData.version, "from", this.filename); + return contents; + }) + + // Catchall + .catch(err => { + return Promise.reject("Failed to read " + this.filename + ": " + err); + }) + ); + } + + /** + * Deletes the file + * @returns {Promise} + */ + deleteAsync() { + return this.app.storage.deleteFileAsync(this.filename); + } + + // Internal + + /** @returns {ExplainedResult} */ + internalVerifyBasicStructure(data) { + if (!data) { + return ExplainedResult.bad("Data is empty"); + } + if (!Number.isInteger(data.version) || data.version < 0) { + return ExplainedResult.bad( + `Data has invalid version: ${data.version} (expected ${this.getCurrentVersion()})` + ); + } + + return ExplainedResult.good(); + } + + /** @returns {ExplainedResult} */ + internalVerifyEntry(data) { + if (data.version !== this.getCurrentVersion()) { + return ExplainedResult.bad( + "Version mismatch, got " + data.version + " and expected " + this.getCurrentVersion() + ); + } + + const verifyStructureError = this.internalVerifyBasicStructure(data); + if (!verifyStructureError.isGood()) { + return verifyStructureError; + } + return this.verify(data); + } +} diff --git a/src/js/core/rectangle.js b/src/js/core/rectangle.js new file mode 100644 index 00000000..e736f9bd --- /dev/null +++ b/src/js/core/rectangle.js @@ -0,0 +1,287 @@ +import { globalConfig } from "./config"; +import { Math_ceil, Math_floor, Math_max, Math_min } from "./builtins"; +import { clamp, epsilonCompare, round2Digits } from "./utils"; +import { Vector } from "./vector"; + +export class Rectangle { + constructor(x = 0, y = 0, w = 0, h = 0) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } + + /** + * Creates a rectangle from top right bottom and left offsets + * @param {number} top + * @param {number} right + * @param {number} bottom + * @param {number} left + */ + static fromTRBL(top, right, bottom, left) { + return new Rectangle(left, top, right - left, bottom - top); + } + + /** + * Constructs a new square rectangle + * @param {number} x + * @param {number} y + * @param {number} size + */ + static fromSquare(x, y, size) { + return new Rectangle(x, y, size, size); + } + + /** + * + * @param {Vector} p1 + * @param {Vector} p2 + */ + static fromTwoPoints(p1, p2) { + const left = Math_min(p1.x, p2.x); + const top = Math_min(p1.y, p2.y); + const right = Math_max(p1.x, p2.x); + const bottom = Math_max(p1.y, p2.y); + return new Rectangle(left, top, right - left, bottom - top); + } + + /** + * @param {Rectangle} a + * @param {Rectangle} b + */ + static intersects(a, b) { + return a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom; + } + + /** + * Returns a rectangle arround a rotated point + * @param {Array} points + * @param {number} angle + * @returns {Rectangle} + */ + static getAroundPointsRotated(points, angle) { + let minX = 1e10; + let minY = 1e10; + let maxX = -1e10; + let maxY = -1e10; + for (let i = 0; i < points.length; ++i) { + const rotated = points[i].rotated(angle); + minX = Math_min(minX, rotated.x); + minY = Math_min(minY, rotated.y); + maxX = Math_max(maxX, rotated.x); + maxY = Math_max(maxY, rotated.y); + } + return new Rectangle(minX, minY, maxX - minX, maxY - minY); + } + + // Ensures the rectangle contains the given square + extendBySquare(centerX, centerY, halfWidth, halfHeight) { + if (this.isEmpty()) { + // Just assign values since this rectangle is empty + this.x = centerX - halfWidth; + this.y = centerY - halfHeight; + this.w = halfWidth * 2; + this.h = halfHeight * 2; + // console.log("Assigned", this.x, this.y, this.w, this.h); + } else { + // console.log("before", this.x, this.y, this.w, this.h); + this.setLeft(Math_min(this.x, centerX - halfWidth)); + this.setRight(Math_max(this.right(), centerX + halfWidth)); + this.setTop(Math_min(this.y, centerY - halfHeight)); + this.setBottom(Math_max(this.bottom(), centerY + halfHeight)); + // console.log("Extended", this.x, this.y, this.w, this.h); + } + } + + isEmpty() { + return epsilonCompare(this.w * this.h, 0); + } + + equalsEpsilon(other, epsilon) { + return ( + epsilonCompare(this.x, other.x, epsilon) && + epsilonCompare(this.y, other.y, epsilon) && + epsilonCompare(this.w, other.w, epsilon) && + epsilonCompare(this.h, other.h, epsilon) + ); + } + + left() { + return this.x; + } + + right() { + return this.x + this.w; + } + + top() { + return this.y; + } + + bottom() { + return this.y + this.h; + } + + trbl() { + return [this.y, this.right(), this.bottom(), this.x]; + } + + getCenter() { + return new Vector(this.x + this.w / 2, this.y + this.h / 2); + } + + setRight(right) { + this.w = right - this.x; + } + + setBottom(bottom) { + this.h = bottom - this.y; + } + + // Sets top while keeping bottom + setTop(top) { + const bottom = this.bottom(); + this.y = top; + this.setBottom(bottom); + } + + // Sets left while keeping right + setLeft(left) { + const right = this.right(); + this.x = left; + this.setRight(right); + } + + topLeft() { + return new Vector(this.x, this.y); + } + + bottomRight() { + return new Vector(this.right(), this.bottom()); + } + + moveBy(x, y) { + this.x += x; + this.y += y; + } + + moveByVector(vec) { + this.x += vec.x; + this.y += vec.y; + } + + // Returns a scaled version which also scales the position of the rectangle + allScaled(factor) { + return new Rectangle(this.x * factor, this.y * factor, this.w * factor, this.h * factor); + } + + // Increases the rectangle in all directions + expandInAllDirections(amount) { + this.x -= amount; + this.y -= amount; + this.w += 2 * amount; + this.h += 2 * amount; + return this; + } + + // Culling helpers + getMinStartTile() { + return new Vector(this.x, this.y).snapWorldToTile(); + } + + /** + * Returns if the given rectangle is contained + * @param {Rectangle} rect + * @returns {boolean} + */ + containsRect(rect) { + return ( + this.x <= rect.right() && + rect.x <= this.right() && + this.y <= rect.bottom() && + rect.y <= this.bottom() + ); + } + + containsRect4Params(x, y, w, h) { + return this.x <= x + w && x <= this.right() && this.y <= y + h && y <= this.bottom(); + } + + /** + * Returns if the rectangle contains the given circle at (x, y) with the radius (radius) + * @param {number} x + * @param {number} y + * @param {number} radius + */ + containsCircle(x, y, radius) { + return ( + this.x <= x + radius && + x - radius <= this.right() && + this.y <= y + radius && + y - radius <= this.bottom() + ); + } + + /** + * Returns if hte rectangle contains the given point + * @param {number} x + * @param {number} y + */ + containsPoint(x, y) { + return x >= this.x && x < this.right() && y >= this.y && y < this.bottom(); + } + + /** + * Returns the shared area with another rectangle, or null if there is no intersection + * @param {Rectangle} rect + * @returns {Rectangle|null} + */ + getUnion(rect) { + const left = Math_max(this.x, rect.x); + const top = Math_max(this.y, rect.y); + + const right = Math_min(this.x + this.w, rect.x + rect.w); + const bottom = Math_min(this.y + this.h, rect.y + rect.h); + + if (right <= left || bottom <= top) { + return null; + } + return Rectangle.fromTRBL(top, right, bottom, left); + } + + /** + * Good for caching stuff + */ + toCompareableString() { + return ( + round2Digits(this.x) + + "/" + + round2Digits(this.y) + + "/" + + round2Digits(this.w) + + "/" + + round2Digits(this.h) + ); + } + + /** + * Returns a new recangle in tile space which includes all tiles which are visible in this rect + * @param {boolean=} includeHalfTiles + * @returns {Rectangle} + */ + toTileCullRectangle(includeHalfTiles = true) { + let scaled = this.allScaled(1.0 / globalConfig.tileSize); + + if (includeHalfTiles) { + // Increase rectangle size + scaled = Rectangle.fromTRBL( + Math_floor(scaled.y), + Math_ceil(scaled.right()), + Math_ceil(scaled.bottom()), + Math_floor(scaled.x) + ); + } + + return scaled; + } +} diff --git a/src/js/core/request_channel.js b/src/js/core/request_channel.js new file mode 100644 index 00000000..b5b8c81f --- /dev/null +++ b/src/js/core/request_channel.js @@ -0,0 +1,72 @@ +import { createLogger } from "../core/logging"; +import { fastArrayDeleteValueIfContained } from "../core/utils"; + +const logger = createLogger("request_channel"); + +// Thrown when a request is aborted +export const PROMISE_ABORTED = "promise-aborted"; + +export class RequestChannel { + constructor() { + /** @type {Array} */ + this.pendingPromises = []; + } + + /** + * + * @param {Promise} promise + * @returns {Promise} + */ + watch(promise) { + // log(this, "Added new promise:", promise, "(pending =", this.pendingPromises.length, ")"); + let cancelled = false; + const wrappedPromise = new Promise((resolve, reject) => { + promise.then( + result => { + // Remove from pending promises + fastArrayDeleteValueIfContained(this.pendingPromises, wrappedPromise); + + // If not cancelled, resolve promise with same payload + if (!cancelled) { + resolve.call(this, result); + } else { + logger.warn("Not resolving because promise got cancelled"); + // reject.call(this, PROMISE_ABORTED); + } + }, + err => { + // Remove from pending promises + fastArrayDeleteValueIfContained(this.pendingPromises, wrappedPromise); + + // If not cancelled, reject promise with same payload + if (!cancelled) { + reject.call(this, err); + } else { + logger.warn("Not rejecting because promise got cancelled"); + // reject.call(this, PROMISE_ABORTED); + } + } + ); + }); + + // Add cancel handler + // @ts-ignore + wrappedPromise.cancel = function () { + cancelled = true; + }; + + this.pendingPromises.push(wrappedPromise); + return wrappedPromise; + } + + cancelAll() { + if (this.pendingPromises.length > 0) { + logger.log("Cancel all pending promises (", this.pendingPromises.length, ")"); + } + for (let i = 0; i < this.pendingPromises.length; ++i) { + // @ts-ignore + this.pendingPromises[i].cancel(); + } + this.pendingPromises = []; + } +} diff --git a/src/js/core/rng.js b/src/js/core/rng.js new file mode 100644 index 00000000..0653b95c --- /dev/null +++ b/src/js/core/rng.js @@ -0,0 +1,133 @@ +import { Math_random } from "./builtins"; + +// ALEA RNG + +function Mash() { + var n = 0xefc8249d; + return function (data) { + data = data.toString(); + for (var i = 0; i < data.length; i++) { + n += data.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 0x100000000; // 2^32 + } + return (n >>> 0) * 2.3283064365386963e-10; // 2^-32 + }; +} + +/** + * @param {number|string} seed + */ +function makeNewRng(seed) { + // Johannes Baagøe , 2010 + var c = 1; + var mash = Mash(); + let s0 = mash(" "); + let s1 = mash(" "); + let s2 = mash(" "); + + s0 -= mash(seed); + if (s0 < 0) { + s0 += 1; + } + s1 -= mash(seed); + if (s1 < 0) { + s1 += 1; + } + s2 -= mash(seed); + if (s2 < 0) { + s2 += 1; + } + mash = null; + + var random = function () { + var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32 + s0 = s1; + s1 = s2; + return (s2 = t - (c = t | 0)); + }; + + random.exportState = function () { + return [s0, s1, s2, c]; + }; + + random.importState = function (i) { + s0 = +i[0] || 0; + s1 = +i[1] || 0; + s2 = +i[2] || 0; + c = +i[3] || 0; + }; + + return random; +} + +export class RandomNumberGenerator { + /** + * + * @param {number|string=} seed + */ + constructor(seed) { + this.internalRng = makeNewRng(seed || Math_random()); + } + + /** + * Re-seeds the generator + * @param {number|string} seed + */ + reseed(seed) { + this.internalRng = makeNewRng(seed || Math_random()); + } + + /** + * @returns {number} between 0 and 1 + */ + next() { + return this.internalRng(); + } + + /** + * @param {number} min + * @param {number} max + * @returns {number} Integer in range [min, max[ + */ + nextIntRange(min, max) { + assert(Number.isFinite(min), "Minimum is no integer"); + assert(Number.isFinite(max), "Maximum is no integer"); + assert(max > min, "rng: max <= min"); + return Math.floor(this.next() * (max - min) + min); + } + /** + * @param {number} min + * @param {number} max + * @returns {number} Integer in range [min, max] + */ + nextIntRangeInclusive(min, max) { + assert(Number.isFinite(min), "Minimum is no integer"); + assert(Number.isFinite(max), "Maximum is no integer"); + assert(max > min, "rng: max <= min"); + return Math.round(this.next() * (max - min) + min); + } + + /** + * @param {number} min + * @param {number} max + * @returns {number} Number in range [min, max[ + */ + nextRange(min, max) { + assert(max > min, "rng: max <= min"); + return this.next() * (max - min) + min; + } + + /** + * Updates the seed + * @param {number} seed + */ + setSeed(seed) { + this.internalRng = makeNewRng(seed); + } +} diff --git a/src/js/core/sensitive_utils.encrypt.js b/src/js/core/sensitive_utils.encrypt.js new file mode 100644 index 00000000..7434164e --- /dev/null +++ b/src/js/core/sensitive_utils.encrypt.js @@ -0,0 +1,62 @@ +import { globalConfig } from "./config"; +import { decompressX64, compressX64 } from "./lzstring"; + +const Rusha = require("rusha"); + +const encryptKey = globalConfig.info.sgSalt; + +export function decodeHashedString(s) { + return decompressX64(s); +} + +export function sha1(str) { + return Rusha.createHash().update(str).digest("hex"); +} + +// Window.location.host +export function getNameOfProvider() { + return window[decodeHashedString("DYewxghgLgliB2Q")][decodeHashedString("BYewzgLgdghgtgUyA")]; +} + +export function compressWithChecksum(object) { + const stringified = JSON.stringify(object); + const checksum = Rusha.createHash() + .update(stringified + encryptKey) + .digest("hex"); + return compressX64(checksum + stringified); +} + +export function decompressWithChecksum(binary) { + let decompressed = null; + try { + decompressed = decompressX64(binary); + } catch (err) { + throw new Error("failed-to-decompress"); + } + + // Split into checksum and content + if (!decompressed || decompressed.length < 41) { + throw new Error("checksum-missing"); + } + + const checksum = decompressed.substr(0, 40); + const rawData = decompressed.substr(40); + + // Validate checksum + const computedChecksum = Rusha.createHash() + .update(rawData + encryptKey) + .digest("hex"); + if (computedChecksum !== checksum) { + throw new Error("checksum-mismatch"); + } + + // Try parsing the JSON + let data = null; + try { + data = JSON.parse(rawData); + } catch (err) { + throw new Error("failed-to-parse"); + } + + return data; +} diff --git a/src/js/core/signal.js b/src/js/core/signal.js new file mode 100644 index 00000000..57fe1fca --- /dev/null +++ b/src/js/core/signal.js @@ -0,0 +1,66 @@ +export const STOP_PROPAGATION = "stop_propagation"; + +export class Signal { + constructor() { + this.receivers = []; + this.modifyCount = 0; + } + + /** + * Adds a new signal listener + * @param {object} receiver + * @param {object} scope + */ + add(receiver, scope = null) { + assert(receiver, "receiver is null"); + this.receivers.push({ receiver, scope }); + ++this.modifyCount; + } + + /** + * Dispatches the signal + * @param {...any} payload + */ + dispatch() { + const modifyState = this.modifyCount; + + const n = this.receivers.length; + for (let i = 0; i < n; ++i) { + const { receiver, scope } = this.receivers[i]; + if (receiver.apply(scope, arguments) === STOP_PROPAGATION) { + return STOP_PROPAGATION; + } + + if (modifyState !== this.modifyCount) { + // Signal got modified during iteration + return STOP_PROPAGATION; + } + } + } + + /** + * Removes a receiver + * @param {object} receiver + */ + remove(receiver) { + let index = null; + const n = this.receivers.length; + for (let i = 0; i < n; ++i) { + if (this.receivers[i].receiver === receiver) { + index = i; + break; + } + } + assert(index !== null, "Receiver not found in list"); + this.receivers.splice(index, 1); + ++this.modifyCount; + } + + /** + * Removes all receivers + */ + removeAll() { + this.receivers = []; + ++this.modifyCount; + } +} diff --git a/src/js/core/singleton_factory.js b/src/js/core/singleton_factory.js new file mode 100644 index 00000000..27d192c5 --- /dev/null +++ b/src/js/core/singleton_factory.js @@ -0,0 +1,78 @@ +// simple factory pattern +export class SingletonFactory { + constructor() { + // Store array as well as dictionary, to speed up lookups + this.entries = []; + this.idToEntry = {}; + } + + register(classHandle) { + // First, construct instance + const instance = new classHandle(); + + // Extract id + const id = instance.getId(); + assert(id, "Factory: Invalid id for class " + classHandle.name + ": " + id); + + // Check duplicates + assert(!this.idToEntry[id], "Duplicate factory entry for " + id); + + // Insert + this.entries.push(instance); + this.idToEntry[id] = instance; + } + + /** + * Checks if a given id is registered + * @param {string} id + * @returns {boolean} + */ + hasId(id) { + return !!this.idToEntry[id]; + } + + /** + * Finds an instance by a given id + * @param {string} id + * @returns {object} + */ + findById(id) { + const entry = this.idToEntry[id]; + if (!entry) { + assert(false, "Factory: Object with id '" + id + "' is not registered!"); + return null; + } + return entry; + } + + /** + * Finds an instance by its constructor (The class handle) + * @param {object} classHandle + * @returns {object} + */ + findByClass(classHandle) { + for (let i = 0; i < this.entries.length; ++i) { + if (this.entries[i] instanceof classHandle) { + return this.entries[i]; + } + } + assert(false, "Factory: Object not found by classHandle (classid: " + classHandle.name + ")"); + return null; + } + + /** + * Returns all entries + * @returns {Array} + */ + getEntries() { + return this.entries; + } + + /** + * Returns amount of stored entries + * @returns {number} + */ + getNumEntries() { + return this.entries.length; + } +} diff --git a/src/js/core/sprites.js b/src/js/core/sprites.js new file mode 100644 index 00000000..90efaae0 --- /dev/null +++ b/src/js/core/sprites.js @@ -0,0 +1,351 @@ +import { DrawParameters } from "./draw_parameters"; +import { Math_floor } from "./builtins"; +import { Rectangle } from "./rectangle"; +import { epsilonCompare, round3Digits } from "./utils"; + +const floorSpriteCoordinates = false; + +const ORIGINAL_SCALE = "1"; + +export class BaseSprite { + /** + * Returns the raw handle + * @returns {HTMLImageElement|HTMLCanvasElement} + */ + getRawTexture() { + abstract; + return null; + } + + /** + * Draws the sprite + * @param {CanvasRenderingContext2D} context + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + */ + draw(context, x, y, w, h) { + // eslint-disable-line no-unused-vars + abstract; + } +} + +/** + * Position of a sprite within an atlas + */ +export class SpriteAtlasLink { + /** + * + * @param {object} param0 + * @param {number} param0.packedX + * @param {number} param0.packedY + * @param {number} param0.packOffsetX + * @param {number} param0.packOffsetY + * @param {number} param0.packedW + * @param {number} param0.packedH + * @param {number} param0.w + * @param {number} param0.h + * @param {HTMLImageElement|HTMLCanvasElement} param0.atlas + */ + constructor({ w, h, packedX, packedY, packOffsetX, packOffsetY, packedW, packedH, atlas }) { + this.packedX = packedX; + this.packedY = packedY; + this.packedW = packedW; + this.packedH = packedH; + this.packOffsetX = packOffsetX; + this.packOffsetY = packOffsetY; + this.atlas = atlas; + this.w = w; + this.h = h; + } +} + +export class AtlasSprite extends BaseSprite { + /** + * + * @param {object} param0 + * @param {string} param0.spriteName + */ + constructor({ spriteName = "sprite" }) { + super(); + /** @type {Object.} */ + this.linksByResolution = {}; + this.spriteName = spriteName; + } + + getRawTexture() { + return this.linksByResolution[ORIGINAL_SCALE].atlas; + } + + /** + * Draws the sprite onto a regular context using no contexts + * @see {BaseSprite.draw} + */ + draw(context, x, y, w, h) { + if (G_IS_DEV) { + assert(context instanceof CanvasRenderingContext2D, "Not a valid context"); + } + console.warn("drawing sprite regulary"); + + const link = this.linksByResolution[ORIGINAL_SCALE]; + + const width = w || link.w; + const height = h || link.h; + + const scaleW = width / link.w; + const scaleH = height / link.h; + + context.drawImage( + link.atlas, + + link.packedX, + link.packedY, + link.packedW, + link.packedH, + + x + link.packOffsetX * scaleW, + y + link.packOffsetY * scaleH, + link.packedW * scaleW, + link.packedH * scaleH + ); + } + + /** + * + * @param {DrawParameters} parameters + * @param {number} x + * @param {number} y + * @param {number} size + * @param {boolean=} clipping + */ + drawCachedCentered(parameters, x, y, size, clipping = true) { + this.drawCached(parameters, x - size / 2, y - size / 2, size, size, clipping); + } + + /** + * + * @param {CanvasRenderingContext2D} context + * @param {number} x + * @param {number} y + * @param {number} size + */ + drawCentered(context, x, y, size) { + this.draw(context, x - size / 2, y - size / 2, size, size); + } + + /** + * Draws the sprite + * @param {DrawParameters} parameters + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @param {boolean=} clipping Whether to perform culling + */ + drawCached(parameters, x, y, w = null, h = null, clipping = true) { + if (G_IS_DEV) { + assertAlways(parameters instanceof DrawParameters, "Not a valid context"); + assertAlways(!!w && w > 0, "Not a valid width:" + w); + assertAlways(!!h && h > 0, "Not a valid height:" + h); + } + + const visibleRect = parameters.visibleRect; + + const scale = parameters.desiredAtlasScale; + const link = this.linksByResolution[scale]; + const scaleW = w / link.w; + const scaleH = h / link.h; + + let destX = x + link.packOffsetX * scaleW; + let destY = y + link.packOffsetY * scaleH; + let destW = link.packedW * scaleW; + let destH = link.packedH * scaleH; + + let srcX = link.packedX; + let srcY = link.packedY; + let srcW = link.packedW; + let srcH = link.packedH; + + let intersection = null; + + if (clipping) { + const rect = new Rectangle(destX, destY, destW, destH); + intersection = rect.getUnion(visibleRect); + if (!intersection) { + return; + } + + srcX += (intersection.x - destX) / scaleW; + srcY += (intersection.y - destY) / scaleH; + + srcW *= intersection.w / destW; + srcH *= intersection.h / destH; + + destX = intersection.x; + destY = intersection.y; + + destW = intersection.w; + destH = intersection.h; + } + + // assert(epsilonCompare(scaleW, scaleH), "Sprite should be square for cached rendering"); + + if (floorSpriteCoordinates) { + parameters.context.drawImage( + link.atlas, + + // atlas src pos + Math_floor(srcX), + Math_floor(srcY), + + // atlas src size + Math_floor(srcW), + Math_floor(srcH), + + // dest pos + Math_floor(destX), + Math_floor(destY), + + // dest size + Math_floor(destW), + Math_floor(destH) + ); + } else { + parameters.context.drawImage( + link.atlas, + + // atlas src pos + srcX, + srcY, + + // atlas src siize + srcW, + srcH, + + // dest pos and size + destX, + destY, + destW, + destH + ); + } + } + + /** + * Renders into an html element + * @param {HTMLElement} element + * @param {number} w + * @param {number} h + */ + renderToHTMLElement(element, w = 1, h = 1) { + element.style.position = "relative"; + element.innerHTML = this.getAsHTML(w, h); + } + + /** + * Returns the html to render as icon + * @param {number} w + * @param {number} h + */ + getAsHTML(w, h) { + const link = this.linksByResolution["0.5"]; + + // Find out how much we have to scale it so that it fits + const scaleX = w / link.w; + const scaleY = h / link.h; + + // Find out how big the scaled atlas is + const atlasW = link.atlas.width * scaleX; + const atlasH = link.atlas.height * scaleY; + + // @ts-ignore + const srcSafe = link.atlas.src.replaceAll("\\", "/"); + + // Find out how big we render the sprite + const widthAbsolute = scaleX * link.packedW; + const heightAbsolute = scaleY * link.packedH; + + // Compute the position in the relative container + const leftRelative = (link.packOffsetX * scaleX) / w; + const topRelative = (link.packOffsetY * scaleY) / h; + const widthRelative = widthAbsolute / w; + const heightRelative = heightAbsolute / h; + + // Scale the atlas relative to the width and height of the element + const bgW = atlasW / widthAbsolute; + const bgH = atlasH / heightAbsolute; + + // Figure out what the position of the atlas is + const bgX = link.packedX * scaleX; + const bgY = link.packedY * scaleY; + + // Fuck you, whoever thought its a good idea to make background-position work like it does now + const bgXRelative = -bgX / (widthAbsolute - atlasW); + const bgYRelative = -bgY / (heightAbsolute - atlasH); + + return ` + + `; + } +} + +export class RegularSprite extends BaseSprite { + constructor(sprite, w, h) { + super(); + this.w = w; + this.h = h; + this.sprite = sprite; + } + + getRawTexture() { + return this.sprite; + } + + /** + * Draws the sprite, do *not* use this for sprites which are rendered! Only for drawing + * images into buffers + * @param {CanvasRenderingContext2D} context + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + */ + draw(context, x, y, w, h) { + assert(context, "No context given"); + assert(x !== undefined, "No x given"); + assert(y !== undefined, "No y given"); + assert(w !== undefined, "No width given"); + assert(h !== undefined, "No height given"); + context.drawImage(this.sprite, x, y, w, h); + } + + /** + * Draws the sprite, do *not* use this for sprites which are rendered! Only for drawing + * images into buffers + * @param {CanvasRenderingContext2D} context + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + */ + drawCentered(context, x, y, w, h) { + assert(context, "No context given"); + assert(x !== undefined, "No x given"); + assert(y !== undefined, "No y given"); + assert(w !== undefined, "No width given"); + assert(h !== undefined, "No height given"); + context.drawImage(this.sprite, x - w / 2, y - h / 2, w, h); + } +} diff --git a/src/js/core/state_manager.js b/src/js/core/state_manager.js new file mode 100644 index 00000000..3c49ada9 --- /dev/null +++ b/src/js/core/state_manager.js @@ -0,0 +1,121 @@ +/* typehints:start*/ +import { Application } from "../application"; +/* typehints:end*/ + +import { GameState } from "./game_state"; +import { createLogger } from "./logging"; +import { APPLICATION_ERROR_OCCURED } from "./error_handler"; +import { waitNextFrame, removeAllChildren } from "./utils"; + +const logger = createLogger("state_manager"); + +/** + * This is the main state machine which drives the game states. + */ +export class StateManager { + /** + * @param {Application} app + */ + constructor(app) { + this.app = app; + + /** @type {GameState} */ + this.currentState = null; + + /** @type {Object. GameState>} */ + this.stateClasses = {}; + } + + /** + * Registers a new state class, should be a GameState derived class + * @param {object} stateClass + */ + register(stateClass) { + // Create a dummy to retrieve the key + const dummy = new stateClass(); + assert(dummy instanceof GameState, "Not a state!"); + const key = dummy.getKey(); + assert(!this.stateClasses[key], `State '${key}' is already registered!`); + this.stateClasses[key] = stateClass; + } + + /** + * Constructs a new state or returns the instance from the cache + * @param {string} key + */ + constructState(key) { + if (this.stateClasses[key]) { + return new this.stateClasses[key](); + } + assert(false, `State '${key}' is not known!`); + } + + /** + * Moves to a given state + * @param {string} key State Key + */ + moveToState(key, payload = {}) { + if (APPLICATION_ERROR_OCCURED) { + console.warn("Skipping state transition because of application crash"); + return; + } + + if (this.currentState) { + if (key === this.currentState.getKey()) { + logger.error(`State '${key}' is already active!`); + return false; + } + this.currentState.internalLeaveCallback(); + + // Remove all references + for (const stateKey in this.currentState) { + if (this.currentState.hasOwnProperty(stateKey)) { + delete this.currentState[stateKey]; + } + } + this.currentState = null; + } + + this.currentState = this.constructState(key); + this.currentState.internalRegisterCallback(this, this.app); + + // Clean up old elements + removeAllChildren(document.body); + + document.body.className = "gameState " + (this.currentState.getHasFadeIn() ? "" : "arrived"); + document.body.id = "state_" + key; + document.body.innerHTML = this.currentState.internalGetFullHtml(); + + const dialogParent = document.createElement("div"); + dialogParent.classList.add("modalDialogParent"); + document.body.appendChild(dialogParent); + + this.app.sound.playThemeMusic(this.currentState.getThemeMusic()); + + this.currentState.internalEnterCallback(payload); + this.currentState.onResized(this.app.screenWidth, this.app.screenHeight); + + this.app.analytics.trackStateEnter(key); + + window.history.pushState( + { + key, + }, + key + ); + + waitNextFrame().then(() => { + document.body.classList.add("arrived"); + }); + + return true; + } + + /** + * Returns the current state + * @returns {GameState} + */ + getCurrentState() { + return this.currentState; + } +} diff --git a/src/js/core/tracked_state.js b/src/js/core/tracked_state.js new file mode 100644 index 00000000..1a538bc6 --- /dev/null +++ b/src/js/core/tracked_state.js @@ -0,0 +1,39 @@ +export class TrackedState { + constructor(callbackMethod = null, callbackScope = null) { + this.lastSeenValue = null; + + if (callbackMethod) { + this.callback = callbackMethod; + if (callbackScope) { + this.callback = this.callback.bind(callbackScope); + } + } + } + + set(value, changeHandler = null, changeScope = null) { + if (value !== this.lastSeenValue) { + // Copy value since the changeHandler call could actually modify our lastSeenValue + const valueCopy = value; + this.lastSeenValue = value; + if (changeHandler) { + if (changeScope) { + changeHandler.call(changeScope, valueCopy); + } else { + changeHandler(valueCopy); + } + } else if (this.callback) { + this.callback(value); + } else { + assert(false, "No callback specified"); + } + } + } + + setSilent(value) { + this.lastSeenValue = value; + } + + get() { + return this.lastSeenValue; + } +} diff --git a/src/js/core/utils.js b/src/js/core/utils.js new file mode 100644 index 00000000..2b7eca48 --- /dev/null +++ b/src/js/core/utils.js @@ -0,0 +1,889 @@ +import { globalConfig, IS_DEBUG } from "./config"; +import { + Math_abs, + Math_atan2, + Math_ceil, + Math_floor, + Math_log10, + Math_max, + Math_min, + Math_PI, + Math_pow, + Math_random, + Math_round, + Math_sin, + performanceNow, +} from "./builtins"; +import { Vector } from "./vector"; + +// Constants +export const TOP = new Vector(0, -1); +export const RIGHT = new Vector(1, 0); +export const BOTTOM = new Vector(0, 1); +export const LEFT = new Vector(-1, 0); +export const ALL_DIRECTIONS = [TOP, RIGHT, BOTTOM, LEFT]; + +export const thousand = 1000; +export const million = 1000 * 1000; +export const billion = 1000 * 1000 * 1000; + +/** + * Returns the build id + * @returns {string} + */ +export function getBuildId() { + if (G_IS_DEV && IS_DEBUG) { + return "local-dev"; + } else if (G_IS_DEV) { + return "dev-" + getPlatformName() + "-" + G_BUILD_COMMIT_HASH; + } else { + return "prod-" + getPlatformName() + "-" + G_BUILD_COMMIT_HASH; + } +} + +/** + * Returns the environment id (dev, prod, etc) + * @returns {string} + */ +export function getEnvironmentId() { + if (G_IS_DEV && IS_DEBUG) { + return "local-dev"; + } else if (G_IS_DEV) { + return "dev-" + getPlatformName(); + } else if (G_IS_RELEASE) { + return "release-" + getPlatformName(); + } else { + return "staging-" + getPlatformName(); + } +} + +/** + * Returns if this platform is android + * @returns {boolean} + */ +export function isAndroid() { + if (!G_IS_MOBILE_APP) { + return false; + } + const platform = window.device.platform; + return platform === "Android" || platform === "amazon-fireos"; +} + +/** + * Returns if this platform is iOs + * @returns {boolean} + */ +export function isIos() { + if (!G_IS_MOBILE_APP) { + return false; + } + return window.device.platform === "iOS"; +} + +/** + * Returns a platform name + * @returns {string} + */ +export function getPlatformName() { + if (G_IS_STANDALONE) { + return "standalone"; + } else if (G_IS_BROWSER) { + return "browser"; + } else if (G_IS_MOBILE_APP && isAndroid()) { + return "android"; + } else if (G_IS_MOBILE_APP && isIos()) { + return "ios"; + } + return "unknown"; +} + +/** + * Returns the IPC renderer, or null if not within the standalone + * @returns {object|null} + */ +let ipcRenderer = null; +export function getIPCRenderer() { + if (!G_IS_STANDALONE) { + return null; + } + if (!ipcRenderer) { + ipcRenderer = eval("require")("electron").ipcRenderer; + } + return ipcRenderer; +} + +/** + * Formats a sensitive token by only displaying the first digits of it. Use for + * stuff like savegame keys etc which should not appear in the log. + * @param {string} key + */ +export function formatSensitive(key) { + if (!key) { + return ""; + } + key = key || ""; + return "[" + key.substr(0, 8) + "...]"; +} + +/** + * Creates a new 2D array with the given fill method + * @param {number} w Width + * @param {number} h Height + * @param {(function(number, number) : any) | number | boolean | string | null | undefined} filler Either Fill method, which should return the content for each cell, or static content + * @param {string=} context Optional context for memory tracking + * @returns {Array>} + */ +export function make2DArray(w, h, filler, context = null) { + if (typeof filler === "function") { + const tiles = new Array(w); + for (let x = 0; x < w; ++x) { + const row = new Array(h); + for (let y = 0; y < h; ++y) { + row[y] = filler(x, y); + } + tiles[x] = row; + } + return tiles; + } else { + const tiles = new Array(w); + const row = new Array(h); + for (let y = 0; y < h; ++y) { + row[y] = filler; + } + + for (let x = 0; x < w; ++x) { + tiles[x] = row.slice(); + } + return tiles; + } +} + +/** + * Makes a new 2D array with undefined contents + * @param {number} w + * @param {number} h + * @param {string=} context + * @returns {Array>} + */ +export function make2DUndefinedArray(w, h, context = null) { + const result = new Array(w); + for (let x = 0; x < w; ++x) { + result[x] = new Array(h); + } + return result; +} + +/** + * Clears a given 2D array with the given fill method + * @param {Array>} array + * @param {number} w Width + * @param {number} h Height + * @param {(function(number, number) : any) | number | boolean | string | null | undefined} filler Either Fill method, which should return the content for each cell, or static content + */ +export function clear2DArray(array, w, h, filler) { + assert(array.length === w, "Array dims mismatch w"); + assert(array[0].length === h, "Array dims mismatch h"); + if (typeof filler === "function") { + for (let x = 0; x < w; ++x) { + const row = array[x]; + for (let y = 0; y < h; ++y) { + row[y] = filler(x, y); + } + } + } else { + for (let x = 0; x < w; ++x) { + const row = array[x]; + for (let y = 0; y < h; ++y) { + row[y] = filler; + } + } + } +} + +/** + * Creates a new map (an empty object without any props) + */ +export function newEmptyMap() { + return Object.create(null); +} + +/** + * Returns a random integer in the range [start,end] + * @param {number} start + * @param {number} end + */ +export function randomInt(start, end) { + return start + Math_round(Math_random() * (end - start)); +} + +/** + * Access an object in a very annoying way, used for obsfuscation. + * @param {any} obj + * @param {Array} keys + */ +export function accessNestedPropertyReverse(obj, keys) { + let result = obj; + for (let i = keys.length - 1; i >= 0; --i) { + result = result[keys[i]]; + } + return result; +} + +/** + * Chooses a random entry of an array + * @param {Array | string} arr + */ +export function randomChoice(arr) { + return arr[Math_floor(Math_random() * arr.length)]; +} + +/** + * Deletes from an array by swapping with the last element + * @param {Array} array + * @param {number} index + */ +export function fastArrayDelete(array, index) { + if (index < 0 || index >= array.length) { + throw new Error("Out of bounds"); + } + // When the element is not the last element + if (index !== array.length - 1) { + // Get the last element, and swap it with the one we want to delete + const last = array[array.length - 1]; + array[index] = last; + } + + // Finally remove the last element + array.length -= 1; +} + +/** + * Deletes from an array by swapping with the last element. Searches + * for the value in the array first + * @param {Array} array + * @param {any} value + */ +export function fastArrayDeleteValue(array, value) { + if (array == null) { + throw new Error("Tried to delete from non array!"); + } + const index = array.indexOf(value); + if (index < 0) { + console.error("Value", value, "not contained in array:", array, "!"); + return value; + } + return fastArrayDelete(array, index); +} + +/** + * @see fastArrayDeleteValue + * @param {Array} array + * @param {any} value + */ +export function fastArrayDeleteValueIfContained(array, value) { + if (array == null) { + throw new Error("Tried to delete from non array!"); + } + const index = array.indexOf(value); + if (index < 0) { + return value; + } + return fastArrayDelete(array, index); +} + +/** + * Deletes from an array at the given index + * @param {Array} array + * @param {number} index + */ +export function arrayDelete(array, index) { + if (index < 0 || index >= array.length) { + throw new Error("Out of bounds"); + } + array.splice(index, 1); +} + +/** + * Deletes the given value from an array + * @param {Array} array + * @param {any} value + */ +export function arrayDeleteValue(array, value) { + if (array == null) { + throw new Error("Tried to delete from non array!"); + } + const index = array.indexOf(value); + if (index < 0) { + console.error("Value", value, "not contained in array:", array, "!"); + return value; + } + return arrayDelete(array, index); +} + +// Converts a direction into a 0 .. 7 index +/** + * Converts a direction into a index from 0 .. 7, used for miners, zombies etc which have 8 sprites + * @param {Vector} offset direction + * @param {boolean} inverse if inverse, the direction is reversed + * @returns {number} in range [0, 7] + */ +export function angleToSpriteIndex(offset, inverse = false) { + const twoPi = 2.0 * Math_PI; + const factor = inverse ? -1 : 1; + const offs = inverse ? 2.5 : 3.5; + const angle = (factor * Math_atan2(offset.y, offset.x) + offs * Math_PI) % twoPi; + + const index = Math_round((angle / twoPi) * 8) % 8; + return index; +} + +/** + * Compare two floats for epsilon equality + * @param {number} a + * @param {number} b + * @returns {boolean} + */ +export function epsilonCompare(a, b, epsilon = 1e-5) { + return Math_abs(a - b) < epsilon; +} + +/** + * Compare a float for epsilon equal to 0 + * @param {number} a + * @returns {boolean} + */ +export function epsilonIsZero(a) { + return epsilonCompare(a, 0); +} + +/** + * Interpolates two numbers + * @param {number} a + * @param {number} b + * @param {number} x Mix factor, 0 means 100% a, 1 means 100%b, rest is interpolated + */ +export function lerp(a, b, x) { + return a * (1 - x) + b * x; +} + +/** + * Finds a value which is nice to display, e.g. 15669 -> 15000. Also handles fractional stuff + * @param {number} num + */ +export function findNiceValue(num) { + if (num > 1e8) { + return num; + } + if (num < 0.00001) { + return 0; + } + + const roundAmount = 0.5 * Math_pow(10, Math_floor(Math_log10(num) - 1)); + const niceValue = Math_floor(num / roundAmount) * roundAmount; + if (num >= 10) { + return Math_round(niceValue); + } + if (num >= 1) { + return Math_round(niceValue * 10) / 10; + } + + return Math_round(niceValue * 100) / 100; +} + +/** + * Finds a nice integer value + * @see findNiceValue + * @param {number} num + */ +export function findNiceIntegerValue(num) { + return Math_ceil(findNiceValue(num)); +} + +/** + * Smart rounding + fractional handling + * @param {number} n + */ +function roundSmart(n) { + if (n < 100) { + return n.toFixed(1); + } + return Math_round(n); +} + +/** + * Formats a big number + * @param {number} num + * @param {string=} divider THe divider for numbers like 50,000 (divider=',') + * @returns {string} + */ +export function formatBigNumber(num, divider = ".") { + const sign = num < 0 ? "-" : ""; + num = Math_abs(num); + + if (num > 1e54) { + return sign + "inf"; + } + + if (num < 10 && !Number.isInteger(num)) { + return sign + num.toFixed(2); + } + if (num < 50 && !Number.isInteger(num)) { + return sign + num.toFixed(1); + } + num = Math_floor(num); + + if (num < 1000) { + return sign + "" + num; + } + + // if (num > 1e51) return sign + T.common.number_format.sedecillion.replace("%amount%", "" + roundSmart(num / 1e51)); + // if (num > 1e48) + // return sign + T.common.number_format.quinquadecillion.replace("%amount%", "" + roundSmart(num / 1e48)); + // if (num > 1e45) + // return sign + T.common.number_format.quattuordecillion.replace("%amount%", "" + roundSmart(num / 1e45)); + // if (num > 1e42) return sign + T.common.number_format.tredecillion.replace("%amount%", "" + roundSmart(num / 1e42)); + // if (num > 1e39) return sign + T.common.number_format.duodecillions.replace("%amount%", "" + roundSmart(num / 1e39)); + // if (num > 1e36) return sign + T.common.number_format.undecillions.replace("%amount%", "" + roundSmart(num / 1e36)); + // if (num > 1e33) return sign + T.common.number_format.decillions.replace("%amount%", "" + roundSmart(num / 1e33)); + // if (num > 1e30) return sign + T.common.number_format.nonillions.replace("%amount%", "" + roundSmart(num / 1e30)); + // if (num > 1e27) return sign + T.common.number_format.octillions.replace("%amount%", "" + roundSmart(num / 1e27)); + // if (num >= 1e24) return sign + T.common.number_format.septillions.replace("%amount%", "" + roundSmart(num / 1e24)); + // if (num >= 1e21) return sign + T.common.number_format.sextillions.replace("%amount%", "" + roundSmart(num / 1e21)); + // if (num >= 1e18) return sign + T.common.number_format.quintillions.replace("%amount%", "" + roundSmart(num / 1e18)); + // if (num >= 1e15) return sign + T.common.number_format.quantillions.replace("%amount%", "" + roundSmart(num / 1e15)); + // if (num >= 1e12) return sign + T.common.number_format.trillions.replace("%amount%", "" + roundSmart(num / 1e12)); + // if (num >= 1e9) return sign + T.common.number_format.billions.replace("%amount%", "" + roundSmart(num / 1e9)); + // if (num >= 1e6) return sign + T.common.number_format.millions.replace("%amount%", "" + roundSmart(num / 1e6)); + // if (num > 99999) return sign + T.common.number_format.thousands.replace("%amount%", "" + roundSmart(num / 1e3)); + + let rest = num; + let out = ""; + + while (rest >= 1000) { + out = (rest % 1000).toString().padStart(3, "0") + (out !== "" ? divider : "") + out; + rest = Math_floor(rest / 1000); + } + + out = rest + divider + out; + return sign + out; +} + +/** + * Formats a big number, but does not add any suffix and instead uses its full representation + * @param {number} num + * @param {string=} divider THe divider for numbers like 50,000 (divider=',') + * @returns {string} + */ +export function formatBigNumberFull(num, divider = T.common.number_format.divider_thousands || " ") { + if (num < 1000) { + return num + ""; + } + if (num > 1e54) { + return "infinite"; + } + let rest = num; + let out = ""; + while (rest >= 1000) { + out = (rest % 1000).toString().padStart(3, "0") + divider + out; + rest = Math_floor(rest / 1000); + } + out = rest + divider + out; + + return out.substring(0, out.length - 1); +} + +/** + * Formats an amount of seconds into something like "5s ago" + * @param {number} secs Seconds + * @returns {string} + */ +export function formatSecondsToTimeAgo(secs) { + const seconds = Math_floor(secs); + const minutes = Math_floor(seconds / 60); + const hours = Math_floor(minutes / 60); + const days = Math_floor(hours / 24); + + const trans = T.common.time; + + if (seconds <= 60) { + if (seconds <= 1) { + return trans.one_second_before; + } + return trans.seconds_before.replace("%amount%", "" + seconds); + } else if (minutes <= 60) { + if (minutes <= 1) { + return trans.one_minute_before; + } + return trans.minutes_before.replace("%amount%", "" + minutes); + } else if (hours <= 60) { + if (hours <= 1) { + return trans.one_hour_before; + } + return trans.hours_before.replace("%amount%", "" + hours); + } else { + if (days <= 1) { + return trans.one_day_before; + } + return trans.days_before.replace("%amount%", "" + days); + } +} + +/** + * Formats seconds into a readable string like "5h 23m" + * @param {number} secs Seconds + * @returns {string} + */ +export function formatSeconds(secs) { + const trans = T.common.time; + secs = Math_ceil(secs); + if (secs < 60) { + return trans.seconds_short.replace("%seconds%", "" + secs); + } else if (secs < 60 * 60) { + const minutes = Math_floor(secs / 60); + const seconds = secs % 60; + return trans.minutes_seconds_short + .replace("%seconds%", "" + seconds) + .replace("%minutes%", "" + minutes); + } else { + const hours = Math_floor(secs / 3600); + const minutes = Math_floor(secs / 60) % 60; + return trans.hours_minutes_short.replace("%minutes%", "" + minutes).replace("%hours%", "" + hours); + } +} + +/** + * Delayes a promise so that it will resolve after a *minimum* amount of time only + * @param {Promise} promise The promise to delay + * @param {number} minTimeMs The time to make it run at least + * @returns {Promise} The delayed promise + */ +export function artificialDelayedPromise(promise, minTimeMs = 500) { + if (G_IS_DEV && globalConfig.debug.noArtificialDelays) { + return promise; + } + + const startTime = performanceNow(); + return promise.then( + result => { + const timeTaken = performanceNow() - startTime; + const waitTime = Math_floor(minTimeMs - timeTaken); + if (waitTime > 0) { + return new Promise(resolve => { + setTimeout(() => { + resolve(result); + }, waitTime); + }); + } else { + return result; + } + }, + error => { + const timeTaken = performanceNow() - startTime; + const waitTime = Math_floor(minTimeMs - timeTaken); + if (waitTime > 0) { + // @ts-ignore + return new Promise((resolve, reject) => { + setTimeout(() => { + reject(error); + }, waitTime); + }); + } else { + throw error; + } + } + ); +} + +/** + * Computes a sine-based animation which pulsates from 0 .. 1 .. 0 + * @param {number} time Current time in seconds + * @param {number} duration Duration of the full pulse in seconds + * @param {number} seed Seed to offset the animation + */ +export function pulseAnimation(time, duration = 1.0, seed = 0.0) { + return Math_sin((time * Math_PI * 2.0) / duration + seed * 5642.86729349) * 0.5 + 0.5; +} + +/** + * Returns the smallest angle between two angles + * @param {number} a + * @param {number} b + * @returns {number} 0 .. 2 PI + */ +export function smallestAngle(a, b) { + return safeMod(a - b + Math_PI, 2.0 * Math_PI) - Math_PI; +} + +/** + * Modulo which works for negative numbers + * @param {number} n + * @param {number} m + */ +export function safeMod(n, m) { + return ((n % m) + m) % m; +} + +/** + * Wraps an angle between 0 and 2 pi + * @param {number} angle + */ +export function wrapAngle(angle) { + return safeMod(angle, 2.0 * Math_PI); +} + +/** + * Waits two frames so the ui is updated + * @returns {Promise} + */ +export function waitNextFrame() { + return new Promise(function (resolve, reject) { + window.requestAnimationFrame(function () { + window.requestAnimationFrame(function () { + resolve(); + }); + }); + }); +} + +/** + * Rounds 1 digit + * @param {number} n + * @returns {number} + */ +export function round1Digit(n) { + return Math_floor(n * 10.0) / 10.0; +} + +/** + * Rounds 2 digits + * @param {number} n + * @returns {number} + */ +export function round2Digits(n) { + return Math_floor(n * 100.0) / 100.0; +} + +/** + * Rounds 3 digits + * @param {number} n + * @returns {number} + */ +export function round3Digits(n) { + return Math_floor(n * 1000.0) / 1000.0; +} + +/** + * Rounds 4 digits + * @param {number} n + * @returns {number} + */ +export function round4Digits(n) { + return Math_floor(n * 10000.0) / 10000.0; +} + +/** + * Clamps a value between [min, max] + * @param {number} v + * @param {number=} minimum Default 0 + * @param {number=} maximum Default 1 + */ +export function clamp(v, minimum = 0, maximum = 1) { + return Math_max(minimum, Math_min(maximum, v)); +} + +/** + * Measures how long a function took + * @param {string} name + * @param {function():void} target + */ +export function measure(name, target) { + const now = performanceNow(); + for (let i = 0; i < 25; ++i) { + target(); + } + const dur = (performanceNow() - now) / 25.0; + console.warn("->", name, "took", dur.toFixed(2), "ms"); +} + +/** + * Helper method to create a new div + * @param {Element} parent + * @param {string=} id + * @param {Array=} classes + * @param {string=} innerHTML + */ +export function makeDiv(parent, id = null, classes = [], innerHTML = "") { + const div = document.createElement("div"); + if (id) { + div.id = id; + } + for (let i = 0; i < classes.length; ++i) { + div.classList.add(classes[i]); + } + div.innerHTML = innerHTML; + parent.appendChild(div); + return div; +} + +/** + * Removes all children of the given element + * @param {Element} elem + */ +export function removeAllChildren(elem) { + var range = document.createRange(); + range.selectNodeContents(elem); + range.deleteContents(); +} + +export function smartFadeNumber(current, newOne, minFade = 0.01, maxFade = 0.9) { + const tolerance = Math.min(current, newOne) * 0.5 + 10; + let fade = minFade; + if (Math.abs(current - newOne) < tolerance) { + fade = maxFade; + } + + return current * fade + newOne * (1 - fade); +} + +/** + * Fixes lockstep simulation by converting times like 34.0000000003 to 34.00. + * We use 3 digits of precision, this allows to store sufficient precision of 1 ms without + * the risk to simulation errors due to resync issues + * @param {number} value + */ +export function quantizeFloat(value) { + return Math.round(value * 1000.0) / 1000.0; +} + +/** + * Safe check to check if a timer is expired. quantizes numbers + * @param {number} now Current time + * @param {number} lastTick Last tick of the timer + * @param {number} tickRate Interval of the timer + */ +export function checkTimerExpired(now, lastTick, tickRate) { + if (!G_IS_PROD) { + if (quantizeFloat(now) !== now) { + console.error("Got non-quantizied time:" + now + " vs " + quantizeFloat(now)); + now = quantizeFloat(now); + } + if (quantizeFloat(lastTick) !== lastTick) { + // FIXME: REENABLE + // console.error("Got non-quantizied timer:" + lastTick + " vs " + quantizeFloat(lastTick)); + lastTick = quantizeFloat(lastTick); + } + } else { + // just to be safe + now = quantizeFloat(now); + lastTick = quantizeFloat(lastTick); + } + /* + Ok, so heres the issue (Died a bit while debugging it): + + In multiplayer lockstep simulation, client A will simulate everything at T, but client B + will simulate it at T + 3. So we are running into the following precision issue: + Lets say on client A the time is T = 30. Then on clientB the time is T = 33. + Now, our timer takes 0.1 seconds and ticked at 29.90 - What does happen now? + Client A computes the timer and checks T > lastTick + interval. He computes + + 30 >= 29.90 + 0.1 <=> 30 >= 30.0000 <=> True <=> Tick performed + + However, this is what it looks on client B: + + 33 >= 32.90 + 0.1 <=> 33 >= 32.999999999999998 <=> False <=> No tick performed! + + This means that Client B will only tick at the *next* frame, which means it from now is out + of sync by one tick, which means the game will resync further or later and be not able to recover, + since it will run into the same issue over and over. + */ + + // The next tick, in our example it would be 30.0000 / 32.99999999998. In order to fix it, we quantize + // it, so its now 30.0000 / 33.0000 + const nextTick = quantizeFloat(lastTick + tickRate); + + // This check is safe, but its the only check where you may compare times. You always need to use + // this method! + return now >= nextTick; +} + +/** + * Returns if the game supports this browser + */ +export function isSupportedBrowser() { + if (navigator.userAgent.toLowerCase().indexOf("firefox") >= 0) { + return true; + } + + return isSupportedBrowserForMultiplayer(); +} + +// https://stackoverflow.com/questions/4565112/javascript-how-to-find-out-if-the-user-browser-is-chrome/13348618#13348618 +export function isSupportedBrowserForMultiplayer() { + // please note, + // that IE11 now returns undefined again for window.chrome + // and new Opera 30 outputs true for window.chrome + // but needs to check if window.opr is not undefined + // and new IE Edge outputs to true now for window.chrome + // and if not iOS Chrome check + // so use the below updated condition + + if (G_IS_MOBILE_APP || G_IS_STANDALONE) { + return true; + } + + // @ts-ignore + var isChromium = window.chrome; + var winNav = window.navigator; + var vendorName = winNav.vendor; + // @ts-ignore + var isOpera = typeof window.opr !== "undefined"; + var isIEedge = winNav.userAgent.indexOf("Edge") > -1; + var isIOSChrome = winNav.userAgent.match("CriOS"); + + if (isIOSChrome) { + // is Google Chrome on IOS + return false; + } else if ( + isChromium !== null && + typeof isChromium !== "undefined" && + vendorName === "Google Inc." && + isIEedge === false + ) { + // is Google Chrome + return true; + } else { + // not Google Chrome + return false; + } +} + +/** + * Helper function to create a json schema object + * @param {any} properties + */ +export function schemaObject(properties) { + return { + type: "object", + required: Object.keys(properties).slice(), + additionalProperties: false, + properties, + }; +} + +/** + * Quickly + * @param {number} x + * @param {number} y + * @param {number} deg + * @returns {Vector} + */ +export function fastRotateMultipleOf90(x, y, deg) { + switch (deg) { + case 0: { + return new Vector(x, y); + } + case 90: { + return new Vector(x, y); + } + } +} diff --git a/src/js/core/vector.js b/src/js/core/vector.js new file mode 100644 index 00000000..2bd6cfe9 --- /dev/null +++ b/src/js/core/vector.js @@ -0,0 +1,665 @@ +import { globalConfig } from "./config"; +import { + Math_abs, + Math_floor, + Math_PI, + Math_max, + Math_min, + Math_round, + Math_hypot, + Math_atan2, + Math_sin, + Math_cos, +} from "./builtins"; + +const tileSize = globalConfig.tileSize; +const halfTileSize = globalConfig.halfTileSize; + +/** + * @enum {string} + */ +export const enumDirection = { + top: "top", + right: "right", + bottom: "bottom", + left: "left", +}; + +/** + * @enum {string} + */ +export const enumInvertedDirections = { + [enumDirection.top]: enumDirection.bottom, + [enumDirection.right]: enumDirection.left, + [enumDirection.bottom]: enumDirection.top, + [enumDirection.left]: enumDirection.right, +}; + +/** + * @enum {number} + */ +export const enumDirectionToAngle = { + [enumDirection.top]: 0, + [enumDirection.right]: 90, + [enumDirection.bottom]: 180, + [enumDirection.left]: 270, +}; + +/** + * @enum {enumDirection} + */ +export const enumAngleToDirection = { + 0: enumDirection.top, + 90: enumDirection.right, + 180: enumDirection.bottom, + 270: enumDirection.left, +}; + +export class Vector { + /** + * + * @param {number=} x + * @param {number=} y + */ + constructor(x, y) { + this.x = x || 0; + this.y = y || 0; + } + + /** + * return a copy of the vector + * @returns {Vector} + */ + copy() { + return new Vector(this.x, this.y); + } + + /** + * Adds a vector and return a new vector + * @param {Vector} other + * @returns {Vector} + */ + add(other) { + return new Vector(this.x + other.x, this.y + other.y); + } + + /** + * Adds a vector + * @param {Vector} other + * @returns {Vector} + */ + addInplace(other) { + this.x += other.x; + this.y += other.y; + return this; + } + + /** + * Substracts a vector and return a new vector + * @param {Vector} other + * @returns {Vector} + */ + sub(other) { + return new Vector(this.x - other.x, this.y - other.y); + } + + /** + * Multiplies with a vector and return a new vector + * @param {Vector} other + * @returns {Vector} + */ + mul(other) { + return new Vector(this.x * other.x, this.y * other.y); + } + + /** + * Adds two scalars and return a new vector + * @param {number} x + * @param {number} y + * @returns {Vector} + */ + addScalars(x, y) { + return new Vector(this.x + x, this.y + y); + } + + /** + * Substracts a scalar and return a new vector + * @param {number} f + * @returns {Vector} + */ + subScalar(f) { + return new Vector(this.x - f, this.y - f); + } + + /** + * Substracts two scalars and return a new vector + * @param {number} x + * @param {number} y + * @returns {Vector} + */ + subScalars(x, y) { + return new Vector(this.x - x, this.y - y); + } + + /** + * Returns the euclidian length + * @returns {number} + */ + length() { + return Math_hypot(this.x, this.y); + } + + /** + * Returns the square length + * @returns {number} + */ + lengthSquare() { + return this.x * this.x + this.y * this.y; + } + + /** + * Divides both components by a scalar and return a new vector + * @param {number} f + * @returns {Vector} + */ + divideScalar(f) { + return new Vector(this.x / f, this.y / f); + } + + /** + * Divides both components by the given scalars and return a new vector + * @param {number} a + * @param {number} b + * @returns {Vector} + */ + divideScalars(a, b) { + return new Vector(this.x / a, this.y / b); + } + + /** + * Divides both components by a scalar + * @param {number} f + * @returns {Vector} + */ + divideScalarInplace(f) { + this.x /= f; + this.y /= f; + return this; + } + + /** + * Multiplies both components with a scalar and return a new vector + * @param {number} f + * @returns {Vector} + */ + multiplyScalar(f) { + return new Vector(this.x * f, this.y * f); + } + + /** + * Multiplies both components with two scalars and returns a new vector + * @param {number} a + * @param {number} b + * @returns {Vector} + */ + multiplyScalars(a, b) { + return new Vector(this.x * a, this.y * b); + } + + /** + * For both components, compute the maximum of each component and the given scalar, and return a new vector. + * For example: + * - new Vector(-1, 5).maxScalar(0) -> Vector(0, 5) + * @param {number} f + * @returns {Vector} + */ + maxScalar(f) { + return new Vector(Math_max(f, this.x), Math_max(f, this.y)); + } + + /** + * Adds a scalar to both components and return a new vector + * @param {number} f + * @returns {Vector} + */ + addScalar(f) { + return new Vector(this.x + f, this.y + f); + } + + /** + * Computes the component wise minimum and return a new vector + * @param {Vector} v + * @returns {Vector} + */ + min(v) { + return new Vector(Math_min(v.x, this.x), Math_min(v.y, this.y)); + } + + /** + * Computes the component wise maximum and return a new vector + * @param {Vector} v + * @returns {Vector} + */ + max(v) { + return new Vector(Math_max(v.x, this.x), Math_max(v.y, this.y)); + } + /** + * Computes the component wise absolute + * @returns {Vector} + */ + abs() { + return new Vector(Math_abs(this.x), Math_abs(this.y)); + } + + /** + * Computes the scalar product + * @param {Vector} v + * @returns {number} + */ + dot(v) { + return this.x * v.x + this.y * v.y; + } + + /** + * Computes the distance to a given vector + * @param {Vector} v + * @returns {number} + */ + distance(v) { + return Math_hypot(this.x - v.x, this.y - v.y); + } + + /** + * Computes the square distance to a given vectort + * @param {Vector} v + * @returns {number} + */ + distanceSquare(v) { + const dx = this.x - v.x; + const dy = this.y - v.y; + return dx * dx + dy * dy; + } + + /** + * Computes and returns the center between both points + * @param {Vector} v + * @returns {Vector} + */ + centerPoint(v) { + const cx = this.x + v.x; + const cy = this.y + v.y; + return new Vector(cx / 2, cy / 2); + } + + /** + * Computes componentwise floor and return a new vector + * @returns {Vector} + */ + floor() { + return new Vector(Math_floor(this.x), Math_floor(this.y)); + } + + /** + * Computes componentwise round and return a new vector + * @returns {Vector} + */ + round() { + return new Vector(Math_round(this.x), Math_round(this.y)); + } + + /** + * Converts this vector from world to tile space and return a new vector + * @returns {Vector} + */ + toTileSpace() { + return new Vector(Math_floor(this.x / tileSize), Math_floor(this.y / tileSize)); + } + + /** + * Converts this vector from world to street space and return a new vector + * @returns {Vector} + */ + toStreetSpace() { + return new Vector(Math_floor(this.x / halfTileSize + 0.25), Math_floor(this.y / halfTileSize + 0.25)); + } + + /** + * Converts this vector to world space and return a new vector + * @returns {Vector} + */ + toWorldSpace() { + return new Vector(this.x * tileSize, this.y * tileSize); + } + + /** + * Converts this vector to world space and return a new vector + * @returns {Vector} + */ + toWorldSpaceCenterOfTile() { + return new Vector(this.x * tileSize + halfTileSize, this.y * tileSize + halfTileSize); + } + + /** + * Converts the top left tile position of this vector + * @returns {Vector} + */ + snapWorldToTile() { + return new Vector(Math_floor(this.x / tileSize) * tileSize, Math_floor(this.y / tileSize) * tileSize); + } + + /** + * Normalizes the vector, dividing by the length(), and return a new vector + * @returns {Vector} + */ + normalize() { + const len = Math_max(1e-5, Math_hypot(this.x, this.y)); + return new Vector(this.x / len, this.y / len); + } + + /** + * Normalizes the vector, dividing by the length(), and return a new vector + * @returns {Vector} + */ + normalizeIfGreaterOne() { + const len = Math_max(1, Math_hypot(this.x, this.y)); + return new Vector(this.x / len, this.y / len); + } + + /** + * Returns the normalized vector to the other point + * @param {Vector} v + * @returns {Vector} + */ + normalizedDirection(v) { + const dx = v.x - this.x; + const dy = v.y - this.y; + const len = Math_max(1e-5, Math_hypot(dx, dy)); + return new Vector(dx / len, dy / len); + } + + /** + * Returns a perpendicular vector + * @returns {Vector} + */ + findPerpendicular() { + return new Vector(-this.y, this.x); + } + + /** + * Returns the unnormalized direction to the other point + * @param {Vector} v + * @returns {Vector} + */ + direction(v) { + return new Vector(v.x - this.x, v.y - this.y); + } + + /** + * Returns a string representation of the vector + * @returns {string} + */ + toString() { + return this.x + "," + this.y; + } + + /** + * Compares both vectors for exact equality. Does not do an epsilon compare + * @param {Vector} v + * @returns {Boolean} + */ + equals(v) { + return this.x === v.x && this.y === v.y; + } + + /** + * Rotates this vector + * @param {number} angle + * @returns {Vector} new vector + */ + rotated(angle) { + const sin = Math_sin(angle); + const cos = Math_cos(angle); + return new Vector(this.x * cos - this.y * sin, this.x * sin + this.y * cos); + } + + /** + * Rotates this vector + * @param {number} angle + * @returns {Vector} this vector + */ + rotateInplaceFastMultipleOf90(angle) { + // const sin = Math_sin(angle); + // const cos = Math_cos(angle); + // let sin = 0, cos = 1; + assert(angle >= 0 && angle <= 360, "Invalid angle, please clamp first: " + angle); + + switch (angle) { + case 0: + case 360: { + return this; + } + case 90: { + // sin = 1; + // cos = 0; + + const x = this.x; + this.x = -this.y; + this.y = x; + return this; + } + case 180: { + // sin = 0 + // cos = -1 + this.x = -this.x; + this.y = -this.y; + return this; + } + case 270: { + // sin = -1 + // cos = 0 + const x = this.x; + this.x = this.y; + this.y = -x; + return this; + } + default: { + assertAlways(false, "Invalid fast inplace rotation: " + angle); + return this; + } + } + // return new Vector(this.x * cos - this.y * sin, this.x * sin + this.y * cos); + } + + /** + * Rotates this vector + * @param {number} angle + * @returns {Vector} new vector + */ + rotateFastMultipleOf90(angle) { + assert(angle >= 0 && angle <= 360, "Invalid angle, please clamp first: " + angle); + + switch (angle) { + case 360: + case 0: { + return new Vector(this.x, this.y); + } + case 90: { + return new Vector(-this.y, this.x); + } + case 180: { + return new Vector(-this.x, -this.y); + } + case 270: { + return new Vector(this.y, -this.x); + } + default: { + assertAlways(false, "Invalid fast inplace rotation: " + angle); + return new Vector(); + } + } + } + + /** + * Helper method to rotate a direction + * @param {enumDirection} direction + * @param {number} angle + * @returns {enumDirection} + */ + static transformDirectionFromMultipleOf90(direction, angle) { + if (angle === 0 || angle === 360) { + return direction; + } + assert(angle >= 0 && angle <= 360, "Invalid angle: " + angle); + switch (direction) { + case enumDirection.top: { + switch (angle) { + case 90: + return enumDirection.right; + case 180: + return enumDirection.bottom; + case 270: + return enumDirection.left; + default: + assertAlways(false, "Invalid angle: " + angle); + return; + } + } + + case enumDirection.right: { + switch (angle) { + case 90: + return enumDirection.bottom; + case 180: + return enumDirection.left; + case 270: + return enumDirection.top; + default: + assertAlways(false, "Invalid angle: " + angle); + return; + } + } + + case enumDirection.bottom: { + switch (angle) { + case 90: + return enumDirection.left; + case 180: + return enumDirection.top; + case 270: + return enumDirection.right; + default: + assertAlways(false, "Invalid angle: " + angle); + return; + } + } + + case enumDirection.left: { + switch (angle) { + case 90: + return enumDirection.top; + case 180: + return enumDirection.right; + case 270: + return enumDirection.bottom; + default: + assertAlways(false, "Invalid angle: " + angle); + return; + } + } + default: + assertAlways(false, "Invalid angle: " + angle); + return; + } + } + + /** + * Compares both vectors for epsilon equality + * @param {Vector} v + * @returns {Boolean} + */ + equalsEpsilon(v, epsilon = 1e-5) { + return Math_abs(this.x - v.x) < 1e-5 && Math_abs(this.y - v.y) < epsilon; + } + + /** + * Returns the angle + * @returns {number} 0 .. 2 PI + */ + angle() { + return Math_atan2(this.y, this.x) + Math_PI / 2; + } + + /** + * Serializes the vector to a string + * @returns {string} + */ + serializeTile() { + return String.fromCharCode(33 + this.x) + String.fromCharCode(33 + this.y); + } + + /** + * Creates a simple representation of the vector + */ + serializeSimple() { + return { x: this.x, y: this.y }; + } + + /** + * @returns {number} + */ + serializeTileToInt() { + return this.x + this.y * 256; + } + + /** + * + * @param {number} i + * @returns {Vector} + */ + static deserializeTileFromInt(i) { + const x = i % 256; + const y = Math_floor(i / 256); + return new Vector(x, y); + } + + /** + * Deserializes a vector from a string + * @param {string} s + * @returns {Vector} + */ + static deserializeTile(s) { + return new Vector(s.charCodeAt(0) - 33, s.charCodeAt(1) - 33); + } + + /** + * Deserializes a vector from a serialized json object + * @param {object} obj + * @returns {Vector} + */ + static fromSerializedObject(obj) { + if (obj) { + return new Vector(obj.x || 0, obj.y || 0); + } + } +} + +/** + * Interpolates two vectors, for a = 0, returns v1 and for a = 1 return v2, otherwise interpolate + * @param {Vector} v1 + * @param {Vector} v2 + * @param {number} a + */ +export function mixVector(v1, v2, a) { + return new Vector(v1.x * (1 - a) + v2.x * a, v1.y * (1 - a) + v2.y * a); +} + +/** + * Mapping from string direction to actual vector + * @enum {Vector} + */ +export const enumDirectionToVector = { + top: new Vector(0, -1), + right: new Vector(1, 0), + bottom: new Vector(0, 1), + left: new Vector(-1, 0), +}; diff --git a/src/js/game/automatic_save.js b/src/js/game/automatic_save.js new file mode 100644 index 00000000..03686603 --- /dev/null +++ b/src/js/game/automatic_save.js @@ -0,0 +1,80 @@ +import { GameRoot } from "./root"; +import { globalConfig, IS_DEBUG } from "../core/config"; +import { Math_max } from "../core/builtins"; + +// How important it is that a savegame is created +/** + * @enum {number} + */ +export const enumSavePriority = { + regular: 2, + asap: 100, +}; + +// Internals +let MIN_INTERVAL_SECS = 15; + +if (G_IS_DEV && IS_DEBUG) { + // // Testing + // MIN_INTERVAL_SECS = 1; + // MAX_INTERVAL_SECS = 1; + MIN_INTERVAL_SECS = 9999999; +} + +export class AutomaticSave { + constructor(root) { + /** @type {GameRoot} */ + this.root = root; + + // Store the current maximum save importance + this.saveImportance = enumSavePriority.regular; + + this.lastSaveAttempt = -1000; + } + + setSaveImportance(importance) { + this.saveImportance = Math_max(this.saveImportance, importance); + } + + doSave() { + if (G_IS_DEV && globalConfig.debug.disableSavegameWrite) { + return; + } + + this.root.gameState.doSave(); + this.saveImportance = enumSavePriority.regular; + } + + update() { + if (!this.root.gameInitialized) { + // Bad idea + return; + } + // Check when the last save was, but make sure that if it fails, we don't spam + const lastSaveTime = Math_max(this.lastSaveAttempt, this.root.savegame.getRealLastUpdate()); + + let secondsSinceLastSave = (Date.now() - lastSaveTime) / 1000.0; + let shouldSave = false; + + switch (this.saveImportance) { + case enumSavePriority.asap: + // High always should save + shouldSave = true; + break; + + case enumSavePriority.regular: + // Could determine if there is a good / bad point here + shouldSave = secondsSinceLastSave > MIN_INTERVAL_SECS; + break; + + default: + assert(false, "Unknown save prio: " + this.saveImportance); + break; + } + if (shouldSave) { + // log(this, "Saving automatically"); + this.lastSaveAttempt = Date.now(); + this.doSave(); + } + } +} diff --git a/src/js/game/base_item.js b/src/js/game/base_item.js new file mode 100644 index 00000000..a4bd5e68 --- /dev/null +++ b/src/js/game/base_item.js @@ -0,0 +1,33 @@ +import { DrawParameters } from "../core/draw_parameters"; +import { BasicSerializableObject, types } from "../savegame/serialization"; + +/** + * Class for items on belts etc. Not an entity for performance reasons + */ +export class BaseItem extends BasicSerializableObject { + constructor() { + super(); + } + + static getId() { + return "base_item"; + } + + /** @returns {object} */ + static getSchema() { + return {}; + } + + /** + * Draws the item at the given position + * @param {number} x + * @param {number} y + * @param {DrawParameters} parameters + * @param {number=} size + */ + draw(x, y, parameters, size) {} + + getBackgroundColorAsResource() { + return "#eaebec"; + } +} diff --git a/src/js/game/buildings/belt_base.js b/src/js/game/buildings/belt_base.js new file mode 100644 index 00000000..f021f74e --- /dev/null +++ b/src/js/game/buildings/belt_base.js @@ -0,0 +1,204 @@ +import { Loader } from "../../core/loader"; +import { enumAngleToDirection, enumDirection, Vector } from "../../core/vector"; +import { BeltComponent } from "../components/belt"; +import { ItemAcceptorComponent } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { ReplaceableMapEntityComponent } from "../components/replaceable_map_entity"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; + +export const arrayBeltVariantToRotation = [enumDirection.top, enumDirection.left, enumDirection.right]; + +export class MetaBeltBaseBuilding extends MetaBuilding { + constructor() { + super("belt"); + } + + getSilhouetteColor() { + return "#777"; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new BeltComponent({ + direction: enumDirection.top, // updated later + }) + ); + + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ], + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, // updated later + }, + ], + instantEject: true, + }) + ); + // Make this entity replaceabel + entity.addComponent(new ReplaceableMapEntityComponent()); + } + + /** + * + * @param {Entity} entity + * @param {number} rotationVariant + */ + updateRotationVariant(entity, rotationVariant) { + entity.components.Belt.direction = arrayBeltVariantToRotation[rotationVariant]; + entity.components.ItemEjector.slots[0].direction = arrayBeltVariantToRotation[rotationVariant]; + + entity.components.StaticMapEntity.spriteKey = null; + } + + /** + * Computes optimal belt rotation variant + * @param {GameRoot} root + * @param {Vector} tile + * @param {number} rotation + * @return {{ rotation: number, rotationVariant: number }} + */ + computeOptimalDirectionAndRotationVariantAtTile(root, tile, rotation) { + const topDirection = enumAngleToDirection[rotation]; + const rightDirection = enumAngleToDirection[(rotation + 90) % 360]; + const bottomDirection = enumAngleToDirection[(rotation + 180) % 360]; + const leftDirection = enumAngleToDirection[(rotation + 270) % 360]; + + const { ejectors, acceptors } = root.logic.getEjectorsAndAcceptorsAtTile(tile); + + let hasBottomEjector = false; + let hasLeftEjector = false; + let hasRightEjector = false; + + let hasTopAcceptor = false; + let hasLeftAcceptor = false; + let hasRightAcceptor = false; + + // Check all ejectors + for (let i = 0; i < ejectors.length; ++i) { + const ejector = ejectors[i]; + + if (ejector.toDirection === topDirection) { + hasBottomEjector = true; + } else if (ejector.toDirection === leftDirection) { + hasLeftEjector = true; + } else if (ejector.toDirection === rightDirection) { + hasRightEjector = true; + } + } + + // Check all acceptors + for (let i = 0; i < acceptors.length; ++i) { + const acceptor = acceptors[i]; + if (acceptor.fromDirection === bottomDirection) { + hasTopAcceptor = true; + } else if (acceptor.fromDirection === rightDirection) { + hasLeftAcceptor = true; + } else if (acceptor.fromDirection === leftDirection) { + hasRightAcceptor = true; + } + } + + // Soo .. if there is any ejector below us we always prioritize + // this ejector + if (!hasBottomEjector) { + // When something ejects to us from the left and nothing from the right, + // do a curve from the left to the top + if (hasLeftEjector && !hasRightEjector) { + return { + rotation: (rotation + 270) % 360, + rotationVariant: 2, + }; + } + + // When something ejects to us from the right and nothing from the left, + // do a curve from the right to the top + if (hasRightEjector && !hasLeftEjector) { + return { + rotation: (rotation + 90) % 360, + rotationVariant: 1, + }; + } + } + + // When there is a top acceptor, ignore sides + // NOTICE: This makes the belt prefer side turns *way* too much! + // if (!hasTopAcceptor) { + // // When there is an acceptor to the right but no acceptor to the left, + // // do a turn to the right + // if (hasRightAcceptor && !hasLeftAcceptor) { + // return { + // rotation, + // rotationVariant: 2, + // }; + // } + + // // When there is an acceptor to the left but no acceptor to the right, + // // do a turn to the left + // if (hasLeftAcceptor && !hasRightAcceptor) { + // return { + // rotation, + // rotationVariant: 1, + // }; + // } + // } + + return { + rotation, + rotationVariant: 0, + }; + } + + getName() { + return "Belt"; + } + + getDescription() { + return "Transports items, hold and drag to place multiple, press 'R' to rotate."; + } + + getPreviewSprite(rotationVariant) { + switch (arrayBeltVariantToRotation[rotationVariant]) { + case enumDirection.top: { + return Loader.getSprite("sprites/belt/forward_0.png"); + } + case enumDirection.left: { + return Loader.getSprite("sprites/belt/left_0.png"); + } + case enumDirection.right: { + return Loader.getSprite("sprites/belt/right_0.png"); + } + default: { + assertAlways(false, "Invalid belt rotation variant"); + } + } + } + + getStayInPlacementMode() { + return true; + } + + /** + * Can be overridden + */ + internalGetBeltDirection(rotationVariant) { + return enumDirection.top; + } +} diff --git a/src/js/game/buildings/cutter.js b/src/js/game/buildings/cutter.js new file mode 100644 index 00000000..07a574f7 --- /dev/null +++ b/src/js/game/buildings/cutter.js @@ -0,0 +1,71 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { enumItemAcceptorItemFilter, ItemAcceptorComponent } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +export class MetaCutterBuilding extends MetaBuilding { + constructor() { + super("cutter"); + } + + getSilhouetteColor() { + return "#7dcda2"; + } + + getDimensions() { + return new Vector(2, 1); + } + + getName() { + return "Cut Half"; + } + + getDescription() { + return "Cuts shapes from top to bottom and outputs both halfs. If you use only one part, be sure to destroy the other part or it will stall!"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_cutter_and_trash); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.cutter, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { pos: new Vector(0, 0), direction: enumDirection.top }, + { pos: new Vector(1, 0), direction: enumDirection.top }, + ], + }) + ); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/hub.js b/src/js/game/buildings/hub.js new file mode 100644 index 00000000..6186597e --- /dev/null +++ b/src/js/game/buildings/hub.js @@ -0,0 +1,125 @@ +import { enumDirection, Vector } from "../../core/vector"; +import { enumItemAcceptorItemFilter, ItemAcceptorComponent } from "../components/item_acceptor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { ItemProcessorComponent, enumItemProcessorTypes } from "../components/item_processor"; +import { globalConfig } from "../../core/config"; +import { UnremovableComponent } from "../components/unremovable"; +import { HubComponent } from "../components/hub"; + +export class MetaHubBuilding extends MetaBuilding { + constructor() { + super("hub"); + } + + getDimensions() { + return new Vector(4, 4); + } + + getSilhouetteColor() { + return "#eb5555"; + } + + getName() { + return "Hub"; + } + + getDescription() { + return "Your central hub, deliver shapes to it to unlock new buildings."; + } + + isRotateable() { + return false; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent(new HubComponent()); + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.hub, + }) + ); + entity.addComponent(new UnremovableComponent()); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.top, enumDirection.left], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.top], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(2, 0), + directions: [enumDirection.top], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(3, 0), + directions: [enumDirection.top, enumDirection.right], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(0, 3), + directions: [enumDirection.bottom, enumDirection.left], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(1, 3), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(2, 3), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(3, 3), + directions: [enumDirection.bottom, enumDirection.right], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(0, 1), + directions: [enumDirection.left], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(0, 2), + directions: [enumDirection.left], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(0, 3), + directions: [enumDirection.left], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(3, 1), + directions: [enumDirection.right], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(3, 2), + directions: [enumDirection.right], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(3, 3), + directions: [enumDirection.right], + filter: enumItemAcceptorItemFilter.shape, + }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/miner.js b/src/js/game/buildings/miner.js new file mode 100644 index 00000000..83791504 --- /dev/null +++ b/src/js/game/buildings/miner.js @@ -0,0 +1,36 @@ +import { enumDirection, Vector } from "../../core/vector"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { MinerComponent } from "../components/miner"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; + +export class MetaMinerBuilding extends MetaBuilding { + constructor() { + super("miner"); + } + + getName() { + return "Extract"; + } + + getSilhouetteColor() { + return "#b37dcd"; + } + + getDescription() { + return "Place over a shape or color to extract it. Six extractors fill exactly one belt."; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent(new MinerComponent({})); + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ); + } +} diff --git a/src/js/game/buildings/mixer.js b/src/js/game/buildings/mixer.js new file mode 100644 index 00000000..15c7d699 --- /dev/null +++ b/src/js/game/buildings/mixer.js @@ -0,0 +1,73 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { ItemAcceptorComponent, enumItemAcceptorItemFilter } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +export class MetaMixerBuilding extends MetaBuilding { + constructor() { + super("mixer"); + } + + getDimensions() { + return new Vector(2, 1); + } + + getName() { + return "Mix Colors"; + } + + getDescription() { + return "Mixes two colors using additive blending."; + } + + getSilhouetteColor() { + return "#cdbb7d"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_mixer); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 2, + processorType: enumItemProcessorTypes.mixer, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.color, + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.color, + }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/painter.js b/src/js/game/buildings/painter.js new file mode 100644 index 00000000..746f9070 --- /dev/null +++ b/src/js/game/buildings/painter.js @@ -0,0 +1,73 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { enumItemAcceptorItemFilter, ItemAcceptorComponent } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { enumHubGoalRewards } from "../tutorial_goals"; +import { GameRoot } from "../root"; + +export class MetaPainterBuilding extends MetaBuilding { + constructor() { + super("painter"); + } + + getDimensions() { + return new Vector(2, 1); + } + + getName() { + return "Dye"; + } + + getDescription() { + return "Colors the whole shape on the left input with the color from the right input."; + } + + getSilhouetteColor() { + return "#cd9b7d"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_painter); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 2, + processorType: enumItemProcessorTypes.painter, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.color, + }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/rotater.js b/src/js/game/buildings/rotater.js new file mode 100644 index 00000000..6c129115 --- /dev/null +++ b/src/js/game/buildings/rotater.js @@ -0,0 +1,64 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { ItemAcceptorComponent, enumItemAcceptorItemFilter } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { enumHubGoalRewards } from "../tutorial_goals"; +import { GameRoot } from "../root"; + +export class MetaRotaterBuilding extends MetaBuilding { + constructor() { + super("rotater"); + } + + getName() { + return "Rotate"; + } + + getDescription() { + return "Rotates shapes clockwise by 90 degrees."; + } + + getSilhouetteColor() { + return "#7dc6cd"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.rotater, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/splitter.js b/src/js/game/buildings/splitter.js new file mode 100644 index 00000000..4e6370e6 --- /dev/null +++ b/src/js/game/buildings/splitter.js @@ -0,0 +1,80 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { ItemAcceptorComponent } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +export class MetaSplitterBuilding extends MetaBuilding { + constructor() { + super("splitter"); + } + + getDimensions() { + return new Vector(2, 1); + } + + getName() { + return "Distribute"; + } + + getSilhouetteColor() { + return "#444"; + } + + getDescription() { + return "Accepts up to two inputs and evenly distributes them on the outputs. Can also be used to merge two inputs into one output."; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_splitter); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.bottom], + }, + ], + }) + ); + + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.splitter, + + beltUnderlays: [ + { pos: new Vector(0, 0), direction: enumDirection.top }, + { pos: new Vector(1, 0), direction: enumDirection.top }, + ], + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { pos: new Vector(0, 0), direction: enumDirection.top }, + { pos: new Vector(1, 0), direction: enumDirection.top }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/stacker.js b/src/js/game/buildings/stacker.js new file mode 100644 index 00000000..5edfb050 --- /dev/null +++ b/src/js/game/buildings/stacker.js @@ -0,0 +1,73 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { ItemAcceptorComponent, enumItemAcceptorItemFilter } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +export class MetaStackerBuilding extends MetaBuilding { + constructor() { + super("stacker"); + } + + getName() { + return "Combine"; + } + + getSilhouetteColor() { + return "#9fcd7d"; + } + + getDescription() { + return "Combines both items. If they can not be merged, the right item is placed above the left item."; + } + + getDimensions() { + return new Vector(2, 1); + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_stacker); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 2, + processorType: enumItemProcessorTypes.stacker, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/trash.js b/src/js/game/buildings/trash.js new file mode 100644 index 00000000..e630255c --- /dev/null +++ b/src/js/game/buildings/trash.js @@ -0,0 +1,73 @@ +import { enumDirection, Vector } from "../../core/vector"; +import { ItemAcceptorComponent } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { enumHubGoalRewards } from "../tutorial_goals"; +import { GameRoot } from "../root"; + +export class MetaTrashBuilding extends MetaBuilding { + constructor() { + super("trash"); + } + + getName() { + return "Destroyer"; + } + + getDescription() { + return "Accepts inputs from all sides and destroys them. Forever."; + } + + isRotateable() { + return false; + } + + getSilhouetteColor() { + return "#cd7d86"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_cutter_and_trash); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.trash, + }) + ); + + // Required, since the item processor needs this. + entity.addComponent( + new ItemEjectorComponent({ + slots: [], + }) + ); + + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [ + enumDirection.top, + enumDirection.right, + enumDirection.bottom, + enumDirection.left, + ], + }, + ], + }) + ); + } +} diff --git a/src/js/game/buildings/underground_belt.js b/src/js/game/buildings/underground_belt.js new file mode 100644 index 00000000..31021c6e --- /dev/null +++ b/src/js/game/buildings/underground_belt.js @@ -0,0 +1,158 @@ +import { Loader } from "../../core/loader"; +import { enumDirection, Vector, enumAngleToDirection, enumDirectionToVector } from "../../core/vector"; +import { ItemAcceptorComponent } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components/underground_belt"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { globalConfig } from "../../core/config"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +/** @enum {string} */ +export const arrayUndergroundRotationVariantToMode = [ + enumUndergroundBeltMode.sender, + enumUndergroundBeltMode.receiver, +]; + +export class MetaUndergroundBeltBuilding extends MetaBuilding { + constructor() { + super("underground_belt"); + } + + getName() { + return "Tunnel"; + } + + getSilhouetteColor() { + return "#555"; + } + + getDescription() { + return "Allows to tunnel resources under buildings and belts."; + } + + getFlipOrientationAfterPlacement() { + return true; + } + + getStayInPlacementMode() { + return true; + } + + getPreviewSprite(rotationVariant) { + switch (arrayUndergroundRotationVariantToMode[rotationVariant]) { + case enumUndergroundBeltMode.sender: + return Loader.getSprite("sprites/buildings/underground_belt_entry.png"); + case enumUndergroundBeltMode.receiver: + return Loader.getSprite("sprites/buildings/underground_belt_exit.png"); + default: + assertAlways(false, "Invalid rotation variant"); + } + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_tunnel); + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + // Required, since the item processor needs this. + entity.addComponent( + new ItemEjectorComponent({ + slots: [], + }) + ); + + entity.addComponent(new UndergroundBeltComponent({})); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [], + }) + ); + } + + /** + * @param {GameRoot} root + * @param {Vector} tile + * @param {number} rotation + * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }} + */ + computeOptimalDirectionAndRotationVariantAtTile(root, tile, rotation) { + const searchDirection = enumAngleToDirection[rotation]; + const searchVector = enumDirectionToVector[searchDirection]; + + const targetRotation = (rotation + 180) % 360; + + for (let searchOffset = 1; searchOffset <= globalConfig.undergroundBeltMaxTiles; ++searchOffset) { + tile = tile.addScalars(searchVector.x, searchVector.y); + + const contents = root.map.getTileContent(tile); + if (contents) { + const undergroundComp = contents.components.UndergroundBelt; + if (undergroundComp) { + const staticComp = contents.components.StaticMapEntity; + if (staticComp.rotationDegrees === targetRotation) { + if (undergroundComp.mode !== enumUndergroundBeltMode.sender) { + // If we encounter an underground receiver on our way which is also faced in our direction, we don't accept that + break; + } + // console.log("GOT IT! rotation is", rotation, "and target is", staticComp.rotationDegrees); + + return { + rotation: targetRotation, + rotationVariant: 1, + connectedEntities: [contents], + }; + } + } + } + } + + return { + rotation, + rotationVariant: 0, + }; + } + + /** + * @param {Entity} entity + * @param {number} rotationVariant + */ + updateRotationVariant(entity, rotationVariant) { + entity.components.StaticMapEntity.spriteKey = this.getPreviewSprite(rotationVariant).spriteName; + + switch (arrayUndergroundRotationVariantToMode[rotationVariant]) { + case enumUndergroundBeltMode.sender: { + entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.sender; + entity.components.ItemEjector.setSlots([]); + entity.components.ItemAcceptor.setSlots([ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ]); + return; + } + case enumUndergroundBeltMode.receiver: { + entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.receiver; + entity.components.ItemAcceptor.setSlots([]); + entity.components.ItemEjector.setSlots([ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + ]); + return; + } + default: + assertAlways(false, "Invalid rotation variant"); + } + } +} diff --git a/src/js/game/camera.js b/src/js/game/camera.js new file mode 100644 index 00000000..f302f543 --- /dev/null +++ b/src/js/game/camera.js @@ -0,0 +1,870 @@ +import { + Math_abs, + Math_ceil, + Math_floor, + Math_min, + Math_random, + performanceNow, + Math_max, +} from "../core/builtins"; +import { Rectangle } from "../core/rectangle"; +import { Signal, STOP_PROPAGATION } from "../core/signal"; +import { clamp, lerp } from "../core/utils"; +import { mixVector, Vector } from "../core/vector"; +import { globalConfig } from "../core/config"; +import { GameRoot } from "./root"; +import { BasicSerializableObject, types } from "../savegame/serialization"; +import { clickDetectorGlobals } from "../core/click_detector"; +import { createLogger } from "../core/logging"; + +const logger = createLogger("camera"); + +export const USER_INTERACT_MOVE = "move"; +export const USER_INTERACT_ZOOM = "zoom"; +export const USER_INTERACT_TOUCHEND = "touchend"; + +const velocitySmoothing = 0.5; +const velocityFade = 0.98; +const velocityStrength = 0.4; +const velocityMax = 20; + +export class Camera extends BasicSerializableObject { + constructor(root) { + super(); + + /** @type {GameRoot} */ + this.root = root; + + // Zoom level, 2 means double size + + // Find optimal initial zoom + + this.zoomLevel = this.findInitialZoom(); + this.clampZoomLevel(); + + /** @type {Vector} */ + this.center = new Vector(0, 0); + + // Input handling + this.currentlyMoving = false; + this.lastMovingPosition = null; + this.cameraUpdateTimeBucket = 0.0; + this.didMoveSinceTouchStart = false; + this.currentlyPinching = false; + this.lastPinchPositions = null; + + this.keyboardForce = new Vector(); + + // Signal which gets emitted once the user changed something + this.userInteraction = new Signal(); + + /** @type {Vector} */ + this.currentShake = new Vector(0, 0); + + /** @type {Vector} */ + this.currentPan = new Vector(0, 0); + + // Set desired pan (camera movement) + /** @type {Vector} */ + this.desiredPan = new Vector(0, 0); + + // Set desired camera center + /** @type {Vector} */ + this.desiredCenter = null; + + // Set desired camera zoom + /** @type {number} */ + this.desiredZoom = null; + + /** @type {Vector} */ + this.touchPostMoveVelocity = new Vector(0, 0); + + // Handlers + this.downPreHandler = new Signal(/* pos */); + this.movePreHandler = new Signal(/* pos */); + this.pinchPreHandler = new Signal(/* pos */); + this.upPostHandler = new Signal(/* pos */); + + this.internalInitEvents(); + this.clampZoomLevel(); + this.bindKeys(); + } + + // Serialization + static getId() { + return "Camera"; + } + + static getSchema() { + return { + zoomLevel: types.float, + center: types.vector, + }; + } + + deserialize(data) { + const errorCode = super.deserialize(data); + if (errorCode) { + return errorCode; + } + + // Safety + this.clampZoomLevel(); + } + + // Simple geters & setters + + addScreenShake(amount) { + const currentShakeAmount = this.currentShake.length(); + const scale = 1 / (1 + 3 * currentShakeAmount); + this.currentShake.x = this.currentShake.x + 2 * (Math_random() - 0.5) * scale * amount; + this.currentShake.y = this.currentShake.y + 2 * (Math_random() - 0.5) * scale * amount; + } + + /** + * Sets a point in world space to focus on + * @param {Vector} center + */ + setDesiredCenter(center) { + this.desiredCenter = center.copy(); + this.currentlyMoving = false; + } + + /** + * Returns if this camera is currently moving by a non-user interaction + */ + isCurrentlyMovingToDesiredCenter() { + return this.desiredCenter !== null; + } + + /** + * Sets the camera pan, every frame the camera will move by this amount + * @param {Vector} pan + */ + setPan(pan) { + this.desiredPan = pan.copy(); + } + + /** + * Finds a good initial zoom level + */ + findInitialZoom() { + return 3; + const desiredWorldSpaceWidth = 20 * globalConfig.tileSize; + const zoomLevelX = this.root.gameWidth / desiredWorldSpaceWidth; + const zoomLevelY = this.root.gameHeight / desiredWorldSpaceWidth; + + const finalLevel = Math_min(zoomLevelX, zoomLevelY); + assert( + Number.isFinite(finalLevel) && finalLevel > 0, + "Invalid zoom level computed for initial zoom: " + finalLevel + ); + return finalLevel; + } + + /** + * Clears all animations + */ + clearAnimations() { + this.touchPostMoveVelocity.x = 0; + this.touchPostMoveVelocity.y = 0; + this.desiredCenter = null; + this.desiredPan.x = 0; + this.desiredPan.y = 0; + this.currentPan.x = 0; + this.currentPan.y = 0; + this.currentlyPinching = false; + this.currentlyMoving = false; + this.lastMovingPosition = null; + this.didMoveSinceTouchStart = false; + this.desiredZoom = null; + } + + /** + * Returns if the user is currently interacting with the camera + * @returns {boolean} true if the user interacts + */ + isCurrentlyInteracting() { + if (this.currentlyPinching) { + return true; + } + if (this.currentlyMoving) { + // Only interacting if moved at least once + return this.didMoveSinceTouchStart; + } + if (this.touchPostMoveVelocity.lengthSquare() > 1) { + return true; + } + return false; + } + + /** + * Returns if in the next frame the viewport will change + * @returns {boolean} true if it willchange + */ + viewportWillChange() { + return this.desiredCenter !== null || this.desiredZoom !== null || this.isCurrentlyInteracting(); + } + + /** + * Cancels all interactions, that is user interaction and non user interaction + */ + cancelAllInteractions() { + this.touchPostMoveVelocity = new Vector(0, 0); + this.desiredCenter = null; + this.currentlyMoving = false; + this.currentlyPinching = false; + this.desiredZoom = null; + } + + /** + * Returns effective viewport width + */ + getViewportWidth() { + return this.root.gameWidth / this.zoomLevel; + } + + /** + * Returns effective viewport height + */ + getViewportHeight() { + return this.root.gameHeight / this.zoomLevel; + } + + /** + * Returns effective world space viewport left + */ + getViewportLeft() { + return this.center.x - this.getViewportWidth() / 2 + (this.currentShake.x * 10) / this.zoomLevel; + } + + /** + * Returns effective world space viewport right + */ + getViewportRight() { + return this.center.x + this.getViewportWidth() / 2 + (this.currentShake.x * 10) / this.zoomLevel; + } + + /** + * Returns effective world space viewport top + */ + getViewportTop() { + return this.center.y - this.getViewportHeight() / 2 + (this.currentShake.x * 10) / this.zoomLevel; + } + + /** + * Returns effective world space viewport bottom + */ + getViewportBottom() { + return this.center.y + this.getViewportHeight() / 2 + (this.currentShake.x * 10) / this.zoomLevel; + } + + /** + * Returns the visible world space rect + * @returns {Rectangle} + */ + getVisibleRect() { + return Rectangle.fromTRBL( + Math_floor(this.getViewportTop()), + Math_ceil(this.getViewportRight()), + Math_ceil(this.getViewportBottom()), + Math_floor(this.getViewportLeft()) + ); + } + + getIsMapOverlayActive() { + return this.zoomLevel < globalConfig.mapChunkOverviewMinZoom; + } + + /** + * Attaches all event listeners + */ + internalInitEvents() { + this.eventListenerTouchStart = this.onTouchStart.bind(this); + this.eventListenerTouchEnd = this.onTouchEnd.bind(this); + this.eventListenerTouchMove = this.onTouchMove.bind(this); + this.eventListenerMousewheel = this.onMouseWheel.bind(this); + this.eventListenerMouseDown = this.onMouseDown.bind(this); + this.eventListenerMouseMove = this.onMouseMove.bind(this); + this.eventListenerMouseUp = this.onMouseUp.bind(this); + + this.root.canvas.addEventListener("touchstart", this.eventListenerTouchStart); + this.root.canvas.addEventListener("touchend", this.eventListenerTouchEnd); + this.root.canvas.addEventListener("touchcancel", this.eventListenerTouchEnd); + this.root.canvas.addEventListener("touchmove", this.eventListenerTouchMove); + + this.root.canvas.addEventListener("wheel", this.eventListenerMousewheel); + this.root.canvas.addEventListener("mousedown", this.eventListenerMouseDown); + this.root.canvas.addEventListener("mousemove", this.eventListenerMouseMove); + this.root.canvas.addEventListener("mouseup", this.eventListenerMouseUp); + this.root.canvas.addEventListener("mouseout", this.eventListenerMouseUp); + } + + /** + * Cleans up all event listeners + */ + cleanup() { + this.root.canvas.removeEventListener("touchstart", this.eventListenerTouchStart); + this.root.canvas.removeEventListener("touchend", this.eventListenerTouchEnd); + this.root.canvas.removeEventListener("touchcancel", this.eventListenerTouchEnd); + this.root.canvas.removeEventListener("touchmove", this.eventListenerTouchMove); + + this.root.canvas.removeEventListener("wheel", this.eventListenerMousewheel); + this.root.canvas.removeEventListener("mousedown", this.eventListenerMouseDown); + this.root.canvas.removeEventListener("mousemove", this.eventListenerMouseMove); + this.root.canvas.removeEventListener("mouseup", this.eventListenerMouseUp); + this.root.canvas.removeEventListener("mouseout", this.eventListenerMouseUp); + } + + /** + * Binds the arrow keys + */ + bindKeys() { + const mapper = this.root.gameState.keyActionMapper; + mapper.getBinding("map_move_up").add(() => (this.keyboardForce.y = -1)); + mapper.getBinding("map_move_down").add(() => (this.keyboardForce.y = 1)); + mapper.getBinding("map_move_right").add(() => (this.keyboardForce.x = 1)); + mapper.getBinding("map_move_left").add(() => (this.keyboardForce.x = -1)); + + mapper.getBinding("center_map").add(() => (this.desiredCenter = new Vector(0, 0))); + } + + /** + * Converts from screen to world space + * @param {Vector} screen + * @returns {Vector} world space + */ + screenToWorld(screen) { + const centerSpace = screen.subScalars(this.root.gameWidth / 2, this.root.gameHeight / 2); + return centerSpace.divideScalar(this.zoomLevel).add(this.center); + } + + /** + * Converts from world to screen space + * @param {Vector} world + * @returns {Vector} screen space + */ + worldToScreen(world) { + const screenSpace = world.sub(this.center).multiplyScalar(this.zoomLevel); + return screenSpace.addScalars(this.root.gameWidth / 2, this.root.gameHeight / 2); + } + + /** + * Returns if a point is on screen + * @param {Vector} point + * @returns {boolean} true if its on screen + */ + isWorldPointOnScreen(point) { + const rect = this.getVisibleRect(); + return rect.containsPoint(point.x, point.y); + } + + /** + * Returns if we can further zoom in + * @returns {boolean} + */ + canZoomIn() { + const maxLevel = this.root.app.platformWrapper.getMaximumZoom(); + return this.zoomLevel <= maxLevel - 0.01; + } + + /** + * Returns if we can further zoom out + * @returns {boolean} + */ + canZoomOut() { + const minLevel = this.root.app.platformWrapper.getMinimumZoom(); + return this.zoomLevel >= minLevel + 0.01; + } + + // EVENTS + + /** + * Checks if the mouse event is too close after a touch event and thus + * should get ignored + */ + checkPreventDoubleMouse() { + if (performanceNow() - clickDetectorGlobals.lastTouchTime < 1000.0) { + return false; + } + return true; + } + + /** + * Mousedown handler + * @param {MouseEvent} event + */ + onMouseDown(event) { + if (event.cancelable) { + event.preventDefault(); + // event.stopPropagation(); + } + + if (!this.checkPreventDoubleMouse()) { + return; + } + + this.touchPostMoveVelocity = new Vector(0, 0); + if (event.which === 1) { + this.combinedSingleTouchStartHandler(event.clientX, event.clientY); + } + return false; + } + + /** + * Mousemove handler + * @param {MouseEvent} event + */ + onMouseMove(event) { + if (event.cancelable) { + event.preventDefault(); + // event.stopPropagation(); + } + + if (!this.checkPreventDoubleMouse()) { + return; + } + + if (event.which === 1) { + this.combinedSingleTouchMoveHandler(event.clientX, event.clientY); + } + + // Clamp everything afterwards + this.clampZoomLevel(); + return false; + } + + /** + * Mouseup handler + * @param {MouseEvent=} event + */ + onMouseUp(event) { + if (event) { + if (event.cancelable) { + event.preventDefault(); + // event.stopPropagation(); + } + } + + if (!this.checkPreventDoubleMouse()) { + return; + } + + this.combinedSingleTouchStopHandler(event.clientX, event.clientY); + return false; + } + + /** + * Mousewheel event + * @param {WheelEvent} event + */ + onMouseWheel(event) { + if (event.cancelable) { + event.preventDefault(); + // event.stopPropagation(); + } + + const delta = Math.sign(event.deltaY) * -0.15; + assert(Number.isFinite(delta), "Got invalid delta in mouse wheel event: " + event.deltaY); + assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *before* wheel: " + this.zoomLevel); + this.zoomLevel *= 1 + delta; + assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *after* wheel: " + this.zoomLevel); + + this.clampZoomLevel(); + this.desiredZoom = null; + return false; + } + + /** + * Touch start handler + * @param {TouchEvent} event + */ + onTouchStart(event) { + if (event.cancelable) { + event.preventDefault(); + // event.stopPropagation(); + } + + clickDetectorGlobals.lastTouchTime = performanceNow(); + this.touchPostMoveVelocity = new Vector(0, 0); + + if (event.touches.length === 1) { + const touch = event.touches[0]; + this.combinedSingleTouchStartHandler(touch.clientX, touch.clientY); + } else if (event.touches.length === 2) { + if (this.pinchPreHandler.dispatch() === STOP_PROPAGATION) { + // Something prevented pinching + return false; + } + + const touch1 = event.touches[0]; + const touch2 = event.touches[1]; + this.currentlyMoving = false; + this.currentlyPinching = true; + this.lastPinchPositions = [ + new Vector(touch1.clientX, touch1.clientY), + new Vector(touch2.clientX, touch2.clientY), + ]; + } + return false; + } + + /** + * Touch move handler + * @param {TouchEvent} event + */ + onTouchMove(event) { + if (event.cancelable) { + event.preventDefault(); + // event.stopPropagation(); + } + + clickDetectorGlobals.lastTouchTime = performanceNow(); + + if (event.touches.length === 1) { + const touch = event.touches[0]; + this.combinedSingleTouchMoveHandler(touch.clientX, touch.clientY); + } else if (event.touches.length === 2) { + if (this.currentlyPinching) { + const touch1 = event.touches[0]; + const touch2 = event.touches[1]; + + const newPinchPositions = [ + new Vector(touch1.clientX, touch1.clientY), + new Vector(touch2.clientX, touch2.clientY), + ]; + + // Get distance of taps last time and now + const lastDistance = this.lastPinchPositions[0].distance(this.lastPinchPositions[1]); + const thisDistance = newPinchPositions[0].distance(newPinchPositions[1]); + + // IMPORTANT to do math max here to avoid NaN and causing an invalid zoom level + const difference = thisDistance / Math_max(0.001, lastDistance); + + // Find old center of zoom + let oldCenter = this.lastPinchPositions[0].centerPoint(this.lastPinchPositions[1]); + + // Find new center of zoom + let center = newPinchPositions[0].centerPoint(newPinchPositions[1]); + + // Compute movement + let movement = oldCenter.sub(center); + this.center.x += movement.x / this.zoomLevel; + this.center.y += movement.y / this.zoomLevel; + + // Compute zoom + center = center.sub(new Vector(this.root.gameWidth / 2, this.root.gameHeight / 2)); + + // Apply zoom + assert( + Number.isFinite(difference), + "Invalid pinch difference: " + + difference + + "(last=" + + lastDistance + + ", new = " + + thisDistance + + ")" + ); + this.zoomLevel *= difference; + + // Stick to pivot point + const correcture = center.multiplyScalar(difference - 1).divideScalar(this.zoomLevel); + + this.center = this.center.add(correcture); + this.lastPinchPositions = newPinchPositions; + this.userInteraction.dispatch(USER_INTERACT_MOVE); + + // Since we zoomed, abort any programmed zooming + if (this.desiredZoom) { + this.desiredZoom = null; + } + } + } + + // Clamp everything afterwards + this.clampZoomLevel(); + return false; + } + + /** + * Touch end and cancel handler + * @param {TouchEvent=} event + */ + onTouchEnd(event) { + if (event) { + if (event.cancelable) { + event.preventDefault(); + // event.stopPropagation(); + } + } + + clickDetectorGlobals.lastTouchTime = performanceNow(); + if (event.changedTouches.length === 0) { + logger.warn("Touch end without changed touches"); + } + + const touch = event.changedTouches[0]; + this.combinedSingleTouchStopHandler(touch.clientX, touch.clientY); + return false; + } + + /** + * Internal touch start handler + * @param {number} x + * @param {number} y + */ + combinedSingleTouchStartHandler(x, y) { + const pos = new Vector(x, y); + if (this.downPreHandler.dispatch(pos) === STOP_PROPAGATION) { + // Somebody else captured it + return; + } + + this.touchPostMoveVelocity = new Vector(0, 0); + this.currentlyMoving = true; + this.lastMovingPosition = pos; + this.didMoveSinceTouchStart = false; + } + + /** + * Internal touch move handler + * @param {number} x + * @param {number} y + */ + combinedSingleTouchMoveHandler(x, y) { + const pos = new Vector(x, y); + if (this.movePreHandler.dispatch(pos) === STOP_PROPAGATION) { + // Somebody else captured it + return; + } + + if (!this.currentlyMoving) { + return false; + } + + let delta = this.lastMovingPosition.sub(pos).divideScalar(this.zoomLevel); + if (G_IS_DEV && globalConfig.debug.testCulling) { + // When testing culling, we see everything from the same distance + delta = delta.multiplyScalar(this.zoomLevel * -2); + } + + this.didMoveSinceTouchStart = this.didMoveSinceTouchStart || delta.length() > 0; + this.center = this.center.add(delta); + + this.touchPostMoveVelocity = this.touchPostMoveVelocity + .multiplyScalar(velocitySmoothing) + .add(delta.multiplyScalar(1 - velocitySmoothing)); + + this.lastMovingPosition = pos; + this.userInteraction.dispatch(USER_INTERACT_MOVE); + + // Since we moved, abort any programmed moving + if (this.desiredCenter) { + this.desiredCenter = null; + } + } + + /** + * Internal touch stop handler + */ + combinedSingleTouchStopHandler(x, y) { + if (this.currentlyMoving || this.currentlyPinching) { + this.currentlyMoving = false; + this.currentlyPinching = false; + this.lastMovingPosition = null; + this.lastPinchPositions = null; + this.userInteraction.dispatch(USER_INTERACT_TOUCHEND); + this.didMoveSinceTouchStart = false; + } + this.upPostHandler.dispatch(new Vector(x, y)); + } + + /** + * Clamps the camera zoom level within the allowed range + */ + clampZoomLevel() { + if (G_IS_DEV && globalConfig.debug.disableZoomLimits) { + return; + } + + const wrapper = this.root.app.platformWrapper; + + assert(Number.isFinite(this.zoomLevel), "Invalid zoom level *before* clamp: " + this.zoomLevel); + this.zoomLevel = clamp(this.zoomLevel, wrapper.getMinimumZoom(), wrapper.getMaximumZoom()); + assert(Number.isFinite(this.zoomLevel), "Invalid zoom level *after* clamp: " + this.zoomLevel); + + if (this.desiredZoom) { + this.desiredZoom = clamp(this.desiredZoom, wrapper.getMinimumZoom(), wrapper.getMaximumZoom()); + } + } + + /** + * Updates the camera + * @param {number} dt Delta time in milliseconds + */ + update(dt) { + dt = Math_min(dt, 33); + this.cameraUpdateTimeBucket += dt; + + // Simulate movement of N FPS + const updatesPerFrame = 4; + const physicsStepSizeMs = 1000.0 / (60.0 * updatesPerFrame); + + let now = this.root.time.systemNow() - 3 * physicsStepSizeMs; + + while (this.cameraUpdateTimeBucket > physicsStepSizeMs) { + now += physicsStepSizeMs; + this.cameraUpdateTimeBucket -= physicsStepSizeMs; + + this.internalUpdatePanning(now, physicsStepSizeMs); + this.internalUpdateZooming(now, physicsStepSizeMs); + this.internalUpdateCentering(now, physicsStepSizeMs); + this.internalUpdateShake(now, physicsStepSizeMs); + this.internalUpdateKeyboardForce(now, physicsStepSizeMs); + } + this.clampZoomLevel(); + } + + /** + * Prepares a context to transform it + * @param {CanvasRenderingContext2D} context + */ + transform(context) { + if (G_IS_DEV && globalConfig.debug.testCulling) { + context.transform(1, 0, 0, 1, 100, 100); + return; + } + + this.clampZoomLevel(); + const zoom = this.zoomLevel; + + context.transform( + // Scale, skew, rotate + zoom, + 0, + 0, + zoom, + + // Translate + -zoom * this.getViewportLeft(), + -zoom * this.getViewportTop() + ); + } + + /** + * Internal shake handler + * @param {number} now Time now in seconds + * @param {number} dt Delta time + */ + internalUpdateShake(now, dt) { + this.currentShake = this.currentShake.multiplyScalar(0.92); + } + + /** + * Internal pan handler + * @param {number} now Time now in seconds + * @param {number} dt Delta time + */ + internalUpdatePanning(now, dt) { + const baseStrength = velocityStrength * this.root.app.platformWrapper.getTouchPanStrength(); + + this.touchPostMoveVelocity = this.touchPostMoveVelocity.multiplyScalar(velocityFade); + + // Check influence of past points + if (!this.currentlyMoving && !this.currentlyPinching) { + const len = this.touchPostMoveVelocity.length(); + if (len >= velocityMax) { + this.touchPostMoveVelocity.x = (this.touchPostMoveVelocity.x * velocityMax) / len; + this.touchPostMoveVelocity.y = (this.touchPostMoveVelocity.y * velocityMax) / len; + } + + this.center = this.center.add(this.touchPostMoveVelocity.multiplyScalar(baseStrength)); + + // Panning + this.currentPan = mixVector(this.currentPan, this.desiredPan, 0.06); + this.center = this.center.add(this.currentPan.multiplyScalar((0.5 * dt) / this.zoomLevel)); + } + } + + /** + * Updates the non user interaction zooming + * @param {number} now Time now in seconds + * @param {number} dt Delta time + */ + internalUpdateZooming(now, dt) { + if (!this.currentlyPinching && this.desiredZoom !== null) { + const diff = this.zoomLevel - this.desiredZoom; + if (Math_abs(diff) > 0.05) { + let fade = 0.94; + if (diff > 0) { + // Zoom out faster than in + fade = 0.9; + } + + assert(Number.isFinite(this.desiredZoom), "Desired zoom is NaN: " + this.desiredZoom); + assert(Number.isFinite(fade), "Zoom fade is NaN: " + fade); + this.zoomLevel = this.zoomLevel * fade + this.desiredZoom * (1 - fade); + assert(Number.isFinite(this.zoomLevel), "Zoom level is NaN after fade: " + this.zoomLevel); + } else { + this.desiredZoom = null; + } + } + } + + /** + * Updates the non user interaction centering + * @param {number} now Time now in seconds + * @param {number} dt Delta time + */ + internalUpdateCentering(now, dt) { + if (!this.currentlyMoving && this.desiredCenter !== null) { + const diff = this.center.direction(this.desiredCenter); + const length = diff.length(); + const tolerance = 1 / this.zoomLevel; + if (length > tolerance) { + const movement = diff.multiplyScalar(Math_min(1, dt * 0.008)); + this.center.x += movement.x; + this.center.y += movement.y; + } else { + this.desiredCenter = null; + } + } + } + + /** + * Updates the keyboard forces + * @param {number} now + * @param {number} dt Delta time + */ + internalUpdateKeyboardForce(now, dt) { + if (!this.currentlyMoving && this.desiredCenter == null) { + const limitingDimension = Math_min(this.root.gameWidth, this.root.gameHeight); + + const moveAmount = ((limitingDimension / 2048) * dt) / this.zoomLevel; + + let forceX = 0; + let forceY = 0; + + const actionMapper = this.root.gameState.keyActionMapper; + if (actionMapper.getBinding("map_move_up").currentlyDown) { + forceY -= 1; + } + + if (actionMapper.getBinding("map_move_down").currentlyDown) { + forceY += 1; + } + + if (actionMapper.getBinding("map_move_left").currentlyDown) { + forceX -= 1; + } + + if (actionMapper.getBinding("map_move_right").currentlyDown) { + forceX += 1; + } + + this.center.x += moveAmount * forceX; + this.center.y += moveAmount * forceY; + } + } +} diff --git a/src/js/game/canvas_click_interceptor.js b/src/js/game/canvas_click_interceptor.js new file mode 100644 index 00000000..675c1387 --- /dev/null +++ b/src/js/game/canvas_click_interceptor.js @@ -0,0 +1,70 @@ +import { STOP_PROPAGATION } from "../core/signal"; +import { GameRoot } from "./root"; +import { ClickDetector } from "../core/click_detector"; +import { createLogger } from "../core/logging"; + +const logger = createLogger("canvas_click_interceptor"); + +export class CanvasClickInterceptor { + /** + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + + this.root.signals.postLoadHook.add(this.initialize, this); + this.root.signals.aboutToDestruct.add(this.cleanup, this); + + /** @type {Array} */ + this.interceptors = []; + } + + initialize() { + this.clickDetector = new ClickDetector(this.root.canvas, { + applyCssClass: null, + captureTouchmove: false, + targetOnly: true, + preventDefault: true, + maxDistance: 13, + clickSound: null, + }); + this.clickDetector.click.add(this.onCanvasClick, this); + this.clickDetector.rightClick.add(this.onCanvasRightClick, this); + + if (this.root.hud.parts.buildingPlacer) { + this.interceptors.push(this.root.hud.parts.buildingPlacer); + } + + logger.log("Registered", this.interceptors.length, "interceptors"); + } + + cleanup() { + if (this.clickDetector) { + this.clickDetector.cleanup(); + } + this.interceptors = []; + } + + onCanvasClick(position, event, cancelAction = false) { + if (!this.root.gameInitialized) { + logger.warn("Skipping click outside of game initiaization!"); + return; + } + + if (this.root.hud.hasBlockingOverlayOpen()) { + return; + } + + for (let i = 0; i < this.interceptors.length; ++i) { + const interceptor = this.interceptors[i]; + if (interceptor.onCanvasClick(position, cancelAction) === STOP_PROPAGATION) { + // log(this, "Interceptor", interceptor.constructor.name, "catched click"); + break; + } + } + } + + onCanvasRightClick(position, event) { + this.onCanvasClick(position, event, true); + } +} diff --git a/src/js/game/colors.js b/src/js/game/colors.js new file mode 100644 index 00000000..8926dd23 --- /dev/null +++ b/src/js/game/colors.js @@ -0,0 +1,167 @@ +/** @enum {string} */ +export const enumColors = { + red: "red", + green: "green", + blue: "blue", + + yellow: "yellow", + purple: "purple", + cyan: "cyan", + + white: "white", + uncolored: "uncolored", +}; + +/** @enum {string} */ +export const enumColorToShortcode = { + [enumColors.red]: "r", + [enumColors.green]: "g", + [enumColors.blue]: "b", + + [enumColors.yellow]: "y", + [enumColors.purple]: "p", + [enumColors.cyan]: "c", + + [enumColors.white]: "w", + [enumColors.uncolored]: "u", +}; + +/** @enum {enumColors} */ +export const enumShortcodeToColor = {}; +for (const key in enumColorToShortcode) { + enumShortcodeToColor[enumColorToShortcode[key]] = key; +} + +/** @enum {string} */ +export const enumColorsToHexCode = { + [enumColors.red]: "#ff666a", + [enumColors.green]: "#78ff66", + [enumColors.blue]: "#66a7ff", + + // red + green + [enumColors.yellow]: "#fcf52a", + + // red + blue + [enumColors.purple]: "#dd66ff", + + // blue + green + [enumColors.cyan]: "#87fff5", + + // blue + green + red + [enumColors.white]: "#ffffff", + + [enumColors.uncolored]: "#aaaaaa", +}; + +const c = enumColors; +/** @enum {Object.} */ +export const enumColorMixingResults = { + // 255, 0, 0 + [c.red]: { + [c.green]: c.yellow, + [c.blue]: c.purple, + + [c.yellow]: c.yellow, + [c.purple]: c.purple, + [c.cyan]: c.white, + + [c.white]: c.white, + }, + + // 0, 255, 0 + [c.green]: { + [c.blue]: c.cyan, + + [c.yellow]: c.yellow, + [c.purple]: c.white, + [c.cyan]: c.cyan, + + [c.white]: c.white, + }, + + // 0, 255, 0 + [c.blue]: { + [c.yellow]: c.white, + [c.purple]: c.purple, + [c.cyan]: c.cyan, + + [c.white]: c.white, + }, + + // 255, 255, 0 + [c.yellow]: { + [c.purple]: c.white, + [c.cyan]: c.white, + }, + + // 255, 0, 255 + [c.purple]: { + [c.cyan]: c.white, + }, + + // 0, 255, 255 + [c.cyan]: {}, + + //// SPECIAL COLORS + + // 255, 255, 255 + [c.white]: { + // auto + }, + + // X, X, X + [c.uncolored]: { + // auto + }, +}; + +// Create same color lookups +for (const color in enumColors) { + enumColorMixingResults[color][color] = color; + + // Anything with white is white again + enumColorMixingResults[color][c.white] = c.white; + + // Anything with uncolored is the same color + enumColorMixingResults[color][c.uncolored] = color; +} + +// Create reverse lookup and check color mixing lookups +for (const colorA in enumColorMixingResults) { + for (const colorB in enumColorMixingResults[colorA]) { + const resultColor = enumColorMixingResults[colorA][colorB]; + if (!enumColorMixingResults[colorB]) { + enumColorMixingResults[colorB] = { + [colorA]: resultColor, + }; + } else { + const existingResult = enumColorMixingResults[colorB][colorA]; + if (existingResult && existingResult !== resultColor) { + assertAlways( + false, + "invalid color mixing configuration, " + + colorA + + " + " + + colorB + + " is " + + resultColor + + " but " + + colorB + + " + " + + colorA + + " is " + + existingResult + ); + } + enumColorMixingResults[colorB][colorA] = resultColor; + } + } +} + +for (const colorA in enumColorMixingResults) { + for (const colorB in enumColorMixingResults) { + if (!enumColorMixingResults[colorA][colorB]) { + assertAlways(false, "Color mixing of", colorA, "with", colorB, "is not defined"); + } + } +} diff --git a/src/js/game/component.js b/src/js/game/component.js new file mode 100644 index 00000000..8c492351 --- /dev/null +++ b/src/js/game/component.js @@ -0,0 +1,38 @@ +import { BasicSerializableObject } from "../savegame/serialization"; + +export class Component extends BasicSerializableObject { + /** + * Returns the components unique id + * @returns {string} + */ + static getId() { + abstract; + return "unknown-component"; + } + + /** + * Should return the schema used for serialization + */ + static getSchema() { + return {}; + } + + /* dev:start */ + + /** + * Fixes typeof DerivedComponent is not assignable to typeof Component, compiled out + * in non-dev builds + */ + constructor(...args) { + super(); + } + + /** + * Returns a string representing the components data, only in dev builds + * @returns {string} + */ + getDebugString() { + return null; + } + /* dev:end */ +} diff --git a/src/js/game/component_registry.js b/src/js/game/component_registry.js new file mode 100644 index 00000000..16ae01d8 --- /dev/null +++ b/src/js/game/component_registry.js @@ -0,0 +1,38 @@ +import { gComponentRegistry } from "../core/global_registries"; +import { StaticMapEntityComponent } from "./components/static_map_entity"; +import { BeltComponent } from "./components/belt"; +import { ItemEjectorComponent } from "./components/item_ejector"; +import { ItemAcceptorComponent } from "./components/item_acceptor"; +import { MinerComponent } from "./components/miner"; +import { ItemProcessorComponent } from "./components/item_processor"; +import { ReplaceableMapEntityComponent } from "./components/replaceable_map_entity"; +import { UndergroundBeltComponent } from "./components/underground_belt"; +import { UnremovableComponent } from "./components/unremovable"; +import { HubComponent } from "./components/hub"; + +export function initComponentRegistry() { + gComponentRegistry.register(StaticMapEntityComponent); + gComponentRegistry.register(BeltComponent); + gComponentRegistry.register(ItemEjectorComponent); + gComponentRegistry.register(ItemAcceptorComponent); + gComponentRegistry.register(MinerComponent); + gComponentRegistry.register(ItemProcessorComponent); + gComponentRegistry.register(ReplaceableMapEntityComponent); + gComponentRegistry.register(UndergroundBeltComponent); + gComponentRegistry.register(UnremovableComponent); + gComponentRegistry.register(HubComponent); + + // IMPORTANT ^^^^^ REGENERATE SAVEGAME SCHEMA AFTERWARDS + // IMPORTANT ^^^^^ ALSO UPDATE ENTITY COMPONENT STORAG + + // Sanity check - If this is thrown, you (=me, lol) forgot to add a new component here + + assert( + // @ts-ignore + require.context("./components", false, /.*\.js/i).keys().length === + gComponentRegistry.getNumEntries(), + "Not all components are registered" + ); + + console.log("📦 There are", gComponentRegistry.getNumEntries(), "components"); +} diff --git a/src/js/game/components/belt.js b/src/js/game/components/belt.js new file mode 100644 index 00000000..6e9569ee --- /dev/null +++ b/src/js/game/components/belt.js @@ -0,0 +1,92 @@ +import { Component } from "../component"; +import { types } from "../../savegame/serialization"; +import { gItemRegistry } from "../../core/global_registries"; +import { BaseItem } from "../base_item"; +import { Vector, enumDirection } from "../../core/vector"; +import { Math_PI, Math_sin, Math_cos } from "../../core/builtins"; +import { globalConfig } from "../../core/config"; + +export class BeltComponent extends Component { + static getId() { + return "Belt"; + } + + static getSchema() { + return { + direction: types.string, + sortedItems: types.array(types.pair(types.ufloat, types.obj(gItemRegistry))), + }; + } + + /** + * + * @param {object} param0 + * @param {enumDirection=} param0.direction The direction of the belt + */ + constructor({ direction = enumDirection.top }) { + super(); + + this.direction = direction; + + /** @type {Array<[number, BaseItem]>} */ + this.sortedItems = []; + } + + /** + * Converts from belt space (0 = start of belt ... 1 = end of belt) to the local + * belt coordinates (-0.5|-0.5 to 0.5|0.5) + * @param {number} progress + * @returns {Vector} + */ + transformBeltToLocalSpace(progress) { + switch (this.direction) { + case enumDirection.top: + return new Vector(0, 0.5 - progress); + + case enumDirection.right: { + const arcProgress = progress * 0.5 * Math_PI; + return new Vector(0.5 - 0.5 * Math_cos(arcProgress), 0.5 - 0.5 * Math_sin(arcProgress)); + } + case enumDirection.left: { + const arcProgress = progress * 0.5 * Math_PI; + return new Vector(-0.5 + 0.5 * Math_cos(arcProgress), 0.5 - 0.5 * Math_sin(arcProgress)); + } + default: + assertAlways(false, "Invalid belt direction: " + this.direction); + return new Vector(0, 0); + } + } + + /** + * Returns if the belt can currently accept an item from the given direction + * @param {enumDirection} direction + */ + canAcceptNewItem(direction) { + const firstItem = this.sortedItems[0]; + if (!firstItem) { + return true; + } + + return firstItem[0] > globalConfig.itemSpacingOnBelts; + } + + /** + * Pushes a new item to the belt + * @param {BaseItem} item + * @param {enumDirection} direction + */ + takeNewItem(item, direction) { + this.sortedItems.unshift([0, item]); + } + + /** + * Returns how much space there is to the first item + */ + getDistanceToFirstItemCenter() { + const firstItem = this.sortedItems[0]; + if (!firstItem) { + return 1; + } + return firstItem[0]; + } +} diff --git a/src/js/game/components/hub.js b/src/js/game/components/hub.js new file mode 100644 index 00000000..6df1bcf5 --- /dev/null +++ b/src/js/game/components/hub.js @@ -0,0 +1,25 @@ +import { Component } from "../component"; +import { ShapeDefinition } from "../shape_definition"; + +export class HubComponent extends Component { + static getId() { + return "Hub"; + } + + constructor() { + super(); + + /** + * Shape definitions in queue to be analyzed and counted towards the goal + * @type {Array} + */ + this.definitionsToAnalyze = []; + } + + /** + * @param {ShapeDefinition} definition + */ + queueShapeDefinition(definition) { + this.definitionsToAnalyze.push(definition); + } +} diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js new file mode 100644 index 00000000..bc02330c --- /dev/null +++ b/src/js/game/components/item_acceptor.js @@ -0,0 +1,129 @@ +import { Component } from "../component"; +import { Vector, enumDirection, enumDirectionToAngle, enumInvertedDirections } from "../../core/vector"; +import { BaseItem } from "../base_item"; +import { ShapeItem } from "../items/shape_item"; +import { ColorItem } from "../items/color_item"; + +/** + * @enum {string?} + */ +export const enumItemAcceptorItemFilter = { + shape: "shape", + color: "color", + none: null, +}; + +/** @typedef {{ + * pos: Vector, + * directions: enumDirection[], + * filter?: enumItemAcceptorItemFilter + * }} ItemAcceptorSlot */ + +export class ItemAcceptorComponent extends Component { + static getId() { + return "ItemAcceptor"; + } + + static getSchema() { + return { + // slots: "TODO", + }; + } + + /** + * + * @param {object} param0 + * @param {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemAcceptorItemFilter}>} param0.slots The slots from which we accept items + */ + constructor({ slots }) { + super(); + + this.setSlots(slots); + } + + /** + * + * @param {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemAcceptorItemFilter}>} slots + */ + setSlots(slots) { + /** @type {Array<{pos: Vector, directions: enumDirection[], filter?: enumItemAcceptorItemFilter}>} */ + this.slots = []; + for (let i = 0; i < slots.length; ++i) { + const slot = slots[i]; + this.slots.push({ + pos: slot.pos, + directions: slot.directions, + + // Which type of item to accept (shape | color | all) @see enumItemAcceptorItemFilter + filter: slot.filter, + }); + } + } + + /** + * Returns if this acceptor can accept a new item at slot N + * @param {number} slotIndex + * @param {BaseItem=} item + */ + canAcceptItem(slotIndex, item) { + const slot = this.slots[slotIndex]; + switch (slot.filter) { + case enumItemAcceptorItemFilter.shape: { + return item instanceof ShapeItem; + } + case enumItemAcceptorItemFilter.color: { + return item instanceof ColorItem; + } + default: + return true; + } + } + + /** + * Tries to find a slot which accepts the current item + * @param {Vector} targetLocalTile + * @param {enumDirection} fromLocalDirection + * @returns {{ + * slot: ItemAcceptorSlot, + * index: number, + * acceptedDirection: enumDirection + * }|null} + */ + findMatchingSlot(targetLocalTile, fromLocalDirection) { + // We need to invert our direction since the acceptor specifies *from* which direction + // it accepts items, but the ejector specifies *into* which direction it ejects items. + // E.g.: Ejector ejects into "right" direction but acceptor accepts from "left" direction. + const desiredDirection = enumInvertedDirections[fromLocalDirection]; + + // Go over all slots and try to find a target slot + for (let slotIndex = 0; slotIndex < this.slots.length; ++slotIndex) { + const slot = this.slots[slotIndex]; + + // const acceptorLocalPosition = targetStaticComp.applyRotationToVector( + // slot.pos + // ); + + // const acceptorGlobalPosition = acceptorLocalPosition.add(targetStaticComp.origin); + + // Make sure the acceptor slot is on the right position + if (!slot.pos.equals(targetLocalTile)) { + continue; + } + + // Check if the acceptor slot accepts items from our direction + for (let i = 0; i < slot.directions.length; ++i) { + // const localDirection = targetStaticComp.localDirectionToWorld(slot.directions[l]); + if (desiredDirection === slot.directions[i]) { + return { + slot, + index: slotIndex, + acceptedDirection: desiredDirection, + }; + } + } + } + + // && this.canAcceptItem(slotIndex, ejectingItem) + return null; + } +} diff --git a/src/js/game/components/item_ejector.js b/src/js/game/components/item_ejector.js new file mode 100644 index 00000000..786213ce --- /dev/null +++ b/src/js/game/components/item_ejector.js @@ -0,0 +1,162 @@ +import { globalConfig } from "../../core/config"; +import { Vector, enumDirection, enumDirectionToVector } from "../../core/vector"; +import { BaseItem } from "../base_item"; +import { Component } from "../component"; + +/** + * @typedef {{ + * pos: Vector, + * direction: enumDirection, + * item: BaseItem, + * progress: number? + * }} ItemEjectorSlot + */ + +export class ItemEjectorComponent extends Component { + static getId() { + return "ItemEjector"; + } + + static getSchema() { + return { + // slots: "TODO" + }; + } + + /** + * + * @param {object} param0 + * @param {Array<{pos: Vector, direction: enumDirection}>} param0.slots The slots to eject on + * @param {boolean=} param0.instantEject If the ejection is instant + */ + constructor({ slots, instantEject = false }) { + super(); + + // How long items take to eject + this.instantEject = instantEject; + + this.setSlots(slots); + } + + /** + * @param {Array<{pos: Vector, direction: enumDirection}>} slots The slots to eject on + */ + setSlots(slots) { + /** @type {Array} */ + this.slots = []; + for (let i = 0; i < slots.length; ++i) { + const slot = slots[i]; + this.slots.push({ + pos: slot.pos, + direction: slot.direction, + item: null, + progress: 0, + }); + } + } + + /** + * Returns the amount of slots + */ + getNumSlots() { + return this.slots.length; + } + + /** + * Returns where this slot ejects to + * @param {number} index + * @returns {Vector} + */ + getSlotTargetLocalTile(index) { + const slot = this.slots[index]; + const directionVector = enumDirectionToVector[slot.direction]; + return slot.pos.add(directionVector); + } + + /** + * Returns whether any slot ejects to the given local tile + * @param {Vector} tile + */ + anySlotEjectsToLocalTile(tile) { + for (let i = 0; i < this.slots.length; ++i) { + if (this.getSlotTargetLocalTile(i).equals(tile)) { + return true; + } + } + return false; + } + + /** + * Returns if slot # is currently ejecting + * @param {number} slotIndex + * @returns {boolean} + */ + isSlotEjecting(slotIndex) { + assert(slotIndex >= 0 && slotIndex < this.slots.length, "Invalid ejector slot: " + slotIndex); + return !!this.slots[slotIndex].item; + } + + /** + * Returns if we can eject on a given slot + * @param {number} slotIndex + * @returns {boolean} + */ + canEjectOnSlot(slotIndex) { + assert(slotIndex >= 0 && slotIndex < this.slots.length, "Invalid ejector slot: " + slotIndex); + return !this.slots[slotIndex].item; + } + + /** + * Returns the first free slot on this ejector or null if there is none + * @returns {number?} + */ + getFirstFreeSlot() { + for (let i = 0; i < this.slots.length; ++i) { + if (this.canEjectOnSlot(i)) { + return i; + } + } + return null; + } + + /** + * Returns if any slot is ejecting + * @returns {boolean} + */ + isAnySlotEjecting() { + for (let i = 0; i < this.slots.length; ++i) { + if (this.slots[i].item) { + return true; + } + } + return false; + } + + /** + * Returns if any slot is free + * @returns {boolean} + */ + hasAnySlotFree() { + for (let i = 0; i < this.slots.length; ++i) { + if (this.canEjectOnSlot(i)) { + return true; + } + } + return false; + } + + /** + * Tries to eject a given item + * @param {number} slotIndex + * @param {BaseItem} item + * @returns {boolean} + */ + tryEject(slotIndex, item) { + if (!this.canEjectOnSlot(slotIndex)) { + return false; + } + this.slots[slotIndex].item = item; + this.slots[slotIndex].progress = this.instantEject ? 1 : 0; + return true; + } +} diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js new file mode 100644 index 00000000..f5257bcb --- /dev/null +++ b/src/js/game/components/item_processor.js @@ -0,0 +1,106 @@ +import { BaseItem } from "../base_item"; +import { Component } from "../component"; +import { enumDirection, Vector } from "../../core/vector"; + +/** @enum {string} */ +export const enumItemProcessorTypes = { + splitter: "splitter", + cutter: "cutter", + rotater: "rotater", + stacker: "stacker", + trash: "trash", + mixer: "mixer", + painter: "painter", + hub: "hub", +}; + +export class ItemProcessorComponent extends Component { + static getId() { + return "ItemProcessor"; + } + + static getSchema() { + return { + // TODO + }; + } + + /** + * + * @param {object} param0 + * @param {enumItemProcessorTypes} param0.processorType Which type of processor this is + * @param {number} param0.inputsPerCharge How many items this machine needs until it can start working + * @param {Array<{pos: Vector, direction: enumDirection}>=} param0.beltUnderlays Where to render belt underlays + * + */ + constructor({ processorType = enumItemProcessorTypes.splitter, inputsPerCharge, beltUnderlays = [] }) { + super(); + + // Which slot to emit next, this is only a preference and if it can't emit + // it will take the other one. Some machines ignore this (e.g. the splitter) to make + // sure the outputs always match + this.nextOutputSlot = 0; + + // Type of the processor + this.type = processorType; + + // How many inputs we need for one charge + this.inputsPerCharge = inputsPerCharge; + + // Which belt underlays to render + this.beltUnderlays = beltUnderlays; + + /** + * Our current inputs + * @type {Array<{ item: BaseItem, sourceSlot: number }>} + */ + this.inputSlots = []; + + /** + * What we are currently processing, empty if we don't produce anything rn + * requiredSlot: Item *must* be ejected on this slot + * preferredSlot: Item *can* be ejected on this slot, but others are fine too if the one is not usable + * @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} + */ + this.itemsToEject = []; + + /** + * How long it takes until we are done with the current items + */ + this.secondsUntilEject = 0; + + /** + * Fixes belt animations + * @type {Array<{ item: BaseItem, slotIndex: number, animProgress: number, direction: enumDirection}>} + */ + this.itemConsumptionAnimations = []; + } + + /** + * Tries to take the item + * @param {BaseItem} item + */ + tryTakeItem(item, sourceSlot, sourceDirection) { + if (this.inputSlots.length >= this.inputsPerCharge) { + // Already full + return false; + } + + // Check that we only take one item per slot + for (let i = 0; i < this.inputSlots.length; ++i) { + const slot = this.inputSlots[i]; + if (slot.sourceSlot === sourceSlot) { + return false; + } + } + + this.inputSlots.push({ item, sourceSlot }); + this.itemConsumptionAnimations.push({ + item, + slotIndex: sourceSlot, + direction: sourceDirection, + animProgress: 0.0, + }); + return true; + } +} diff --git a/src/js/game/components/miner.js b/src/js/game/components/miner.js new file mode 100644 index 00000000..09c4f437 --- /dev/null +++ b/src/js/game/components/miner.js @@ -0,0 +1,23 @@ +import { globalConfig } from "../../core/config"; +import { types } from "../../savegame/serialization"; +import { Component } from "../component"; + +export class MinerComponent extends Component { + static getId() { + return "Miner"; + } + + static getSchema() { + return { + lastMiningTime: types.ufloat, + }; + } + + /** + * @param {object} param0 + */ + constructor({}) { + super(); + this.lastMiningTime = 0; + } +} diff --git a/src/js/game/components/replaceable_map_entity.js b/src/js/game/components/replaceable_map_entity.js new file mode 100644 index 00000000..e6fd95d5 --- /dev/null +++ b/src/js/game/components/replaceable_map_entity.js @@ -0,0 +1,11 @@ +import { Component } from "../component"; + +/** + * Marks an entity as replaceable, so that when other buildings are placed above him it + * simply gets deleted + */ +export class ReplaceableMapEntityComponent extends Component { + static getId() { + return "ReplaceableMapEntity"; + } +} diff --git a/src/js/game/components/static_map_entity.js b/src/js/game/components/static_map_entity.js new file mode 100644 index 00000000..dc1cf0d5 --- /dev/null +++ b/src/js/game/components/static_map_entity.js @@ -0,0 +1,184 @@ +import { Math_radians } from "../../core/builtins"; +import { globalConfig } from "../../core/config"; +import { DrawParameters } from "../../core/draw_parameters"; +import { Rectangle } from "../../core/rectangle"; +import { AtlasSprite } from "../../core/sprites"; +import { enumDirection, Vector } from "../../core/vector"; +import { types } from "../../savegame/serialization"; +import { Component } from "../component"; + +export class StaticMapEntityComponent extends Component { + static getId() { + return "StaticMapEntity"; + } + + static getSchema() { + return { + origin: types.tileVector, + tileSize: types.tileVector, + rotationDegrees: types.uint, + spriteKey: types.string, + }; + } + + /** + * + * @param {object} param0 + * @param {Vector=} param0.origin Origin (Top Left corner) of the entity + * @param {Vector=} param0.tileSize Size of the entity in tiles + * @param {number=} param0.rotationDegrees Rotation in degrees. Must be multiple of 90 + * @param {string=} param0.spriteKey Optional sprite + * @param {string=} param0.silhouetteColor Optional silhouette color override + */ + constructor({ + origin = new Vector(), + tileSize = new Vector(1, 1), + rotationDegrees = 0, + spriteKey = null, + silhouetteColor = null, + }) { + super(); + assert( + rotationDegrees % 90 === 0, + "Rotation of static map entity must be multiple of 90 (was " + rotationDegrees + ")" + ); + + this.origin = origin; + this.tileSize = tileSize; + this.spriteKey = spriteKey; + this.rotationDegrees = rotationDegrees; + this.silhouetteColor = silhouetteColor; + } + + /** + * Returns the effective rectangle of this entity in tile space + * @returns {Rectangle} + */ + getTileSpaceBounds() { + switch (this.rotationDegrees) { + case 0: + return new Rectangle(this.origin.x, this.origin.y, this.tileSize.x, this.tileSize.y); + case 90: + return new Rectangle( + this.origin.x - this.tileSize.y + 1, + this.origin.y, + this.tileSize.y, + this.tileSize.x + ); + case 180: + return new Rectangle( + this.origin.x - this.tileSize.x + 1, + this.origin.y - this.tileSize.y + 1, + this.tileSize.x, + this.tileSize.y + ); + case 270: + return new Rectangle( + this.origin.x, + this.origin.y - this.tileSize.x + 1, + this.tileSize.y, + this.tileSize.x + ); + default: + assert(false, "Invalid rotation"); + } + } + + /** + * Transforms the given vector/rotation from local space to world space + * @param {Vector} vector + * @returns {Vector} + */ + applyRotationToVector(vector) { + return vector.rotateFastMultipleOf90(this.rotationDegrees); + } + + /** + * Transforms the given vector/rotation from world space to local space + * @param {Vector} vector + * @returns {Vector} + */ + unapplyRotationToVector(vector) { + return vector.rotateFastMultipleOf90(360 - this.rotationDegrees); + } + + /** + * Transforms the given direction from local space + * @param {enumDirection} direction + * @returns {enumDirection} + */ + localDirectionToWorld(direction) { + return Vector.transformDirectionFromMultipleOf90(direction, this.rotationDegrees); + } + + /** + * Transforms the given direction from world to local space + * @param {enumDirection} direction + * @returns {enumDirection} + */ + worldDirectionToLocal(direction) { + return Vector.transformDirectionFromMultipleOf90(direction, 360 - this.rotationDegrees); + } + + /** + * Transforms from local tile space to global tile space + * @param {Vector} localTile + * @returns {Vector} + */ + localTileToWorld(localTile) { + const result = this.applyRotationToVector(localTile); + result.addInplace(this.origin); + return result; + } + + /** + * Transforms from world space to local space + * @param {Vector} worldTile + */ + worldToLocalTile(worldTile) { + const localUnrotated = worldTile.sub(this.origin); + return this.unapplyRotationToVector(localUnrotated); + } + + /** + * Draws a sprite over the whole space of the entity + * @param {DrawParameters} parameters + * @param {AtlasSprite} sprite + * @param {number=} extrudePixels How many pixels to extrude the sprite + * @param {boolean=} clipping Whether to clip + */ + drawSpriteOnFullEntityBounds(parameters, sprite, extrudePixels = 0, clipping = true) { + const worldX = this.origin.x * globalConfig.tileSize; + const worldY = this.origin.y * globalConfig.tileSize; + + if (this.rotationDegrees === 0) { + // Early out, is faster + sprite.drawCached( + parameters, + worldX - extrudePixels * this.tileSize.x, + worldY - extrudePixels * this.tileSize.y, + globalConfig.tileSize * this.tileSize.x + 2 * extrudePixels * this.tileSize.x, + globalConfig.tileSize * this.tileSize.y + 2 * extrudePixels * this.tileSize.y, + clipping + ); + } else { + const rotationCenterX = worldX + globalConfig.halfTileSize; + const rotationCenterY = worldY + globalConfig.halfTileSize; + + parameters.context.translate(rotationCenterX, rotationCenterY); + parameters.context.rotate(Math_radians(this.rotationDegrees)); + + sprite.drawCached( + parameters, + -globalConfig.halfTileSize - extrudePixels * this.tileSize.x, + -globalConfig.halfTileSize - extrudePixels * this.tileSize.y, + globalConfig.tileSize * this.tileSize.x + 2 * extrudePixels * this.tileSize.x, + globalConfig.tileSize * this.tileSize.y + 2 * extrudePixels * this.tileSize.y, + false + ); + + parameters.context.rotate(-Math_radians(this.rotationDegrees)); + parameters.context.translate(-rotationCenterX, -rotationCenterY); + } + } +} diff --git a/src/js/game/components/underground_belt.js b/src/js/game/components/underground_belt.js new file mode 100644 index 00000000..707cd131 --- /dev/null +++ b/src/js/game/components/underground_belt.js @@ -0,0 +1,88 @@ +import { BaseItem } from "../base_item"; +import { Component } from "../component"; +import { globalConfig } from "../../core/config"; + +/** @enum {string} */ +export const enumUndergroundBeltMode = { + sender: "sender", + receiver: "receiver", +}; + +export class UndergroundBeltComponent extends Component { + static getId() { + return "UndergroundBelt"; + } + + /** + * + * @param {object} param0 + * @param {enumUndergroundBeltMode=} param0.mode As which type of belt the entity acts + */ + constructor({ mode = enumUndergroundBeltMode.sender }) { + super(); + + this.mode = mode; + + /** + * Used on both receiver and sender. + * Reciever: Used to store the next item to transfer, and to block input while doing this + * Sender: Used to store which items are currently "travelling" + * @type {Array<[BaseItem, number]>} Format is [Item, remaining seconds until transfer/ejection] + */ + this.pendingItems = []; + } + + /** + * Tries to accept an item from an external source like a regular belt or building + * @param {BaseItem} item + * @param {number} beltSpeed How fast this item travels + */ + tryAcceptExternalItem(item, beltSpeed) { + if (this.mode !== enumUndergroundBeltMode.sender) { + // Only senders accept external items + return false; + } + + if (this.pendingItems.length > 0) { + // We currently have a pending item + return false; + } + + console.log("Takes", 1 / beltSpeed); + this.pendingItems.push([item, 1 / beltSpeed]); + return true; + } + + /** + * Tries to accept a tunneled item + * @param {BaseItem} item + * @param {number} travelDistance How many tiles this item has to travel + * @param {number} beltSpeed How fast this item travels + */ + tryAcceptTunneledItem(item, travelDistance, beltSpeed) { + if (this.mode !== enumUndergroundBeltMode.receiver) { + // Only receivers can accept tunneled items + return false; + } + + // Notice: We assume that for all items the travel distance is the same + const maxItemsInTunnel = (1 + travelDistance) / globalConfig.itemSpacingOnBelts; + if (this.pendingItems.length >= maxItemsInTunnel) { + // Simulate a real belt which gets full at some point + return false; + } + + // NOTICE: + // This corresponds to the item ejector - it needs 0.5 additional tiles to eject the item. + // So instead of adding 1 we add 0.5 only. + const travelDuration = (travelDistance + 0.5) / beltSpeed; + console.log(travelDistance, "->", travelDuration); + + this.pendingItems.push([item, travelDuration]); + + // Sort so we can only look at the first ones + this.pendingItems.sort((a, b) => a[1] - b[1]); + + return true; + } +} diff --git a/src/js/game/components/unremovable.js b/src/js/game/components/unremovable.js new file mode 100644 index 00000000..4f6dd33a --- /dev/null +++ b/src/js/game/components/unremovable.js @@ -0,0 +1,7 @@ +import { Component } from "../component"; + +export class UnremovableComponent extends Component { + static getId() { + return "Unremovable"; + } +} diff --git a/src/js/game/core.js b/src/js/game/core.js new file mode 100644 index 00000000..8a9c4857 --- /dev/null +++ b/src/js/game/core.js @@ -0,0 +1,434 @@ +/* typehints:start */ +import { InGameState } from "../states/ingame"; +import { Application } from "../application"; +/* typehints:end */ + +import { BufferMaintainer } from "../core/buffer_maintainer"; +import { disableImageSmoothing, enableImageSmoothing, registerCanvas } from "../core/buffer_utils"; +import { Math_random } from "../core/builtins"; +import { globalConfig } from "../core/config"; +import { getDeviceDPI, resizeHighDPICanvas } from "../core/dpi_manager"; +import { DrawParameters } from "../core/draw_parameters"; +import { gMetaBuildingRegistry } from "../core/global_registries"; +import { createLogger } from "../core/logging"; +import { PerlinNoise } from "../core/perlin_noise"; +import { Vector } from "../core/vector"; +import { Savegame } from "../savegame/savegame"; +import { SavegameSerializer } from "../savegame/savegame_serializer"; +import { AutomaticSave } from "./automatic_save"; +import { MetaHubBuilding } from "./buildings/hub"; +import { Camera } from "./camera"; +import { CanvasClickInterceptor } from "./canvas_click_interceptor"; +import { EntityManager } from "./entity_manager"; +import { GameSystemManager } from "./game_system_manager"; +import { HubGoals } from "./hub_goals"; +import { GameHUD } from "./hud/hud"; +import { KeyActionMapper } from "./key_action_mapper"; +import { GameLogic } from "./logic"; +import { MapView } from "./map_view"; +import { GameRoot } from "./root"; +import { ShapeDefinitionManager } from "./shape_definition_manager"; +import { SoundProxy } from "./sound_proxy"; +import { GameTime } from "./time/game_time"; + +const logger = createLogger("ingame/core"); + +// Store the canvas so we can reuse it later +/** @type {HTMLCanvasElement} */ +let lastCanvas = null; +/** @type {CanvasRenderingContext2D} */ +let lastContext = null; + +/** + * The core manages the root and represents the whole game. It wraps the root, since + * the root class is just a data holder. + */ +export class GameCore { + /** @param {Application} app */ + constructor(app) { + this.app = app; + + /** @type {GameRoot} */ + this.root = null; + + /** + * Time budget (seconds) for logic updates + */ + this.logicTimeBudget = 0; + + /** + * Time budget (seconds) for user interface updates + */ + this.uiTimeBudget = 0; + + /** + * Set to true at the beginning of a logic update and cleared when its finished. + * This is to prevent doing a recursive logic update which can lead to unexpected + * behaviour. + */ + this.duringLogicUpdate = false; + + // Cached + this.boundInternalTick = this.updateLogic.bind(this); + } + + /** + * Initializes the root object which stores all game related data. The state + * is required as a back reference (used sometimes) + * @param {InGameState} parentState + * @param {Savegame} savegame + */ + initializeRoot(parentState, savegame) { + // Construct the root element, this is the data representation of the game + this.root = new GameRoot(this.app); + this.root.gameState = parentState; + this.root.savegame = savegame; + this.root.gameWidth = this.app.screenWidth; + this.root.gameHeight = this.app.screenHeight; + + // Initialize canvas element & context + this.internalInitCanvas(); + + // Members + const root = this.root; + + // This isn't nice, but we need it right here + root.gameState.keyActionMapper = new KeyActionMapper(root, this.root.gameState.inputReciever); + + // Init classes + root.camera = new Camera(root); + root.map = new MapView(root); + root.logic = new GameLogic(root); + root.hud = new GameHUD(root); + root.time = new GameTime(root); + root.canvasClickInterceptor = new CanvasClickInterceptor(root); + root.automaticSave = new AutomaticSave(root); + root.soundProxy = new SoundProxy(root); + + // Init managers + root.entityMgr = new EntityManager(root); + root.systemMgr = new GameSystemManager(root); + root.shapeDefinitionMgr = new ShapeDefinitionManager(root); + root.mapNoiseGenerator = new PerlinNoise(Math.random()); // TODO: Save seed + root.hubGoals = new HubGoals(root); + root.buffers = new BufferMaintainer(root); + + // root.particleMgr = new ParticleManager(root); + // root.uiParticleMgr = new ParticleManager(root); + + // Initialize the hud once everything is loaded + this.root.hud.initialize(); + + // Initial resize event, it might be possible that the screen + // resized later during init tho, which is why will emit it later + // again anyways + this.resize(this.app.screenWidth, this.app.screenHeight); + + if (G_IS_DEV) { + // @ts-ignore + window.globalRoot = root; + } + } + + /** + * Initializes a new game, this means creating a new map and centering on the + * plaerbase + * */ + initNewGame() { + logger.log("Initializing new game"); + this.root.gameIsFresh = true; + + gMetaBuildingRegistry + .findByClass(MetaHubBuilding) + .createAndPlaceEntity(this.root, new Vector(-2, -2), 0); + } + + /** + * Inits an existing game by loading the raw savegame data and deserializing it. + * Also runs basic validity checks. + */ + initExistingGame() { + logger.log("Initializing existing game"); + const serializer = new SavegameSerializer(); + + try { + const status = serializer.deserialize(this.root.savegame.getCurrentDump(), this.root); + if (!status.isGood()) { + logger.error("savegame-deserialize-failed:" + status.reason); + return false; + } + } catch (ex) { + logger.error("Exception during deserialization:", ex); + return false; + } + this.root.gameIsFresh = false; + return true; + } + + /** + * Initializes the render canvas + */ + internalInitCanvas() { + let canvas, context; + if (!lastCanvas) { + logger.log("Creating new canvas"); + canvas = document.createElement("canvas"); + canvas.id = "ingame_Canvas"; + canvas.setAttribute("opaque", "true"); + canvas.setAttribute("webkitOpaque", "true"); + canvas.setAttribute("mozOpaque", "true"); + this.root.gameState.getDivElement().appendChild(canvas); + context = canvas.getContext("2d", { alpha: false }); + + lastCanvas = canvas; + lastContext = context; + } else { + logger.log("Reusing canvas"); + if (lastCanvas.parentElement) { + lastCanvas.parentElement.removeChild(lastCanvas); + } + this.root.gameState.getDivElement().appendChild(lastCanvas); + + canvas = lastCanvas; + context = lastContext; + + lastContext.clearRect(0, 0, lastCanvas.width, lastCanvas.height); + } + + // globalConfig.smoothing.smoothMainCanvas = getDeviceDPI() < 1.5; + // globalConfig.smoothing.smoothMainCanvas = true; + + canvas.classList.toggle("smoothed", globalConfig.smoothing.smoothMainCanvas); + + // Oof, use :not() instead + canvas.classList.toggle("unsmoothed", !globalConfig.smoothing.smoothMainCanvas); + + if (globalConfig.smoothing.smoothMainCanvas) { + enableImageSmoothing(context); + } else { + disableImageSmoothing(context); + } + + this.root.canvas = canvas; + this.root.context = context; + + registerCanvas(canvas, context); + } + + /** + * Destructs the root, freeing all resources + */ + destruct() { + if (lastCanvas && lastCanvas.parentElement) { + lastCanvas.parentElement.removeChild(lastCanvas); + } + + this.root.destruct(); + delete this.root; + this.root = null; + this.app = null; + } + + tick(deltaMs) { + const root = this.root; + + if (root.hud.parts.processingOverlay.hasTasks() || root.hud.parts.processingOverlay.isRunning()) { + return true; + } + + // Extract current real time + root.time.updateRealtimeNow(); + + // Camera is always updated, no matter what + root.camera.update(deltaMs); + + // Perform logic ticks + this.root.time.performTicks(deltaMs, this.boundInternalTick); + + // Update UI particles + this.uiTimeBudget += deltaMs; + const maxUiSteps = 3; + if (this.uiTimeBudget > globalConfig.physicsDeltaMs * maxUiSteps) { + this.uiTimeBudget = globalConfig.physicsDeltaMs; + } + while (this.uiTimeBudget >= globalConfig.physicsDeltaMs) { + this.uiTimeBudget -= globalConfig.physicsDeltaMs; + // root.uiParticleMgr.update(); + } + + // Update automatic save after everything finished + root.automaticSave.update(); + + return true; + } + + shouldRender() { + if (this.root.queue.requireRedraw) { + return true; + } + if (this.root.hud.shouldPauseRendering()) { + return false; + } + + // Do not render + if (!this.app.isRenderable()) { + return false; + } + + return true; + } + + updateLogic() { + const root = this.root; + this.duringLogicUpdate = true; + + // Update entities, this removes destroyed entities + root.entityMgr.update(); + + // IMPORTANT: At this point, the game might be game over. Stop if this is the case + if (!this.root) { + logger.log("Root destructed, returning false"); + return false; + } + + root.systemMgr.update(); + // root.particleMgr.update(); + + this.duringLogicUpdate = false; + + return true; + } + + resize(w, h) { + this.root.gameWidth = w; + this.root.gameHeight = h; + resizeHighDPICanvas(this.root.canvas, w, h, globalConfig.smoothing.smoothMainCanvas); + this.root.signals.resized.dispatch(w, h); + this.root.queue.requireRedraw = true; + } + + postLoadHook() { + logger.log("Dispatching post load hook"); + this.root.signals.postLoadHook.dispatch(); + + if (!this.root.gameIsFresh) { + // Also dispatch game restored hook on restored savegames + this.root.signals.gameRestored.dispatch(); + } + + this.root.gameInitialized = true; + } + + draw() { + const root = this.root; + const systems = root.systemMgr.systems; + + const taskRunner = root.hud.parts.processingOverlay; + if (taskRunner.hasTasks()) { + if (!taskRunner.isRunning()) { + taskRunner.process(); + } + return; + } + + if (!this.shouldRender()) { + // Always update hud tho + root.hud.update(); + return; + } + + // Update buffers as the very first + root.buffers.update(); + + root.queue.requireRedraw = false; + + // Gather context and save all state + const context = root.context; + context.save(); + + // Compute optimal zoom level and atlas scale + const zoomLevel = root.camera.zoomLevel; + const effectiveZoomLevel = + (zoomLevel / globalConfig.assetsDpi) * getDeviceDPI() * globalConfig.assetsSharpness; + + let desiredAtlasScale = "0.1"; + if (effectiveZoomLevel > 0.75) { + desiredAtlasScale = "1"; + } else if (effectiveZoomLevel > 0.5) { + desiredAtlasScale = "0.75"; + } else if (effectiveZoomLevel > 0.25) { + desiredAtlasScale = "0.5"; + } else if (effectiveZoomLevel > 0.1) { + desiredAtlasScale = "0.25"; + } + + // Construct parameters required for drawing + const params = new DrawParameters({ + context: context, + visibleRect: root.camera.getVisibleRect(), + desiredAtlasScale, + zoomLevel, + root: root, + }); + + if (G_IS_DEV && (globalConfig.debug.testCulling || globalConfig.debug.hideFog)) { + context.clearRect(0, 0, root.gameWidth, root.gameHeight); + } + + // Transform to world space + root.camera.transform(context); + + assert(context.globalAlpha === 1.0, "Global alpha not 1 on frame start"); + + // Update hud + root.hud.update(); + + // Main rendering order + // ----- + + root.map.drawBackground(params); + // systems.mapResources.draw(params); + + if (!this.root.camera.getIsMapOverlayActive()) { + systems.itemProcessor.drawUnderlays(params); + systems.belt.draw(params); + systems.itemEjector.draw(params); + systems.itemProcessor.draw(params); + } + + root.map.drawForeground(params); + if (!this.root.camera.getIsMapOverlayActive()) { + systems.hub.draw(params); + } + + if (G_IS_DEV) { + root.map.drawStaticEntities(params); + } + + // END OF GAME CONTENT + // ----- + + // Finally, draw the hud. Nothing should come after that + root.hud.draw(params); + + assert(context.globalAlpha === 1.0, "Global alpha not 1 on frame end before restore"); + + // Restore to screen space + context.restore(); + + // Draw overlays, those are screen space + root.hud.drawOverlays(params); + + assert(context.globalAlpha === 1.0, "context.globalAlpha not 1 on frame end"); + + if (G_IS_DEV && globalConfig.debug.simulateSlowRendering) { + let sum = 0; + for (let i = 0; i < 1e8; ++i) { + sum += i; + } + if (Math_random() > 0.95) { + console.log(sum); + } + } + } +} diff --git a/src/js/game/entity.js b/src/js/game/entity.js new file mode 100644 index 00000000..4161f2a7 --- /dev/null +++ b/src/js/game/entity.js @@ -0,0 +1,222 @@ +/* typehints:start */ +import { GameRoot } from "./root"; +import { DrawParameters } from "../core/draw_parameters"; +import { Component } from "./component"; +/* typehints:end */ + +import { globalConfig } from "../core/config"; +import { Vector, enumDirectionToVector, enumDirectionToAngle } from "../core/vector"; +import { BasicSerializableObject, types } from "../savegame/serialization"; +import { EntityComponentStorage } from "./entity_components"; +import { Loader } from "../core/loader"; +import { drawRotatedSprite } from "../core/draw_utils"; +import { Math_radians } from "../core/builtins"; +// import { gFactionRegistry, gComponentRegistry } from "../core/global_registries"; +// import { EntityComponentStorage } from "./entity_components"; + +export class Entity extends BasicSerializableObject { + /** + * @param {GameRoot} root + */ + constructor(root) { + super(); + + /** + * Handle to the global game root + */ + this.root = root; + + /** + * The metaclass of the entity, should be set by subclasses + */ + this.meta = null; + + /** + * The components of the entity + */ + this.components = new EntityComponentStorage(); + + /** + * Whether this entity was registered on the @see EntityManager so far + */ + this.registered = false; + + /** + * Internal entity unique id, set by the @see EntityManager + */ + this.uid = 0; + + /* typehints:start */ + + /** + * Stores if this entity is destroyed, set by the @see EntityManager + * @type {boolean} */ + this.destroyed; + + /** + * Stores if this entity is queued to get destroyed in the next tick + * of the @see EntityManager + * @type {boolean} */ + this.queuedForDestroy; + + /** + * Stores the reason why this entity was destroyed + * @type {string} */ + this.destroyReason; + + /* typehints:end */ + } + + static getId() { + return "Entity"; + } + + /** + * @see BasicSerializableObject.getSchema + * @returns {import("../savegame/serialization").Schema} + */ + static getSchema() { + return { + uid: types.uint, + // components: types.keyValueMap(types.objData(gComponentRegistry), false) + }; + } + + /** + * Returns whether the entity is still alive + * @returns {boolean} + */ + isAlive() { + return !this.destroyed && !this.queuedForDestroy; + } + + /** + * Returns the meta class of the entity. + * @returns {object} + */ + getMetaclass() { + assert(this.meta, "Entity has no metaclass"); + return this.meta; + } + + /** + * Internal destroy callback + */ + internalDestroyCallback() { + assert(!this.destroyed, "Can not destroy entity twice"); + this.destroyed = true; + } + + /** + * Adds a new component, only possible until the entity is registered on the entity manager, + * after that use @see EntityManager.addDynamicComponent + * @param {Component} componentInstance + * @param {boolean} force Used by the entity manager. Internal parameter, do not change + */ + addComponent(componentInstance, force = false) { + assert(force || !this.registered, "Entity already registered, use EntityManager.addDynamicComponent"); + const id = /** @type {typeof Component} */ (componentInstance.constructor).getId(); + assert(!this.components[id], "Component already present"); + this.components[id] = componentInstance; + } + + /** + * Removes a given component, only possible until the entity is registered on the entity manager, + * after that use @see EntityManager.removeDynamicComponent + * @param {typeof Component} componentClass + */ + removeComponent(componentClass) { + assert(!this.registered, "Entity already registered, use EntityManager.removeDynamicComponent"); + const id = componentClass.getId(); + assert(this.components[id], "Component does not exist on entity"); + delete this.components[id]; + } + + /** + * Draws the entity, to override use @see Entity.drawImpl + * @param {DrawParameters} parameters + */ + draw(parameters) { + const context = parameters.context; + const staticComp = this.components.StaticMapEntity; + + if (G_IS_DEV && staticComp && globalConfig.debug.showEntityBounds) { + if (staticComp) { + const transformed = staticComp.getTileSpaceBounds(); + context.strokeStyle = "rgba(255, 0, 0, 0.5)"; + context.lineWidth = 2; + // const boundsSize = 20; + context.beginPath(); + context.rect( + transformed.x * globalConfig.tileSize, + transformed.y * globalConfig.tileSize, + transformed.w * globalConfig.tileSize, + transformed.h * globalConfig.tileSize + ); + context.stroke(); + } + } + if (G_IS_DEV && staticComp && globalConfig.debug.showAcceptorEjectors) { + const ejectorComp = this.components.ItemEjector; + + if (ejectorComp) { + const ejectorSprite = Loader.getSprite("sprites/debug/ejector_slot.png"); + for (let i = 0; i < ejectorComp.slots.length; ++i) { + const slot = ejectorComp.slots[i]; + const slotTile = staticComp.localTileToWorld(slot.pos); + const direction = staticComp.localDirectionToWorld(slot.direction); + const directionVector = enumDirectionToVector[direction]; + const angle = Math_radians(enumDirectionToAngle[direction]); + + context.globalAlpha = slot.item ? 1 : 0.2; + drawRotatedSprite({ + parameters, + sprite: ejectorSprite, + x: (slotTile.x + 0.5 + directionVector.x * 0.37) * globalConfig.tileSize, + y: (slotTile.y + 0.5 + directionVector.y * 0.37) * globalConfig.tileSize, + angle, + size: globalConfig.tileSize * 0.25, + }); + } + } + const acceptorComp = this.components.ItemAcceptor; + + if (acceptorComp) { + const acceptorSprite = Loader.getSprite("sprites/debug/acceptor_slot.png"); + for (let i = 0; i < acceptorComp.slots.length; ++i) { + const slot = acceptorComp.slots[i]; + const slotTile = staticComp.localTileToWorld(slot.pos); + for (let k = 0; k < slot.directions.length; ++k) { + const direction = staticComp.localDirectionToWorld(slot.directions[k]); + const directionVector = enumDirectionToVector[direction]; + const angle = Math_radians(enumDirectionToAngle[direction] + 180); + context.globalAlpha = 0.4; + drawRotatedSprite({ + parameters, + sprite: acceptorSprite, + x: (slotTile.x + 0.5 + directionVector.x * 0.37) * globalConfig.tileSize, + y: (slotTile.y + 0.5 + directionVector.y * 0.37) * globalConfig.tileSize, + angle, + size: globalConfig.tileSize * 0.25, + }); + } + } + } + + context.globalAlpha = 1; + } + // this.drawImpl(parameters); + } + + ///// Helper interfaces + + ///// Interface to override by subclasses + + /** + * override, should draw the entity + * @param {DrawParameters} parameters + */ + drawImpl(parameters) { + abstract; + } +} diff --git a/src/js/game/entity_components.js b/src/js/game/entity_components.js new file mode 100644 index 00000000..5b58264b --- /dev/null +++ b/src/js/game/entity_components.js @@ -0,0 +1,57 @@ +/* typehints:start */ +import { StaticMapEntityComponent } from "./components/static_map_entity"; +import { BeltComponent } from "./components/belt"; +import { ItemEjectorComponent } from "./components/item_ejector"; +import { ItemAcceptorComponent } from "./components/item_acceptor"; +import { MinerComponent } from "./components/miner"; +import { ItemProcessorComponent } from "./components/item_processor"; +import { ReplaceableMapEntityComponent } from "./components/replaceable_map_entity"; +import { UndergroundBeltComponent } from "./components/underground_belt"; +import { UnremovableComponent } from "./components/unremovable"; +import { HubComponent } from "./components/hub"; +/* typehints:end */ + +/** + * Typedefs for all entity components. These are not actually present on the entity, + * thus they are undefined by default + */ +export class EntityComponentStorage { + constructor() { + // TODO: Figure out if its faster to declare all components here and not + // compile them out (In theory, should make it a fast object in V8 engine) + + /* typehints:start */ + + /** @type {StaticMapEntityComponent} */ + this.StaticMapEntity; + + /** @type {BeltComponent} */ + this.Belt; + + /** @type {ItemEjectorComponent} */ + this.ItemEjector; + + /** @type {ItemAcceptorComponent} */ + this.ItemAcceptor; + + /** @type {MinerComponent} */ + this.Miner; + + /** @type {ItemProcessorComponent} */ + this.ItemProcessor; + + /** @type {ReplaceableMapEntityComponent} */ + this.ReplaceableMapEntity; + + /** @type {UndergroundBeltComponent} */ + this.UndergroundBelt; + + /** @type {UnremovableComponent} */ + this.Unremovable; + + /** @type {HubComponent} */ + this.Hub; + + /* typehints:end */ + } +} diff --git a/src/js/game/entity_manager.js b/src/js/game/entity_manager.js new file mode 100644 index 00000000..84a92768 --- /dev/null +++ b/src/js/game/entity_manager.js @@ -0,0 +1,239 @@ +import { arrayDeleteValue, newEmptyMap } from "../core/utils"; +import { Component } from "./component"; +import { GameRoot } from "./root"; +import { Entity } from "./entity"; +import { BasicSerializableObject, types } from "../savegame/serialization"; +import { createLogger } from "../core/logging"; + +const logger = createLogger("entity_manager"); + +// Manages all entities + +// TODO & NOTICE: We use arrayDeleteValue instead of fastArrayDeleteValue since that does not preserve the order +// This is slower but we need it for the street path generation + +export class EntityManager extends BasicSerializableObject { + constructor(root) { + super(); + + /** @type {GameRoot} */ + this.root = root; + + /** @type {Array} */ + this.entities = []; + + // We store a seperate list with entities to destroy, since we don't destroy + // them instantly + /** @type {Array} */ + this.destroyList = []; + + // Store a map from componentid to entities - This is used by the game system + // for faster processing + /** @type {Object.>} */ + this.componentToEntity = newEmptyMap(); + + // Store the next uid to use + this.nextUid = 10000; + } + + static getId() { + return "EntityManager"; + } + + static getSchema() { + return { + nextUid: types.uint, + }; + } + + getStatsText() { + return this.entities.length + " entities [" + this.destroyList.length + " to kill]"; + } + + // Main update + update() { + this.processDestroyList(); + } + + /** + * Registers a new entity + * @param {Entity} entity + * @param {number=} uid Optional predefined uid + */ + registerEntity(entity, uid = null) { + assert(this.entities.indexOf(entity) < 0, `RegisterEntity() called twice for entity ${entity}`); + assert(!entity.destroyed, `Attempting to register destroyed entity ${entity}`); + + if (G_IS_DEV && uid !== null) { + assert(!this.findByUid(uid, false), "Entity uid already taken: " + uid); + } + + if (uid !== null) { + assert(uid >= 0 && uid < Number.MAX_SAFE_INTEGER, "Invalid uid passed: " + uid); + } + + this.entities.push(entity); + + // Register into the componentToEntity map + for (const componentId in entity.components) { + if (entity.components[componentId]) { + if (this.componentToEntity[componentId]) { + this.componentToEntity[componentId].push(entity); + } else { + this.componentToEntity[componentId] = [entity]; + } + } + } + + // Give each entity a unique id + entity.uid = uid ? uid : this.generateUid(); + entity.registered = true; + + this.root.signals.entityAdded.dispatch(entity); + } + + /** + * Sorts all entitiy lists after a resync + */ + sortEntityLists() { + this.entities.sort((a, b) => a.uid - b.uid); + this.destroyList.sort((a, b) => a.uid - b.uid); + + for (const key in this.componentToEntity) { + this.componentToEntity[key].sort((a, b) => a.uid - b.uid); + } + } + + /** + * Generates a new uid + * @returns {number} + */ + generateUid() { + return this.nextUid++; + } + + /** + * Call to attach a new component after the creation of the entity + * @param {Entity} entity + * @param {Component} component + */ + attachDynamicComponent(entity, component) { + entity.addComponent(component, true); + const componentId = /** @type {typeof Component} */ (component.constructor).getId(); + if (this.componentToEntity[componentId]) { + this.componentToEntity[componentId].push(entity); + } else { + this.componentToEntity[componentId] = [entity]; + } + this.root.signals.entityGotNewComponent.dispatch(entity); + } + + /** + * Finds an entity buy its uid, kinda slow since it loops over all entities + * @param {number} uid + * @param {boolean=} errorWhenNotFound + * @returns {Entity} + */ + findByUid(uid, errorWhenNotFound = true) { + const arr = this.entities; + for (let i = 0, len = arr.length; i < len; ++i) { + const entity = arr[i]; + if (entity.uid === uid) { + if (entity.queuedForDestroy || entity.destroyed) { + if (errorWhenNotFound) { + logger.warn("Entity with UID", uid, "not found (destroyed)"); + } + return null; + } + return entity; + } + } + if (errorWhenNotFound) { + logger.warn("Entity with UID", uid, "not found"); + } + return null; + } + + /** + * Returns all entities having the given component + * @param {typeof Component} componentHandle + * @returns {Array} entities + */ + getAllWithComponent(componentHandle) { + return this.componentToEntity[componentHandle.getId()] || []; + } + + /** + * Return all of a given class. This is SLOW! + * @param {object} entityClass + * @returns {Array} entities + */ + getAllOfClass(entityClass) { + // FIXME: Slow + const result = []; + for (let i = 0; i < this.entities.length; ++i) { + const entity = this.entities[i]; + if (entity instanceof entityClass) { + result.push(entity); + } + } + return result; + } + + /** + * Unregisters all components of an entity from the component to entity mapping + * @param {Entity} entity + */ + unregisterEntityComponents(entity) { + for (const componentId in entity.components) { + if (entity.components[componentId]) { + arrayDeleteValue(this.componentToEntity[componentId], entity); + } + } + } + + // Processes the entities to destroy and actually destroys them + /* eslint-disable max-statements */ + processDestroyList() { + for (let i = 0; i < this.destroyList.length; ++i) { + const entity = this.destroyList[i]; + + // Remove from entities list + arrayDeleteValue(this.entities, entity); + + // Remove from componentToEntity list + this.unregisterEntityComponents(entity); + + entity.registered = false; + entity.internalDestroyCallback(); + + this.root.signals.entityDestroyed.dispatch(entity); + } + + this.destroyList = []; + } + + /** + * Queues an entity for destruction + * @param {Entity} entity + */ + destroyEntity(entity) { + if (entity.destroyed) { + logger.error("Tried to destroy already destroyed entity:", entity.uid); + return; + } + + if (entity.queuedForDestroy) { + logger.error("Trying to destroy entity which is already queued for destroy!", entity.uid); + return; + } + + if (this.destroyList.indexOf(entity) < 0) { + this.destroyList.push(entity); + entity.queuedForDestroy = true; + this.root.signals.entityQueuedForDestroy.dispatch(entity); + } else { + assert(false, "Trying to destroy entity twice"); + } + } +} diff --git a/src/js/game/game_loading_overlay.js b/src/js/game/game_loading_overlay.js new file mode 100644 index 00000000..63aadb02 --- /dev/null +++ b/src/js/game/game_loading_overlay.js @@ -0,0 +1,57 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +export class GameLoadingOverlay { + /** + * + * @param {Application} app + * @param {HTMLElement} parent + */ + constructor(app, parent) { + this.app = app; + this.parent = parent; + + /** @type {HTMLElement} */ + this.element = null; + } + + /** + * Removes the overlay if its currently visible + */ + removeIfAttached() { + if (this.element) { + this.element.remove(); + this.element = null; + } + } + + /** + * Returns if the loading overlay is attached + */ + isAttached() { + return this.element; + } + + /** + * Shows a super basic overlay + */ + showBasic() { + assert(!this.element, "Loading overlay already visible, cant show again"); + this.element = document.createElement("div"); + this.element.classList.add("gameLoadingOverlay"); + this.parent.appendChild(this.element); + this.internalAddSpinnerAndText(this.element); + } + + /** + * Adds a text with 'loading' and a spinner + * @param {HTMLElement} element + */ + internalAddSpinnerAndText(element) { + const inner = document.createElement("span"); + inner.classList.add("prefab_LoadingTextWithAnim"); + inner.innerText = "Loading"; + element.appendChild(inner); + } +} diff --git a/src/js/game/game_system.js b/src/js/game/game_system.js new file mode 100644 index 00000000..defae1bf --- /dev/null +++ b/src/js/game/game_system.js @@ -0,0 +1,43 @@ +/* typehints:start */ +import { GameRoot } from "./root"; +import { DrawParameters } from "../core/draw_parameters"; +/* typehints:end */ + +/** + * A game system processes all entities which match a given schema, usually a list of + * required components. This is the core of the game logic. + */ +export class GameSystem { + /** + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + } + + ///// PUBLIC API ///// + + /** + * Updates the game system, override to perform logic + */ + update() {} + + /** + * Override, do not call this directly, use startDraw() + * @param {DrawParameters} parameters + */ + draw(parameters) {} + + /** + * Should refresh all caches + */ + refreshCaches() {} + + /** + * @see GameSystem.draw Wrapper arround the draw method + * @param {DrawParameters} parameters + */ + startDraw(parameters) { + this.draw(parameters); + } +} diff --git a/src/js/game/game_system_manager.js b/src/js/game/game_system_manager.js new file mode 100644 index 00000000..810ddec0 --- /dev/null +++ b/src/js/game/game_system_manager.js @@ -0,0 +1,104 @@ +/* typehints:start */ +import { GameRoot } from "./root"; +/* typehints:end */ + +import { createLogger } from "../core/logging"; +import { BeltSystem } from "./systems/belt"; +import { ItemEjectorSystem } from "./systems/item_ejector"; +import { MapResourcesSystem } from "./systems/map_resources"; +import { MinerSystem } from "./systems/miner"; +import { ItemProcessorSystem } from "./systems/item_processor"; +import { UndergroundBeltSystem } from "./systems/underground_belt"; +import { HubSystem } from "./systems/hub"; +import { StaticMapEntitySystem } from "./systems/static_map_entity"; + +const logger = createLogger("game_system_manager"); + +export class GameSystemManager { + /** + * + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + + this.systems = { + /* typehints:start */ + /** @type {BeltSystem} */ + belt: null, + + /** @type {ItemEjectorSystem} */ + itemEjector: null, + + /** @type {MapResourcesSystem} */ + mapResources: null, + + /** @type {MinerSystem} */ + miner: null, + + /** @type {ItemProcessorSystem} */ + itemProcessor: null, + + /** @type {UndergroundBeltSystem} */ + undergroundBelt: null, + + /** @type {HubSystem} */ + hub: null, + + /** @type {StaticMapEntitySystem} */ + staticMapEntities: null, + + /* typehints:end */ + }; + this.systemUpdateOrder = []; + + this.internalInitSystems(); + } + + /** + * Initializes all systems + */ + internalInitSystems() { + const add = (id, systemClass) => { + this.systems[id] = new systemClass(this.root); + this.systemUpdateOrder.push(id); + }; + + // Order is important! + + add("belt", BeltSystem); + + add("itemEjector", ItemEjectorSystem); + + add("miner", MinerSystem); + + add("mapResources", MapResourcesSystem); + + add("itemProcessor", ItemProcessorSystem); + + add("undergroundBelt", UndergroundBeltSystem); + + add("hub", HubSystem); + + add("staticMapEntities", StaticMapEntitySystem); + + logger.log("📦 There are", this.systemUpdateOrder.length, "game systems"); + } + + /** + * Updates all systems + */ + update() { + for (let i = 0; i < this.systemUpdateOrder.length; ++i) { + const system = this.systems[this.systemUpdateOrder[i]]; + system.update(); + } + } + + refreshCaches() { + for (let i = 0; i < this.systemUpdateOrder.length; ++i) { + const system = this.systems[this.systemUpdateOrder[i]]; + system.refreshCaches(); + } + } +} diff --git a/src/js/game/game_system_with_filter.js b/src/js/game/game_system_with_filter.js new file mode 100644 index 00000000..3585c24e --- /dev/null +++ b/src/js/game/game_system_with_filter.js @@ -0,0 +1,175 @@ +/* typehints:start */ +import { Component } from "./component"; +import { GameRoot } from "./root"; +import { Entity } from "./entity"; +/* typehints:end */ + +import { GameSystem } from "./game_system"; +import { arrayDelete } from "../core/utils"; +import { DrawParameters } from "../core/draw_parameters"; +import { globalConfig } from "../core/config"; +import { Math_floor, Math_ceil } from "../core/builtins"; + +export class GameSystemWithFilter extends GameSystem { + /** + * Constructs a new game system with the given component filter. It will process + * all entities which have *all* of the passed components + * @param {GameRoot} root + * @param {Array} requiredComponents + */ + constructor(root, requiredComponents) { + super(root); + this.requiredComponents = requiredComponents; + this.requiredComponentIds = requiredComponents.map(component => component.getId()); + + /** + * All entities which match the current components + * @type {Array} + */ + this.allEntities = []; + + this.root.signals.entityAdded.add(this.internalPushEntityIfMatching, this); + this.root.signals.entityGotNewComponent.add(this.internalReconsiderEntityToAdd, this); + this.root.signals.entityQueuedForDestroy.add(this.internalPopEntityIfMatching, this); + + this.root.signals.postLoadHook.add(this.internalPostLoadHook, this); + } + + /** + * Calls a function for each matching entity on the screen, useful for drawing them + * @param {DrawParameters} parameters + * @param {function} callback + */ + forEachMatchingEntityOnScreen(parameters, callback) { + const cullRange = parameters.visibleRect.toTileCullRectangle(); + if (this.allEntities.length < 100) { + // So, its much quicker to simply perform per-entity checking + + for (let i = 0; i < this.allEntities.length; ++i) { + const entity = this.allEntities[i]; + if (cullRange.containsRect(entity.components.StaticMapEntity.getTileSpaceBounds())) { + callback(parameters, entity); + } + } + return; + } + + const top = cullRange.top(); + const right = cullRange.right(); + const bottom = cullRange.bottom(); + const left = cullRange.left(); + + const border = 1; + const minY = top - border; + const maxY = bottom + border; + const minX = left - border; + const maxX = right + border - 1; + + const map = this.root.map; + + let seenUids = new Set(); + + const chunkStartX = Math_floor(minX / globalConfig.mapChunkSize); + const chunkStartY = Math_floor(minY / globalConfig.mapChunkSize); + + const chunkEndX = Math_ceil(maxX / globalConfig.mapChunkSize); + const chunkEndY = Math_ceil(maxY / globalConfig.mapChunkSize); + + const requiredComponents = this.requiredComponentIds; + + // Render y from top down for proper blending + for (let chunkX = chunkStartX; chunkX <= chunkEndX; ++chunkX) { + for (let chunkY = chunkStartY; chunkY <= chunkEndY; ++chunkY) { + const chunk = map.getChunk(chunkX, chunkY, false); + if (!chunk) { + continue; + } + + // BIG TODO: CULLING ON AN ENTITY BASIS + + const entities = chunk.containedEntities; + entityLoop: for (let i = 0; i < entities.length; ++i) { + const entity = entities[i]; + + // Avoid drawing twice + if (seenUids.has(entity.uid)) { + continue; + } + seenUids.add(entity.uid); + + for (let i = 0; i < requiredComponents.length; ++i) { + if (!entity.components[requiredComponents[i]]) { + continue entityLoop; + } + } + callback(parameters, entity); + } + } + } + } + + /** + * @param {Entity} entity + */ + internalPushEntityIfMatching(entity) { + for (let i = 0; i < this.requiredComponentIds.length; ++i) { + if (!entity.components[this.requiredComponentIds[i]]) { + return; + } + } + + assert(this.allEntities.indexOf(entity) < 0, "entity already in list: " + entity); + this.internalRegisterEntity(entity); + } + + /** + * + * @param {Entity} entity + */ + internalReconsiderEntityToAdd(entity) { + for (let i = 0; i < this.requiredComponentIds.length; ++i) { + if (!entity.components[this.requiredComponentIds[i]]) { + return; + } + } + if (this.allEntities.indexOf(entity) >= 0) { + return; + } + this.internalRegisterEntity(entity); + } + + refreshCaches() { + this.allEntities.sort((a, b) => a.uid - b.uid); + } + + /** + * Recomputes all target entities after the game has loaded + */ + internalPostLoadHook() { + this.refreshCaches(); + } + + /** + * + * @param {Entity} entity + */ + internalRegisterEntity(entity) { + this.allEntities.push(entity); + + if (this.root.gameInitialized) { + // Sort entities by uid so behaviour is predictable + this.allEntities.sort((a, b) => a.uid - b.uid); + } + } + + /** + * + * @param {Entity} entity + */ + internalPopEntityIfMatching(entity) { + const index = this.allEntities.indexOf(entity); + if (index >= 0) { + arrayDelete(this.allEntities, index); + } + } +} diff --git a/src/js/game/hub_goals.js b/src/js/game/hub_goals.js new file mode 100644 index 00000000..a14239ac --- /dev/null +++ b/src/js/game/hub_goals.js @@ -0,0 +1,330 @@ +import { BasicSerializableObject } from "../savegame/serialization"; +import { GameRoot } from "./root"; +import { ShapeDefinition, enumSubShape } from "./shape_definition"; +import { enumColors } from "./colors"; +import { randomChoice, clamp, randomInt, findNiceIntegerValue } from "../core/utils"; +import { tutorialGoals, enumHubGoalRewards } from "./tutorial_goals"; +import { createLogger } from "../core/logging"; +import { globalConfig } from "../core/config"; +import { Math_random } from "../core/builtins"; +import { UPGRADES } from "./upgrades"; +import { enumItemProcessorTypes } from "./components/item_processor"; + +const logger = createLogger("hub_goals"); + +export class HubGoals extends BasicSerializableObject { + static getId() { + return "HubGoals"; + } + + /** + * @param {GameRoot} root + */ + constructor(root) { + super(); + + this.root = root; + + this.level = 1; + + /** + * Which story rewards we already gained + */ + this.gainedRewards = {}; + + /** + * Mapping from shape hash -> amount + * @type {Object} + */ + this.storedShapes = {}; + + /** + * Stores the levels for all upgrades + * @type {Object} + */ + this.upgradeLevels = {}; + + /** + * Stores the improvements for all upgrades + * @type {Object} + */ + this.upgradeImprovements = {}; + for (const key in UPGRADES) { + this.upgradeImprovements[key] = UPGRADES[key].baseValue || 1; + } + + this.createNextGoal(); + + // Allow quickly switching goals in dev mode with key "C" + if (G_IS_DEV) { + this.root.gameState.inputReciever.keydown.add(key => { + if (key.keyCode === 67) { + // Key: c + this.onGoalCompleted(); + } + }); + } + } + + /** + * Returns how much of the current shape is stored + * @param {ShapeDefinition} definition + * @returns {number} + */ + getShapesStored(definition) { + return this.storedShapes[definition.getHash()] || 0; + } + + /** + * Returns how much of the current goal was already delivered + */ + getCurrentGoalDelivered() { + return this.getShapesStored(this.currentGoal.definition); + } + + /** + * Returns the current level of a given upgrade + * @param {string} upgradeId + */ + getUpgradeLevel(upgradeId) { + return this.upgradeLevels[upgradeId] || 0; + } + + /** + * Returns whether the given reward is already unlocked + * @param {enumHubGoalRewards} reward + */ + isRewardUnlocked(reward) { + if (G_IS_DEV && globalConfig.debug.allBuildingsUnlocked) { + return true; + } + return !!this.gainedRewards[reward]; + } + + /** + * Handles the given definition, by either accounting it towards the + * goal or otherwise granting some points + * @param {ShapeDefinition} definition + */ + handleDefinitionDelivered(definition) { + const hash = definition.getHash(); + this.storedShapes[hash] = (this.storedShapes[hash] || 0) + 1; + + // Check if we have enough for the next level + const targetHash = this.currentGoal.definition.getHash(); + if ( + this.storedShapes[targetHash] >= this.currentGoal.required || + (G_IS_DEV && globalConfig.debug.rewardsInstant) + ) { + this.onGoalCompleted(); + } + } + + /** + * Creates the next goal + */ + createNextGoal() { + const storyIndex = this.level - 1; + if (storyIndex < tutorialGoals.length) { + const { shape, required, reward } = tutorialGoals[storyIndex]; + this.currentGoal = { + /** @type {ShapeDefinition} */ + definition: this.root.shapeDefinitionMgr.registerOrReturnHandle( + ShapeDefinition.fromShortKey(shape) + ), + required, + reward, + }; + return; + } + + const reward = enumHubGoalRewards.no_reward; + + this.currentGoal = { + /** @type {ShapeDefinition} */ + definition: this.createRandomShape(), + required: 1000 + findNiceIntegerValue(this.level * 47.5), + reward, + }; + } + + /** + * Called when the level was completed + */ + onGoalCompleted() { + const reward = this.currentGoal.reward; + this.gainedRewards[reward] = (this.gainedRewards[reward] || 0) + 1; + this.root.signals.storyGoalCompleted.dispatch(this.level, reward); + + this.root.app.gameAnalytics.handleLevelCompleted(this.level); + ++this.level; + this.createNextGoal(); + } + + /** + * Returns whether a given upgrade can be unlocked + * @param {string} upgradeId + */ + canUnlockUpgrade(upgradeId) { + const handle = UPGRADES[upgradeId]; + const currentLevel = this.getUpgradeLevel(upgradeId); + + if (currentLevel >= handle.tiers.length) { + // Max level + return false; + } + + if (G_IS_DEV && globalConfig.debug.upgradesNoCost) { + return true; + } + + const tierData = handle.tiers[currentLevel]; + + for (let i = 0; i < tierData.required.length; ++i) { + const requirement = tierData.required[i]; + if ((this.storedShapes[requirement.shape] || 0) < requirement.amount) { + return false; + } + } + return true; + } + + /** + * Tries to unlock the given upgrade + * @param {string} upgradeId + * @returns {boolean} + */ + tryUnlockUgprade(upgradeId) { + if (!this.canUnlockUpgrade(upgradeId)) { + return false; + } + + const handle = UPGRADES[upgradeId]; + const currentLevel = this.getUpgradeLevel(upgradeId); + + const tierData = handle.tiers[currentLevel]; + if (!tierData) { + return false; + } + + if (G_IS_DEV && globalConfig.debug.upgradesNoCost) { + // Dont take resources + } else { + for (let i = 0; i < tierData.required.length; ++i) { + const requirement = tierData.required[i]; + + // Notice: Don't have to check for hash here + this.storedShapes[requirement.shape] -= requirement.amount; + } + } + + this.upgradeLevels[upgradeId] = (this.upgradeLevels[upgradeId] || 0) + 1; + this.upgradeImprovements[upgradeId] += tierData.improvement; + + this.root.signals.upgradePurchased.dispatch(upgradeId); + + this.root.app.gameAnalytics.handleUpgradeUnlocked(upgradeId, currentLevel); + + return true; + } + + /** + * @returns {ShapeDefinition} + */ + createRandomShape() { + const layerCount = clamp(this.level / 50, 2, 4); + /** @type {Array} */ + let layers = []; + + // @ts-ignore + const randomColor = () => randomChoice(Object.values(enumColors)); + // @ts-ignore + const randomShape = () => randomChoice(Object.values(enumSubShape)); + + let anyIsMissingTwo = false; + + for (let i = 0; i < layerCount; ++i) { + /** @type {import("./shape_definition").ShapeLayer} */ + const layer = [null, null, null, null]; + + for (let quad = 0; quad < 4; ++quad) { + layer[quad] = { + subShape: randomShape(), + color: randomColor(), + }; + } + + // Sometimes shapes are missing + if (Math_random() > 0.85) { + layer[randomInt(0, 3)] = null; + } + + // Sometimes they actually are missing *two* ones! + // Make sure at max only one layer is missing it though, otherwise we could + // create an uncreateable shape + if (Math_random() > 0.95 && !anyIsMissingTwo) { + layer[randomInt(0, 3)] = null; + anyIsMissingTwo = true; + } + + layers.push(layer); + } + + const definition = new ShapeDefinition({ layers }); + return this.root.shapeDefinitionMgr.registerOrReturnHandle(definition); + } + + ////////////// HELPERS + + /** + * Belt speed + * @returns {number} items / sec + */ + getBeltBaseSpeed() { + return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt; + } + + /** + * Underground belt speed + * @returns {number} items / sec + */ + getUndergroundBeltBaseSpeed() { + return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt; + } + + /** + * Miner speed + * @returns {number} items / sec + */ + getMinerBaseSpeed() { + return globalConfig.minerSpeedItemsPerSecond * this.upgradeImprovements.miner; + } + + /** + * Processor speed + * @param {enumItemProcessorTypes} processorType + * @returns {number} items / sec + */ + getProcessorBaseSpeed(processorType) { + switch (processorType) { + case enumItemProcessorTypes.trash: + return 1e30; + case enumItemProcessorTypes.splitter: + return (2 / globalConfig.beltSpeedItemsPerSecond) * this.upgradeImprovements.splitter; + case enumItemProcessorTypes.cutter: + case enumItemProcessorTypes.rotater: + case enumItemProcessorTypes.stacker: + case enumItemProcessorTypes.mixer: + case enumItemProcessorTypes.painter: + return ( + (1 / globalConfig.beltSpeedItemsPerSecond) * + this.upgradeImprovements.processor * + globalConfig.buildingSpeeds[processorType] + ); + default: + assertAlways(false, "invalid processor type"); + } + + return 1 / globalConfig.beltSpeedItemsPerSecond; + } +} diff --git a/src/js/game/hud/base_hud_part.js b/src/js/game/hud/base_hud_part.js new file mode 100644 index 00000000..cec7e525 --- /dev/null +++ b/src/js/game/hud/base_hud_part.js @@ -0,0 +1,175 @@ +/* typehints:start */ +import { GameRoot } from "../root"; +import { DrawParameters } from "../../core/draw_parameters"; +/* typehints:end */ + +import { ClickDetector } from "../../core/click_detector"; +import { KeyActionMapper } from "../key_action_mapper"; + +export class BaseHUDPart { + /** + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + + /** @type {Array} */ + this.clickDetectors = []; + } + + /** + * Should create all require elements + * @param {HTMLElement} parent + */ + createElements(parent) {} + + /** + * Should initialize the element, called *after* the elements have been created + */ + initialize() { + abstract; + } + + /** + * Should update any required logic + */ + update() {} + + /** + * Should draw the hud + * @param {DrawParameters} parameters + */ + draw(parameters) {} + + /** + * Should draw any overlays (screen space) + * @param {DrawParameters} parameters + */ + drawOverlays(parameters) {} + + /** + * Should return true if the widget has a modal dialog opened and thus + * the game does not need to update / redraw + * @returns {boolean} + */ + shouldPauseRendering() { + return false; + } + + /** + * Should return false if the game should be paused + * @returns {boolean} + */ + shouldPauseGame() { + return false; + } + + /** + * Should return true if this overlay is open and currently blocking any user interaction + */ + isBlockingOverlay() { + return false; + } + + /** + * Cleans up the hud element, if overridden make sure to call super.cleanups + */ + cleanup() { + if (this.clickDetectors) { + for (let i = 0; i < this.clickDetectors.length; ++i) { + this.clickDetectors[i].cleanup(); + } + this.clickDetectors = []; + } + } + + /** + * Should close the element, in case its supported + */ + close() {} + + // Helpers + + /** + * Calls closeMethod if an overlay is opened + * @param {function=} closeMethod + */ + closeOnOverlayOpen(closeMethod = null) { + this.root.hud.signals.overlayOpened.add(overlay => { + if (overlay !== this) { + (closeMethod || this.close).call(this); + } + }, this); + } + + /** + * Helper method to construct a new click detector + * @param {Element} element The element to listen on + * @param {function} handler The handler to call on this object + * @param {import("../../core/click_detector").ClickDetectorConstructorArgs=} args Click detector arguments + * + */ + trackClicks(element, handler, args = {}) { + const detector = new ClickDetector(element, args); + detector.click.add(handler, this); + this.registerClickDetector(detector); + } + + /** + * Registers a new click detector + * @param {ClickDetector} detector + */ + registerClickDetector(detector) { + this.clickDetectors.push(detector); + if (G_IS_DEV) { + // @ts-ignore + detector._src = "hud-" + this.constructor.name; + } + } + + /** + * Closes this element when its background is clicked + * @param {HTMLElement} element + * @param {function} closeMethod + */ + closeOnBackgroundClick(element, closeMethod = null) { + const bgClickDetector = new ClickDetector(element, { + preventDefault: true, + targetOnly: true, + applyCssClass: null, + consumeEvents: true, + clickSound: null, + }); + + // If the state defines a close method, use that as fallback + // @ts-ignore + bgClickDetector.touchend.add(closeMethod || this.close, this); + this.registerClickDetector(bgClickDetector); + } + + /** + * Forwards the game speed keybindings so you can toggle pause / Fastforward + * in the building tooltip and such + * @param {KeyActionMapper} sourceMapper + */ + forwardGameSpeedKeybindings(sourceMapper) { + sourceMapper.forward(this.root.gameState.keyActionMapper, [ + "gamespeed_pause", + "gamespeed_fastforward", + ]); + } + + /** + * Forwards the map movement keybindings so you can move the map with the + * arrow keys + * @param {KeyActionMapper} sourceMapper + */ + forwardMapMovementKeybindings(sourceMapper) { + sourceMapper.forward(this.root.gameState.keyActionMapper, [ + "map_move_up", + "map_move_right", + "map_move_down", + "map_move_left", + ]); + } +} diff --git a/src/js/game/hud/dynamic_dom_attach.js b/src/js/game/hud/dynamic_dom_attach.js new file mode 100644 index 00000000..68f09052 --- /dev/null +++ b/src/js/game/hud/dynamic_dom_attach.js @@ -0,0 +1,79 @@ +import { GameRoot } from "../root"; + +// Automatically attaches and detaches elements from the dom +// Also supports detaching elements after a given time, useful if there is a +// hide animation like for the tooltips + +// Also attaches a class name if desired + +export class DynamicDomAttach { + constructor(root, element, { timeToKeepSeconds = 0, attachClass = null } = {}) { + /** @type {GameRoot} */ + this.root = root; + + /** @type {HTMLElement} */ + this.element = element; + this.parent = this.element.parentElement; + + this.attachClass = attachClass; + + this.timeToKeepSeconds = timeToKeepSeconds; + this.lastVisibleTime = 0; + + // We start attached, so detach the node first + this.attached = true; + this.internalDetach(); + + this.internalIsClassAttached = false; + this.classAttachTimeout = null; + } + + internalAttach() { + if (!this.attached) { + this.parent.appendChild(this.element); + assert(this.element.parentElement === this.parent, "Invalid parent #1"); + this.attached = true; + } + } + + internalDetach() { + if (this.attached) { + assert(this.element.parentElement === this.parent, "Invalid parent #2"); + this.element.parentElement.removeChild(this.element); + this.attached = false; + } + } + + isAttached() { + return this.attached; + } + + update(isVisible) { + if (isVisible) { + this.lastVisibleTime = this.root ? this.root.time.realtimeNow() : 0; + this.internalAttach(); + } else { + if (!this.root || this.root.time.realtimeNow() - this.lastVisibleTime >= this.timeToKeepSeconds) { + this.internalDetach(); + } + } + + if (this.attachClass && isVisible !== this.internalIsClassAttached) { + // State changed + this.internalIsClassAttached = isVisible; + + if (this.classAttachTimeout) { + clearTimeout(this.classAttachTimeout); + this.classAttachTimeout = null; + } + + if (isVisible) { + this.classAttachTimeout = setTimeout(() => { + this.element.classList.add(this.attachClass); + }, 15); + } else { + this.element.classList.remove(this.attachClass); + } + } + } +} diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js new file mode 100644 index 00000000..deae4591 --- /dev/null +++ b/src/js/game/hud/hud.js @@ -0,0 +1,187 @@ +/* typehints:start */ +import { GameRoot } from "../root"; +/* typehints:end */ + +import { Signal } from "../../core/signal"; +import { DrawParameters } from "../../core/draw_parameters"; +import { HUDProcessingOverlay } from "./parts/processing_overlay"; +import { HUDBuildingsToolbar } from "./parts/buildings_toolbar"; +import { HUDBuildingPlacer } from "./parts/building_placer"; +import { HUDBetaOverlay } from "./parts/beta_overlay"; +import { HUDKeybindingOverlay } from "./parts/keybinding_overlay"; +import { HUDUnlockNotification } from "./parts/unlock_notification"; +import { HUDGameMenu } from "./parts/game_menu"; +import { HUDShop } from "./parts/shop"; +import { IS_MOBILE } from "../../core/config"; + +export class GameHUD { + /** + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + } + + /** + * Initializes the hud parts + */ + initialize() { + this.signals = { + overlayOpened: new Signal(/* overlay */), + }; + + this.parts = { + processingOverlay: new HUDProcessingOverlay(this.root), + + buildingsToolbar: new HUDBuildingsToolbar(this.root), + buildingPlacer: new HUDBuildingPlacer(this.root), + + unlockNotification: new HUDUnlockNotification(this.root), + + gameMenu: new HUDGameMenu(this.root), + + shop: new HUDShop(this.root), + + // betaOverlay: new HUDBetaOverlay(this.root), + }; + + this.signals = { + selectedPlacementBuildingChanged: new Signal(/* metaBuilding|null */), + }; + + if (!IS_MOBILE) { + this.parts.keybindingOverlay = new HUDKeybindingOverlay(this.root); + } + + const frag = document.createDocumentFragment(); + for (const key in this.parts) { + this.parts[key].createElements(frag); + } + + document.body.appendChild(frag); + + for (const key in this.parts) { + this.parts[key].initialize(); + } + this.internalInitSignalConnections(); + + this.root.gameState.keyActionMapper.getBinding("toggle_hud").add(this.toggleUi, this); + } + + /** + * Attempts to close all overlays + */ + closeAllOverlays() { + for (const key in this.parts) { + this.parts[key].close(); + } + } + + /** + * Returns true if the game logic should be paused + */ + shouldPauseGame() { + for (const key in this.parts) { + if (this.parts[key].shouldPauseGame()) { + return true; + } + } + return false; + } + + /** + * Returns true if the rendering can be paused + */ + shouldPauseRendering() { + for (const key in this.parts) { + if (this.parts[key].shouldPauseRendering()) { + return true; + } + } + return false; + } + + /** + * Returns true if the rendering can be paused + */ + hasBlockingOverlayOpen() { + if (this.root.camera.getIsMapOverlayActive()) { + return true; + } + for (const key in this.parts) { + if (this.parts[key].isBlockingOverlay()) { + return true; + } + } + return false; + } + + /** + * Toggles the ui + */ + toggleUi() { + document.body.classList.toggle("uiHidden"); + } + + /** + * Initializes connections between parts + */ + internalInitSignalConnections() { + const p = this.parts; + p.buildingsToolbar.sigBuildingSelected.add(p.buildingPlacer.startSelection, p.buildingPlacer); + } + + /** + * Updates all parts + */ + update() { + if (!this.root.gameInitialized) { + return; + } + + for (const key in this.parts) { + this.parts[key].update(); + } + } + + /** + * Draws all parts + * @param {DrawParameters} parameters + */ + draw(parameters) { + const partsOrder = ["buildingPlacer"]; + + for (let i = 0; i < partsOrder.length; ++i) { + if (this.parts[partsOrder[i]]) { + this.parts[partsOrder[i]].draw(parameters); + } + } + } + + /** + * Draws all part overlays + * @param {DrawParameters} parameters + */ + drawOverlays(parameters) { + const partsOrder = []; + + for (let i = 0; i < partsOrder.length; ++i) { + if (this.parts[partsOrder[i]]) { + this.parts[partsOrder[i]].drawOverlays(parameters); + } + } + } + + /** + * Cleans up everything + */ + cleanup() { + for (const key in this.parts) { + this.parts[key].cleanup(); + } + + for (const key in this.signals) { + this.signals[key].removeAll(); + } + } +} diff --git a/src/js/game/hud/parts/beta_overlay.js b/src/js/game/hud/parts/beta_overlay.js new file mode 100644 index 00000000..517a15b7 --- /dev/null +++ b/src/js/game/hud/parts/beta_overlay.js @@ -0,0 +1,10 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv } from "../../../core/utils"; + +export class HUDBetaOverlay extends BaseHUDPart { + createElements(parent) { + this.element = makeDiv(parent, "ingame_HUD_BetaOverlay", [], "CLOSED BETA"); + } + + initialize() {} +} diff --git a/src/js/game/hud/parts/building_placer.js b/src/js/game/hud/parts/building_placer.js new file mode 100644 index 00000000..bb256dc6 --- /dev/null +++ b/src/js/game/hud/parts/building_placer.js @@ -0,0 +1,492 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { MetaBuilding } from "../../meta_building"; +import { DrawParameters } from "../../../core/draw_parameters"; +import { globalConfig } from "../../../core/config"; +import { StaticMapEntityComponent } from "../../components/static_map_entity"; +import { STOP_PROPAGATION, Signal } from "../../../core/signal"; +import { + Vector, + enumDirectionToAngle, + enumInvertedDirections, + enumDirectionToVector, +} from "../../../core/vector"; +import { pulseAnimation, makeDiv } from "../../../core/utils"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; +import { TrackedState } from "../../../core/tracked_state"; +import { Math_abs, Math_radians } from "../../../core/builtins"; +import { Loader } from "../../../core/loader"; +import { drawRotatedSprite } from "../../../core/draw_utils"; +import { Entity } from "../../entity"; + +export class HUDBuildingPlacer extends BaseHUDPart { + initialize() { + /** @type {TypedTrackedState} */ + this.currentMetaBuilding = new TrackedState(this.onSelectedMetaBuildingChanged, this); + this.currentBaseRotation = 0; + + /** @type {Entity} */ + this.fakeEntity = null; + + const keyActionMapper = this.root.gameState.keyActionMapper; + keyActionMapper.getBinding("building_abort_placement").add(() => this.currentMetaBuilding.set(null)); + keyActionMapper.getBinding("back").add(() => this.currentMetaBuilding.set(null)); + + keyActionMapper.getBinding("rotate_while_placing").add(this.tryRotate, this); + + this.domAttach = new DynamicDomAttach(this.root, this.element, {}); + + this.root.camera.downPreHandler.add(this.onMouseDown, this); + this.root.camera.movePreHandler.add(this.onMouseMove, this); + this.root.camera.upPostHandler.add(this.abortDragging, this); + + this.currentlyDragging = false; + + /** + * The tile we last dragged onto + * @type {Vector} + * */ + this.lastDragTile = null; + + /** + * The tile we initially dragged from + * @type {Vector} + */ + this.initialDragTile = null; + } + + createElements(parent) { + this.element = makeDiv(parent, "ingame_HUD_building_placer", [], ``); + + this.buildingLabel = makeDiv(this.element, null, ["buildingLabel"], "Extract"); + this.buildingDescription = makeDiv(this.element, null, ["description"], ""); + } + + /** + * mouse down pre handler + * @param {Vector} pos + */ + onMouseDown(pos) { + if (this.root.camera.getIsMapOverlayActive()) { + return; + } + + if (this.currentMetaBuilding.get()) { + this.currentlyDragging = true; + this.lastDragTile = this.root.camera.screenToWorld(pos).toTileSpace(); + + // Place initial building + this.tryPlaceCurrentBuildingAt(this.lastDragTile); + + return STOP_PROPAGATION; + } + } + + /** + * mouse move pre handler + * @param {Vector} pos + */ + onMouseMove(pos) { + if (this.root.camera.getIsMapOverlayActive()) { + return; + } + + if (this.currentMetaBuilding.get() && this.lastDragTile) { + const oldPos = this.lastDragTile; + const newPos = this.root.camera.screenToWorld(pos).toTileSpace(); + + if (!oldPos.equals(newPos)) { + const delta = newPos.sub(oldPos); + // - Using bresenhams algorithmus + + let x0 = oldPos.x; + let y0 = oldPos.y; + let x1 = newPos.x; + let y1 = newPos.y; + + var dx = Math_abs(x1 - x0); + var dy = Math_abs(y1 - y0); + var sx = x0 < x1 ? 1 : -1; + var sy = y0 < y1 ? 1 : -1; + var err = dx - dy; + + while (true) { + this.tryPlaceCurrentBuildingAt(new Vector(x0, y0)); + if (x0 === x1 && y0 === y1) break; + var e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x0 += sx; + } + if (e2 < dx) { + err += dx; + y0 += sy; + } + } + } + + this.lastDragTile = newPos; + + return STOP_PROPAGATION; + } + } + + update() { + // ALways update since the camera might have moved + const mousePos = this.root.app.mousePosition; + if (mousePos) { + this.onMouseMove(mousePos); + } + } + + /** + * aborts any dragging op + */ + abortDragging() { + this.currentlyDragging = true; + this.lastDragTile = null; + } + + /** + * + * @param {MetaBuilding} metaBuilding + */ + startSelection(metaBuilding) { + this.currentMetaBuilding.set(metaBuilding); + } + + /** + * + * @param {MetaBuilding} metaBuilding + */ + onSelectedMetaBuildingChanged(metaBuilding) { + this.root.hud.signals.selectedPlacementBuildingChanged.dispatch(metaBuilding); + if (metaBuilding) { + this.buildingLabel.innerHTML = metaBuilding.getName(); + this.buildingDescription.innerHTML = metaBuilding.getDescription(); + + this.fakeEntity = new Entity(null); + metaBuilding.setupEntityComponents(this.fakeEntity, null); + this.fakeEntity.addComponent( + new StaticMapEntityComponent({ + origin: new Vector(0, 0), + rotationDegrees: 0, + tileSize: metaBuilding.getDimensions().copy(), + }) + ); + } else { + this.currentlyDragging = false; + this.fakeEntity = null; + } + } + + /** + * Tries to rotate + */ + tryRotate() { + const selectedBuilding = this.currentMetaBuilding.get(); + if (selectedBuilding) { + this.currentBaseRotation = (this.currentBaseRotation + 90) % 360; + const staticComp = this.fakeEntity.components.StaticMapEntity; + staticComp.rotationDegrees = this.currentBaseRotation; + } + } + + /** + * Tries to delete the building under the mouse + */ + deleteBelowCursor() { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return; + } + + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace(); + const contents = this.root.map.getTileContent(tile); + if (contents) { + this.root.logic.tryDeleteBuilding(contents); + } + } + + /** + * Canvas click handler + * @param {Vector} mousePos + * @param {boolean} cancelAction + */ + onCanvasClick(mousePos, cancelAction = false) { + if (cancelAction) { + if (this.currentMetaBuilding.get()) { + this.currentMetaBuilding.set(null); + } else { + this.deleteBelowCursor(); + } + return STOP_PROPAGATION; + } + + if (!this.currentMetaBuilding.get()) { + return; + } + + return STOP_PROPAGATION; + } + + /** + * Tries to place the current building at the given tile + * @param {Vector} tile + */ + tryPlaceCurrentBuildingAt(tile) { + if (this.root.camera.zoomLevel < globalConfig.mapChunkOverviewMinZoom) { + // Dont allow placing in overview mode + return; + } + // Transform to world space + + const metaBuilding = this.currentMetaBuilding.get(); + + const { rotation, rotationVariant } = metaBuilding.computeOptimalDirectionAndRotationVariantAtTile( + this.root, + tile, + this.currentBaseRotation + ); + + if ( + this.root.logic.tryPlaceBuilding({ + origin: tile, + rotation, + rotationVariant, + building: this.currentMetaBuilding.get(), + }) + ) { + // Succesfully placed + + if (metaBuilding.getFlipOrientationAfterPlacement()) { + this.currentBaseRotation = (180 + this.currentBaseRotation) % 360; + } + + if (!metaBuilding.getStayInPlacementMode() && !this.root.app.inputMgr.shiftIsDown) { + // Stop placement + this.currentMetaBuilding.set(null); + } + + return true; + } else { + return false; + } + } + + /** + * + * @param {DrawParameters} parameters + */ + draw(parameters) { + if (this.root.camera.zoomLevel < globalConfig.mapChunkOverviewMinZoom) { + // Dont allow placing in overview mode + this.domAttach.update(false); + return; + } + + this.domAttach.update(this.currentMetaBuilding.get()); + const metaBuilding = this.currentMetaBuilding.get(); + + if (!metaBuilding) { + return; + } + + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return; + } + + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace(); + + // Compute best rotation variant + const { + rotation, + rotationVariant, + connectedEntities, + } = metaBuilding.computeOptimalDirectionAndRotationVariantAtTile( + this.root, + tile, + this.currentBaseRotation + ); + + // Check if there are connected entities + if (connectedEntities) { + for (let i = 0; i < connectedEntities.length; ++i) { + const connectedEntity = connectedEntities[i]; + const connectedWsPoint = connectedEntity.components.StaticMapEntity.getTileSpaceBounds() + .getCenter() + .toWorldSpace(); + + const startWsPoint = tile.toWorldSpaceCenterOfTile(); + + const startOffset = connectedWsPoint + .sub(startWsPoint) + .normalize() + .multiplyScalar(globalConfig.tileSize * 0.3); + const effectiveStartPoint = startWsPoint.add(startOffset); + const effectiveEndPoint = connectedWsPoint.sub(startOffset); + + parameters.context.globalAlpha = 0.6; + + // parameters.context.lineCap = "round"; + parameters.context.strokeStyle = "#7f7"; + parameters.context.lineWidth = 10; + parameters.context.beginPath(); + parameters.context.moveTo(effectiveStartPoint.x, effectiveStartPoint.y); + parameters.context.lineTo(effectiveEndPoint.x, effectiveEndPoint.y); + parameters.context.stroke(); + parameters.context.globalAlpha = 1; + // parameters.context.lineCap = "square"; + } + } + + // Synchronize rotation and origin + const staticComp = this.fakeEntity.components.StaticMapEntity; + staticComp.origin = tile; + staticComp.rotationDegrees = rotation; + metaBuilding.updateRotationVariant(this.fakeEntity, rotationVariant); + + // Check if we could place the buildnig + const canBuild = this.root.logic.checkCanPlaceBuilding(tile, rotation, metaBuilding); + + // Determine the bounds and visualize them + const entityBounds = staticComp.getTileSpaceBounds(); + const drawBorder = 2; + parameters.context.globalAlpha = 0.5; + if (canBuild) { + parameters.context.fillStyle = "rgba(0, 255, 0, 0.2)"; + } else { + parameters.context.fillStyle = "rgba(255, 0, 0, 0.2)"; + } + parameters.context.fillRect( + entityBounds.x * globalConfig.tileSize - drawBorder, + entityBounds.y * globalConfig.tileSize - drawBorder, + entityBounds.w * globalConfig.tileSize + 2 * drawBorder, + entityBounds.h * globalConfig.tileSize + 2 * drawBorder + ); + + // Draw ejectors + if (canBuild) { + this.drawMatchingAcceptorsAndEjectors(parameters); + } + + // HACK to draw the entity sprite + const previewSprite = metaBuilding.getPreviewSprite(rotationVariant); + parameters.context.globalAlpha = 0.8 + pulseAnimation(this.root.time.realtimeNow(), 1) * 0.1; + staticComp.origin = worldPos.divideScalar(globalConfig.tileSize).subScalars(0.5, 0.5); + staticComp.drawSpriteOnFullEntityBounds(parameters, previewSprite); + staticComp.origin = tile; + parameters.context.globalAlpha = 1; + } + + /** + * + * @param {DrawParameters} parameters + */ + drawMatchingAcceptorsAndEjectors(parameters) { + const acceptorComp = this.fakeEntity.components.ItemAcceptor; + const ejectorComp = this.fakeEntity.components.ItemEjector; + const staticComp = this.fakeEntity.components.StaticMapEntity; + + const goodArrowSprite = Loader.getSprite("sprites/misc/slot_good_arrow.png"); + const badArrowSprite = Loader.getSprite("sprites/misc/slot_bad_arrow.png"); + + // Just ignore this code ... + + if (acceptorComp) { + const slots = acceptorComp.slots; + for (let acceptorSlotIndex = 0; acceptorSlotIndex < slots.length; ++acceptorSlotIndex) { + const slot = slots[acceptorSlotIndex]; + const acceptorSlotWsTile = staticComp.localTileToWorld(slot.pos); + const acceptorSlotWsPos = acceptorSlotWsTile.toWorldSpaceCenterOfTile(); + + for ( + let acceptorDirectionIndex = 0; + acceptorDirectionIndex < slot.directions.length; + ++acceptorDirectionIndex + ) { + const direction = slot.directions[acceptorDirectionIndex]; + const worldDirection = staticComp.localDirectionToWorld(direction); + + const sourceTile = acceptorSlotWsTile.add(enumDirectionToVector[worldDirection]); + const sourceEntity = this.root.map.getTileContent(sourceTile); + + let sprite = goodArrowSprite; + let alpha = 0.5; + + if (sourceEntity) { + sprite = badArrowSprite; + const sourceEjector = sourceEntity.components.ItemEjector; + const sourceStaticComp = sourceEntity.components.StaticMapEntity; + const ejectorAcceptLocalTile = sourceStaticComp.worldToLocalTile(acceptorSlotWsTile); + if (sourceEjector && sourceEjector.anySlotEjectsToLocalTile(ejectorAcceptLocalTile)) { + sprite = goodArrowSprite; + } + alpha = 1.0; + } + + parameters.context.globalAlpha = alpha; + drawRotatedSprite({ + parameters, + sprite, + x: acceptorSlotWsPos.x, + y: acceptorSlotWsPos.y, + angle: Math_radians(enumDirectionToAngle[enumInvertedDirections[worldDirection]]), + size: 13, + offsetY: 15, + }); + parameters.context.globalAlpha = 1; + } + } + } + + if (ejectorComp) { + const slots = ejectorComp.slots; + for (let ejectorSlotIndex = 0; ejectorSlotIndex < slots.length; ++ejectorSlotIndex) { + const slot = ejectorComp.slots[ejectorSlotIndex]; + + const ejectorSlotWsTile = staticComp.localTileToWorld( + ejectorComp.getSlotTargetLocalTile(ejectorSlotIndex) + ); + const ejectorSLotWsPos = ejectorSlotWsTile.toWorldSpaceCenterOfTile(); + const ejectorSlotWsDirection = staticComp.localDirectionToWorld(slot.direction); + + const destEntity = this.root.map.getTileContent(ejectorSlotWsTile); + + let sprite = goodArrowSprite; + let alpha = 0.5; + if (destEntity) { + alpha = 1; + const destAcceptor = destEntity.components.ItemAcceptor; + const destStaticComp = destEntity.components.StaticMapEntity; + + if (destAcceptor) { + const destLocalTile = destStaticComp.worldToLocalTile(ejectorSlotWsTile); + const destLocalDir = destStaticComp.worldDirectionToLocal(ejectorSlotWsDirection); + if (destAcceptor.findMatchingSlot(destLocalTile, destLocalDir)) { + sprite = goodArrowSprite; + } else { + sprite = badArrowSprite; + } + } + } + + parameters.context.globalAlpha = alpha; + drawRotatedSprite({ + parameters, + sprite, + x: ejectorSLotWsPos.x, + y: ejectorSLotWsPos.y, + angle: Math_radians(enumDirectionToAngle[ejectorSlotWsDirection]), + size: 13, + offsetY: 15, + }); + parameters.context.globalAlpha = 1; + } + } + } +} diff --git a/src/js/game/hud/parts/buildings_toolbar.js b/src/js/game/hud/parts/buildings_toolbar.js new file mode 100644 index 00000000..4d621a2d --- /dev/null +++ b/src/js/game/hud/parts/buildings_toolbar.js @@ -0,0 +1,128 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv } from "../../../core/utils"; +import { gMetaBuildingRegistry } from "../../../core/global_registries"; +import { MetaBuilding } from "../../meta_building"; +import { Signal } from "../../../core/signal"; +import { MetaSplitterBuilding } from "../../buildings/splitter"; +import { MetaMinerBuilding } from "../../buildings/miner"; +import { MetaCutterBuilding } from "../../buildings/cutter"; +import { MetaRotaterBuilding } from "../../buildings/rotater"; +import { MetaStackerBuilding } from "../../buildings/stacker"; +import { MetaMixerBuilding } from "../../buildings/mixer"; +import { MetaPainterBuilding } from "../../buildings/painter"; +import { MetaTrashBuilding } from "../../buildings/trash"; +import { MetaBeltBaseBuilding } from "../../buildings/belt_base"; +import { MetaUndergroundBeltBuilding } from "../../buildings/underground_belt"; +import { globalConfig } from "../../../core/config"; +import { TrackedState } from "../../../core/tracked_state"; + +const toolbarBuildings = [ + MetaBeltBaseBuilding, + MetaMinerBuilding, + MetaUndergroundBeltBuilding, + MetaSplitterBuilding, + MetaCutterBuilding, + MetaRotaterBuilding, + MetaStackerBuilding, + MetaMixerBuilding, + MetaPainterBuilding, + MetaTrashBuilding, +]; + +export class HUDBuildingsToolbar extends BaseHUDPart { + constructor(root) { + super(root); + + /** @type {Object.} */ + this.buildingUnlockStates = {}; + + this.sigBuildingSelected = new Signal(); + + this.trackedIsVisisible = new TrackedState(this.onVisibilityChanged, this); + } + + onVisibilityChanged(visible) { + this.element.classList.toggle("visible", visible); + } + + /** + * Should create all require elements + * @param {HTMLElement} parent + */ + createElements(parent) { + this.element = makeDiv(parent, "ingame_HUD_buildings_toolbar", [], ""); + } + + initialize() { + const actionMapper = this.root.gameState.keyActionMapper; + + const items = makeDiv(this.element, null, ["buildings"]); + const iconSize = 32; + + for (let i = 0; i < toolbarBuildings.length; ++i) { + const metaBuilding = gMetaBuildingRegistry.findByClass(toolbarBuildings[i]); + const binding = actionMapper.getBinding("building_" + metaBuilding.getId()); + + const dimensions = metaBuilding.getDimensions(); + const itemContainer = makeDiv(items, null, ["building"]); + itemContainer.setAttribute("data-tilewidth", dimensions.x); + itemContainer.setAttribute("data-tileheight", dimensions.y); + + const label = makeDiv(itemContainer, null, ["label"]); + label.innerText = metaBuilding.getName(); + + const tooltip = makeDiv( + itemContainer, + null, + ["tooltip"], + ` + ${metaBuilding.getName()} + ${metaBuilding.getDescription()} + + ` + ); + + const sprite = metaBuilding.getPreviewSprite(0); + + const spriteWrapper = makeDiv(itemContainer, null, ["iconWrap"]); + spriteWrapper.innerHTML = sprite.getAsHTML(iconSize * dimensions.x, iconSize * dimensions.y); + + binding.appendLabelToElement(itemContainer); + binding.add(() => this.selectBuildingForPlacement(metaBuilding)); + + this.trackClicks(itemContainer, () => this.selectBuildingForPlacement(metaBuilding), {}); + + this.buildingUnlockStates[metaBuilding.id] = { + metaBuilding, + element: itemContainer, + status: false, + }; + } + } + + update() { + this.trackedIsVisisible.set(!this.root.camera.getIsMapOverlayActive()); + + for (const buildingId in this.buildingUnlockStates) { + const handle = this.buildingUnlockStates[buildingId]; + const newStatus = handle.metaBuilding.getIsUnlocked(this.root); + if (handle.status !== newStatus) { + handle.status = newStatus; + handle.element.classList.toggle("unlocked", newStatus); + } + } + } + + /** + * + * @param {MetaBuilding} metaBuilding + */ + selectBuildingForPlacement(metaBuilding) { + if (!metaBuilding.getIsUnlocked(this.root)) { + this.root.soundProxy.playUiError(); + return; + } + + this.sigBuildingSelected.dispatch(metaBuilding); + } +} diff --git a/src/js/game/hud/parts/game_menu.js b/src/js/game/hud/parts/game_menu.js new file mode 100644 index 00000000..105b0970 --- /dev/null +++ b/src/js/game/hud/parts/game_menu.js @@ -0,0 +1,37 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv } from "../../../core/utils"; + +export class HUDGameMenu extends BaseHUDPart { + initialize() {} + createElements(parent) { + this.element = makeDiv(parent, "ingame_HUD_GameMenu"); + + const buttons = [ + { + id: "shop", + label: "Upgrades", + handler: () => this.root.hud.parts.shop.show(), + keybinding: "menu_open_shop", + }, + { + id: "stats", + label: "Stats", + handler: () => null, + keybinding: "menu_open_stats", + }, + ]; + + buttons.forEach(({ id, label, handler, keybinding }) => { + const button = document.createElement("button"); + button.setAttribute("data-button-id", id); + this.element.appendChild(button); + this.trackClicks(button, handler); + + if (keybinding) { + const binding = this.root.gameState.keyActionMapper.getBinding(keybinding); + binding.add(handler); + binding.appendLabelToElement(button); + } + }); + } +} diff --git a/src/js/game/hud/parts/keybinding_overlay.js b/src/js/game/hud/parts/keybinding_overlay.js new file mode 100644 index 00000000..96be31e3 --- /dev/null +++ b/src/js/game/hud/parts/keybinding_overlay.js @@ -0,0 +1,73 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv } from "../../../core/utils"; +import { getStringForKeyCode } from "../../key_action_mapper"; +import { TrackedState } from "../../../core/tracked_state"; + +export class HUDKeybindingOverlay extends BaseHUDPart { + initialize() { + this.shiftDownTracker = new TrackedState(this.onShiftStateChanged, this); + } + + onShiftStateChanged(shiftDown) { + this.element.classList.toggle("shiftDown", shiftDown); + } + + createElements(parent) { + const mapper = this.root.gameState.keyActionMapper; + + const getKeycode = id => { + return getStringForKeyCode(mapper.getBinding(id).keyCode); + }; + + this.element = makeDiv( + parent, + "ingame_HUD_KeybindingOverlay", + [], + ` +
+ ${getKeycode("center_map")} + +
+ +
+ + ${getKeycode("map_move_up")} + ${getKeycode("map_move_left")} + ${getKeycode("map_move_down")} + ${getKeycode("map_move_right")} + +
+ +
+ + +
+ + +
+ + ${getKeycode("building_abort_placement")} + +
+ +
+ ${getKeycode("rotate_while_placing")} + +
+ +
+ SHIFT + +
+ ` + ); + } + + onSelectedBuildingForPlacementChanged(selectedMetaBuilding) { + this.element.classList.toggle("placementActive", !!selectedMetaBuilding); + } + + update() { + this.shiftDownTracker.set(this.root.app.inputMgr.shiftIsDown); + } +} diff --git a/src/js/game/hud/parts/processing_overlay.js b/src/js/game/hud/parts/processing_overlay.js new file mode 100644 index 00000000..a8debea9 --- /dev/null +++ b/src/js/game/hud/parts/processing_overlay.js @@ -0,0 +1,117 @@ +import { DynamicDomAttach } from "../dynamic_dom_attach"; +import { BaseHUDPart } from "../base_hud_part"; +import { performanceNow } from "../../../core/builtins"; +import { makeDiv } from "../../../core/utils"; +import { Signal } from "../../../core/signal"; +import { InputReceiver } from "../../../core/input_receiver"; +import { createLogger } from "../../../core/logging"; + +const logger = createLogger("hud/processing_overlay"); + +export class HUDProcessingOverlay extends BaseHUDPart { + constructor(root) { + super(root); + this.tasks = []; + this.computeTimeout = null; + + this.root.signals.performAsync.add(this.queueTask, this); + + this.allTasksFinished = new Signal(); + this.inputReceiver = new InputReceiver("processing-overlay"); + + this.root.signals.aboutToDestruct.add(() => + this.root.app.inputMgr.destroyReceiver(this.inputReceiver) + ); + } + + createElements(parent) { + this.element = makeDiv( + parent, + "rg_HUD_ProcessingOverlay", + ["hudElement"], + ` + + Computing + + ` + ); + } + + initialize() { + this.domWatcher = new DynamicDomAttach(this.root, this.element, { + timeToKeepSeconds: 0, + }); + } + + queueTask(task, name) { + if (!this.root.gameInitialized) { + // Tasks before the game started can be done directlry + task(); + return; + } + // if (name) { + // console.warn("QUEUE", name); + // } + + task.__name = name; + this.tasks.push(task); + } + + hasTasks() { + return this.tasks.length > 0; + } + + isRunning() { + return this.computeTimeout !== null; + } + + processSync() { + const now = performanceNow(); + while (this.tasks.length > 0) { + const workload = this.tasks[0]; + workload.call(); + this.tasks.shift(); + } + const duration = performanceNow() - now; + if (duration > 100) { + logger.log("Tasks done slow (SYNC!) within", (performanceNow() - now).toFixed(2), "ms"); + } + } + + process() { + this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReceiver); + + this.domWatcher.update(true); + if (this.tasks.length === 0) { + logger.warn("No tasks but still called process"); + return; + } + + if (this.computeTimeout) { + assert(false, "Double compute queued"); + clearTimeout(this.computeTimeout); + } + + this.computeTimeout = setTimeout(() => { + const now = performanceNow(); + while (this.tasks.length > 0) { + const workload = this.tasks[0]; + workload.call(); + this.tasks.shift(); + } + const duration = performanceNow() - now; + if (duration > 100) { + logger.log("Tasks done slow within", (performanceNow() - now).toFixed(2), "ms"); + } + + this.domWatcher.update(false); + + this.root.app.inputMgr.makeSureDetached(this.inputReceiver); + + clearTimeout(this.computeTimeout); + this.computeTimeout = null; + + this.allTasksFinished.dispatch(); + }); + } +} diff --git a/src/js/game/hud/parts/shop.js b/src/js/game/hud/parts/shop.js new file mode 100644 index 00000000..db92ded3 --- /dev/null +++ b/src/js/game/hud/parts/shop.js @@ -0,0 +1,181 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv, removeAllChildren, formatBigNumber } from "../../../core/utils"; +import { UPGRADES, TIER_LABELS } from "../../upgrades"; +import { ShapeDefinition } from "../../shape_definition"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; +import { InputReceiver } from "../../../core/input_receiver"; +import { KeyActionMapper } from "../../key_action_mapper"; +import { Math_min } from "../../../core/builtins"; + +export class HUDShop extends BaseHUDPart { + createElements(parent) { + this.background = makeDiv(parent, "ingame_HUD_Shop", ["ingameDialog"]); + + // DIALOG Inner / Wrapper + this.dialogInner = makeDiv(this.background, null, ["dialogInner"]); + this.title = makeDiv(this.dialogInner, null, ["title"], `Upgrades`); + this.closeButton = makeDiv(this.title, null, ["closeButton"]); + this.trackClicks(this.closeButton, this.close); + this.contentDiv = makeDiv(this.dialogInner, null, ["content"]); + + this.upgradeToElements = {}; + + // Upgrades + for (const upgradeId in UPGRADES) { + const { label } = UPGRADES[upgradeId]; + const handle = {}; + handle.requireIndexToElement = []; + + // Wrapper + handle.elem = makeDiv(this.contentDiv, null, ["upgrade"]); + handle.elem.setAttribute("data-upgrade-id", upgradeId); + + // Title + const title = makeDiv(handle.elem, null, ["title"], label); + + // Title > Tier + handle.elemTierLabel = makeDiv(title, null, ["tier"], "Tier ?"); + + // Icon + handle.icon = makeDiv(handle.elem, null, ["icon"]); + handle.icon.setAttribute("data-icon", "upgrades/" + upgradeId + ".png"); + + // Description + handle.elemDescription = makeDiv(handle.elem, null, ["description"], "??"); + handle.elemRequirements = makeDiv(handle.elem, null, ["requirements"]); + + // Buy button + handle.buyButton = document.createElement("button"); + handle.buyButton.classList.add("buy", "styledButton"); + handle.buyButton.innerText = "Upgrade"; + handle.elem.appendChild(handle.buyButton); + + this.trackClicks(handle.buyButton, () => this.tryUnlockNextTier(upgradeId)); + + // Assign handle + this.upgradeToElements[upgradeId] = handle; + } + } + + rerenderFull() { + for (const upgradeId in this.upgradeToElements) { + const handle = this.upgradeToElements[upgradeId]; + const { description, tiers } = UPGRADES[upgradeId]; + // removeAllChildren(handle.elem); + + const currentTier = this.root.hubGoals.getUpgradeLevel(upgradeId); + const tierHandle = tiers[currentTier]; + + // Set tier + handle.elemTierLabel.innerText = "Tier " + TIER_LABELS[currentTier]; + handle.elemTierLabel.setAttribute("data-tier", currentTier); + + // Cleanup + handle.requireIndexToElement = []; + removeAllChildren(handle.elemRequirements); + + handle.elem.classList.toggle("maxLevel", !tierHandle); + + if (!tierHandle) { + // Max level + handle.elemDescription.innerText = "Maximum level"; + continue; + } + + // Set description + handle.elemDescription.innerText = description(tierHandle.improvement); + + tierHandle.required.forEach(({ shape, amount }) => { + const requireDiv = makeDiv(handle.elemRequirements, null, ["requirement"]); + + const shapeDef = this.root.shapeDefinitionMgr.registerOrReturnHandle( + ShapeDefinition.fromShortKey(shape) + ); + const shapeCanvas = shapeDef.generateAsCanvas(120); + shapeCanvas.classList.add(); + requireDiv.appendChild(shapeCanvas); + + const progressContainer = makeDiv(requireDiv, null, ["amount"]); + const progressBar = document.createElement("label"); + progressBar.classList.add("progressBar"); + progressContainer.appendChild(progressBar); + + const progressLabel = document.createElement("label"); + progressContainer.appendChild(progressLabel); + + handle.requireIndexToElement.push({ + progressLabel, + progressBar, + definition: shapeDef, + required: amount, + }); + }); + } + } + + renderCountsAndStatus() { + for (const upgradeId in this.upgradeToElements) { + const handle = this.upgradeToElements[upgradeId]; + for (let i = 0; i < handle.requireIndexToElement.length; ++i) { + const { progressLabel, progressBar, definition, required } = handle.requireIndexToElement[i]; + + const haveAmount = this.root.hubGoals.getShapesStored(definition); + const progress = Math_min(haveAmount / required, 1.0); + + progressLabel.innerText = formatBigNumber(haveAmount) + " / " + formatBigNumber(required); + progressBar.style.width = progress * 100.0 + "%"; + progressBar.classList.toggle("complete", progress >= 1.0); + } + + handle.buyButton.classList.toggle("buyable", this.root.hubGoals.canUnlockUpgrade(upgradeId)); + } + } + + initialize() { + this.domAttach = new DynamicDomAttach(this.root, this.background, { + attachClass: "visible", + }); + + this.inputReciever = new InputReceiver("shop"); + this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever); + + this.keyActionMapper.getBinding("back").add(this.close, this); + this.keyActionMapper.getBinding("menu_open_shop").add(this.close, this); + + this.close(); + + this.rerenderFull(); + this.root.signals.upgradePurchased.add(this.rerenderFull, this); + } + + cleanup() { + document.body.classList.remove("ingameDialogOpen"); + } + + show() { + this.visible = true; + document.body.classList.add("ingameDialogOpen"); + // this.background.classList.add("visible"); + this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever); + this.update(); + } + + close() { + this.visible = false; + document.body.classList.remove("ingameDialogOpen"); + this.root.app.inputMgr.makeSureDetached(this.inputReciever); + this.update(); + } + + update() { + this.domAttach.update(this.visible); + if (this.visible) { + this.renderCountsAndStatus(); + } + } + + tryUnlockNextTier(upgradeId) { + // Nothing + this.root.hubGoals.tryUnlockUgprade(upgradeId); + } +} diff --git a/src/js/game/hud/parts/unlock_notification.js b/src/js/game/hud/parts/unlock_notification.js new file mode 100644 index 00000000..62e103b7 --- /dev/null +++ b/src/js/game/hud/parts/unlock_notification.js @@ -0,0 +1,122 @@ +import { BaseHUDPart } from "../base_hud_part"; +import { makeDiv } from "../../../core/utils"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; +import { gMetaBuildingRegistry } from "../../../core/global_registries"; +import { MetaBuilding } from "../../meta_building"; +import { MetaSplitterBuilding } from "../../buildings/splitter"; +import { MetaCutterBuilding } from "../../buildings/cutter"; +import { enumHubGoalRewards } from "../../tutorial_goals"; +import { MetaTrashBuilding } from "../../buildings/trash"; +import { MetaMinerBuilding } from "../../buildings/miner"; +import { MetaPainterBuilding } from "../../buildings/painter"; +import { MetaMixerBuilding } from "../../buildings/mixer"; +import { MetaRotaterBuilding } from "../../buildings/rotater"; +import { MetaStackerBuilding } from "../../buildings/stacker"; +import { MetaUndergroundBeltBuilding } from "../../buildings/underground_belt"; +import { globalConfig } from "../../../core/config"; + +export class HUDUnlockNotification extends BaseHUDPart { + initialize() { + this.visible = false; + + this.domAttach = new DynamicDomAttach(this.root, this.element, { + timeToKeepSeconds: 0, + }); + + if (!(G_IS_DEV && globalConfig.debug.disableUnlockDialog)) { + this.root.signals.storyGoalCompleted.add(this.showForLevel, this); + } + } + + shouldPauseGame() { + return this.visible; + } + + createElements(parent) { + this.element = makeDiv(parent, "ingame_HUD_UnlockNotification", []); + + const dialog = makeDiv(this.element, null, ["dialog"]); + + this.elemTitle = makeDiv(dialog, null, ["title"], ``); + this.elemSubTitle = makeDiv(dialog, null, ["subTitle"], `Completed`); + + this.elemContents = makeDiv( + dialog, + null, + ["contents"], + ` + Ready for the next one? + ` + ); + + this.btnClose = document.createElement("button"); + this.btnClose.classList.add("close", "styledButton"); + this.btnClose.innerText = "Next level"; + dialog.appendChild(this.btnClose); + + this.trackClicks(this.btnClose, this.close); + } + + showForLevel(level, reward) { + this.elemTitle.innerText = "Level " + ("" + level).padStart(2, "0"); + + let html = `Unlocked ${reward}!`; + + const addBuildingExplanation = metaBuildingClass => { + const metaBuilding = gMetaBuildingRegistry.findByClass(metaBuildingClass); + html += `
`; + }; + + switch (reward) { + case enumHubGoalRewards.reward_cutter_and_trash: { + addBuildingExplanation(MetaCutterBuilding); + addBuildingExplanation(MetaTrashBuilding); + break; + } + case enumHubGoalRewards.reward_mixer: { + addBuildingExplanation(MetaMixerBuilding); + break; + } + + case enumHubGoalRewards.reward_painter: { + addBuildingExplanation(MetaPainterBuilding); + break; + } + + case enumHubGoalRewards.reward_rotater: { + addBuildingExplanation(MetaRotaterBuilding); + break; + } + + case enumHubGoalRewards.reward_splitter: { + addBuildingExplanation(MetaSplitterBuilding); + break; + } + + case enumHubGoalRewards.reward_stacker: { + addBuildingExplanation(MetaStackerBuilding); + break; + } + + case enumHubGoalRewards.reward_tunnel: { + addBuildingExplanation(MetaUndergroundBeltBuilding); + break; + } + } + + // addBuildingExplanation(MetaSplitterBuilding); + // addBuildingExplanation(MetaCutterBuilding); + + this.elemContents.innerHTML = html; + + this.visible = true; + } + + close() { + this.visible = false; + } + + update() { + this.domAttach.update(this.visible); + } +} diff --git a/src/js/game/item_registry.js b/src/js/game/item_registry.js new file mode 100644 index 00000000..2ecb89c5 --- /dev/null +++ b/src/js/game/item_registry.js @@ -0,0 +1,6 @@ +import { gItemRegistry } from "../core/global_registries"; +import { ShapeItem } from "./items/shape_item"; + +export function initItemRegistry() { + gItemRegistry.register(ShapeItem); +} diff --git a/src/js/game/items/color_item.js b/src/js/game/items/color_item.js new file mode 100644 index 00000000..cc618228 --- /dev/null +++ b/src/js/game/items/color_item.js @@ -0,0 +1,90 @@ +import { DrawParameters } from "../../core/draw_parameters"; +import { createLogger } from "../../core/logging"; +import { extendSchema } from "../../savegame/serialization"; +import { BaseItem } from "../base_item"; +import { enumColorsToHexCode, enumColors } from "../colors"; +import { makeOffscreenBuffer } from "../../core/buffer_utils"; +import { globalConfig } from "../../core/config"; +import { round1Digit } from "../../core/utils"; +import { Math_max, Math_round } from "../../core/builtins"; +import { smoothenDpi } from "../../core/dpi_manager"; + +/** @enum {string} */ +const enumColorToMapBackground = { + [enumColors.red]: "#ffbfc1", + [enumColors.green]: "#cbffc4", + [enumColors.blue]: "#bfdaff", +}; + +export class ColorItem extends BaseItem { + static getId() { + return "color"; + } + + static getSchema() { + return extendSchema(BaseItem.getCachedSchema(), { + // TODO + }); + } + + /** + * @param {string} color + */ + constructor(color) { + super(); + this.color = color; + + this.bufferGenerator = this.internalGenerateColorBuffer.bind(this); + } + + getBackgroundColorAsResource() { + return enumColorToMapBackground[this.color]; + } + + /** + * @param {number} x + * @param {number} y + * @param {number} size + * @param {DrawParameters} parameters + */ + draw(x, y, parameters, size = 12) { + const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel); + + const key = size + "/" + dpi; + const canvas = parameters.root.buffers.getForKey( + key, + this.color, + size, + size, + dpi, + this.bufferGenerator + ); + parameters.context.drawImage(canvas, x - size / 2, y - size / 2, size, size); + } + /** + * + * @param {HTMLCanvasElement} canvas + * @param {CanvasRenderingContext2D} context + * @param {number} w + * @param {number} h + * @param {number} dpi + */ + internalGenerateColorBuffer(canvas, context, w, h, dpi) { + context.translate((w * dpi) / 2, (h * dpi) / 2); + context.scale((dpi * w) / 12, (dpi * h) / 12); + + context.fillStyle = enumColorsToHexCode[this.color]; + context.strokeStyle = "rgba(100,102, 110, 1)"; + context.lineWidth = 2; + context.beginCircle(2, -1, 3); + context.stroke(); + context.fill(); + context.beginCircle(-2, -1, 3); + context.stroke(); + context.fill(); + context.beginCircle(0, 2, 3); + context.closePath(); + context.stroke(); + context.fill(); + } +} diff --git a/src/js/game/items/shape_item.js b/src/js/game/items/shape_item.js new file mode 100644 index 00000000..9aa1b78d --- /dev/null +++ b/src/js/game/items/shape_item.js @@ -0,0 +1,42 @@ +import { BaseItem } from "../base_item"; +import { DrawParameters } from "../../core/draw_parameters"; +import { extendSchema } from "../../savegame/serialization"; +import { ShapeDefinition } from "../shape_definition"; +import { createLogger } from "../../core/logging"; + +const logger = createLogger("shape_item"); + +export class ShapeItem extends BaseItem { + static getId() { + return "shape"; + } + + static getSchema() { + return extendSchema(BaseItem.getCachedSchema(), { + // TODO + }); + } + + /** + * @param {ShapeDefinition} definition + */ + constructor(definition) { + super(); + // logger.log("New shape item for shape definition", definition.generateId(), "created"); + + /** + * This property must not be modified on runtime, you have to clone the class in order to change the definition + */ + this.definition = definition; + } + + /** + * @param {number} x + * @param {number} y + * @param {DrawParameters} parameters + * @param {number=} size + */ + draw(x, y, parameters, size) { + this.definition.draw(x, y, parameters, size); + } +} diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js new file mode 100644 index 00000000..dae0c57e --- /dev/null +++ b/src/js/game/key_action_mapper.js @@ -0,0 +1,383 @@ +/* typehints:start */ +import { GameRoot } from "./root"; +import { InputReceiver } from "../core/input_receiver"; +import { Application } from "../application"; +/* typehints:end */ + +import { Signal, STOP_PROPAGATION } from "../core/signal"; +import { IS_MOBILE } from "../core/config"; + +function key(str) { + return str.toUpperCase().charCodeAt(0); +} + +// TODO: Configurable +export const defaultKeybindings = { + general: { + confirm: { keyCode: 13 }, // enter + back: { keyCode: 27, builtin: true }, // escape + }, + + ingame: { + map_move_up: { keyCode: key("W") }, + map_move_right: { keyCode: key("D") }, + map_move_down: { keyCode: key("S") }, + map_move_left: { keyCode: key("A") }, + toggle_hud: { keyCode: 113 }, + + center_map: { keyCode: 32 }, + + menu_open_shop: { keyCode: key("F") }, + menu_open_stats: { keyCode: key("G") }, + }, + + toolbar: { + building_belt: { keyCode: key("1") }, + building_miner: { keyCode: key("2") }, + building_underground_belt: { keyCode: key("3") }, + building_splitter: { keyCode: key("4") }, + building_cutter: { keyCode: key("5") }, + building_rotater: { keyCode: key("6") }, + building_stacker: { keyCode: key("7") }, + building_mixer: { keyCode: key("8") }, + building_painter: { keyCode: key("9") }, + building_trash: { keyCode: key("0") }, + + building_abort_placement: { keyCode: key("Q") }, + + rotate_while_placing: { keyCode: key("R") }, + }, +}; + +/** + * Returns a keycode -> string + * @param {number} code + * @returns {string} + */ +export function getStringForKeyCode(code) { + switch (code) { + case 8: + return "⌫"; + case 9: + return "TAB"; + case 13: + return "⏎"; + case 16: + return "⇪"; + case 17: + return "CTRL"; + case 18: + return "ALT"; + case 19: + return "PAUSE"; + case 20: + return "CAPS"; + case 27: + return "ESC"; + case 32: + return "SPACE"; + case 33: + return "PGUP"; + case 34: + return "PGDOWN"; + case 35: + return "END"; + case 36: + return "HOME"; + case 37: + return "⬅"; + case 38: + return "⬆"; + case 39: + return "➡"; + case 40: + return "⬇"; + case 44: + return "PRNT"; + case 45: + return "INS"; + case 46: + return "DEL"; + case 93: + return "SEL"; + case 96: + return "NUM 0"; + case 97: + return "NUM 1"; + case 98: + return "NUM 2"; + case 99: + return "NUM 3"; + case 100: + return "NUM 4"; + case 101: + return "NUM 5"; + case 102: + return "NUM 6"; + case 103: + return "NUM 7"; + case 104: + return "NUM 8"; + case 105: + return "NUM 9"; + case 106: + return "*"; + case 107: + return "+"; + case 109: + return "-"; + case 110: + return "."; + case 111: + return "/"; + case 112: + return "F1"; + case 113: + return "F2"; + case 114: + return "F3"; + case 115: + return "F4"; + case 116: + return "F4"; + case 117: + return "F5"; + case 118: + return "F6"; + case 119: + return "F7"; + case 120: + return "F8"; + case 121: + return "F9"; + case 122: + return "F10"; + case 123: + return "F11"; + case 124: + return "F12"; + + case 144: + return "NUMLOCK"; + case 145: + return "SCRLOCK"; + case 182: + return "COMP"; + case 183: + return "CALC"; + case 186: + return ";"; + case 187: + return "="; + case 188: + return ","; + case 189: + return "-"; + case 189: + return "."; + case 191: + return "/"; + case 219: + return "["; + case 220: + return "\\"; + case 221: + return "]"; + case 222: + return "'"; + } + + // TODO + return String.fromCharCode(code); +} + +export class Keybinding { + /** + * + * @param {Application} app + * @param {object} param0 + * @param {number} param0.keyCode + * @param {boolean=} param0.builtin + */ + constructor(app, { keyCode, builtin = false }) { + assert(keyCode && Number.isInteger(keyCode), "Invalid key code: " + keyCode); + this.app = app; + this.keyCode = keyCode; + this.builtin = builtin; + + this.currentlyDown = false; + + this.signal = new Signal(); + this.toggled = new Signal(); + } + + /** + * Adds an event listener + * @param {function() : void} receiver + * @param {object=} scope + */ + add(receiver, scope = null) { + this.signal.add(receiver, scope); + } + + /** + * @param {Element} elem + * @returns {HTMLElement} the created element, or null if the keybindings are not shown + * */ + appendLabelToElement(elem) { + if (IS_MOBILE) { + return null; + } + const spacer = document.createElement("code"); + spacer.classList.add("keybinding"); + spacer.innerHTML = getStringForKeyCode(this.keyCode); + elem.appendChild(spacer); + return spacer; + } + + /** + * Returns the key code as a nice string + */ + getKeyCodeString() { + return getStringForKeyCode(this.keyCode); + } + + /** + * Remvoes all signal receivers + */ + clearSignalReceivers() { + this.signal.removeAll(); + } +} + +export class KeyActionMapper { + /** + * + * @param {GameRoot} root + * @param {InputReceiver} inputReciever + */ + constructor(root, inputReciever) { + this.root = root; + inputReciever.keydown.add(this.handleKeydown, this); + inputReciever.keyup.add(this.handleKeyup, this); + + /** @type {Object.} */ + this.keybindings = {}; + + // const overrides = root.app.settings.getKeybindingOverrides(); + + for (const category in defaultKeybindings) { + for (const key in defaultKeybindings[category]) { + let payload = Object.assign({}, defaultKeybindings[category][key]); + // if (overrides[key]) { + // payload.keyCode = overrides[key]; + // } + + this.keybindings[key] = new Keybinding(this.root.app, payload); + } + } + + inputReciever.pageBlur.add(this.onPageBlur, this); + inputReciever.destroyed.add(this.cleanup, this); + } + + /** + * Returns all keybindings starting with the given id + * @param {string} pattern + * @returns {Array} + */ + getKeybindingsStartingWith(pattern) { + let result = []; + for (const key in this.keybindings) { + if (key.startsWith(pattern)) { + result.push(this.keybindings[key]); + } + } + return result; + } + + /** + * Forwards the given events to the other mapper (used in tooltips) + * @param {KeyActionMapper} receiver + * @param {Array} bindings + */ + forward(receiver, bindings) { + for (let i = 0; i < bindings.length; ++i) { + const key = bindings[i]; + this.keybindings[key].signal.add((...args) => receiver.keybindings[key].signal.dispatch(...args)); + } + } + + cleanup() { + for (const key in this.keybindings) { + this.keybindings[key].signal.removeAll(); + } + } + + onPageBlur() { + // Reset all down states + // Find mapping + for (const key in this.keybindings) { + /** @type {Keybinding} */ + const binding = this.keybindings[key]; + binding.currentlyDown = false; + } + } + + /** + * Internal keydown handler + * @param {object} param0 + * @param {number} param0.keyCode + * @param {boolean} param0.shift + * @param {boolean} param0.alt + */ + handleKeydown({ keyCode, shift, alt }) { + let stop = false; + + // Find mapping + for (const key in this.keybindings) { + /** @type {Keybinding} */ + const binding = this.keybindings[key]; + if (binding.keyCode === keyCode /* && binding.shift === shift && binding.alt === alt */) { + binding.currentlyDown = true; + + /** @type {Signal} */ + const signal = this.keybindings[key].signal; + if (signal.dispatch() === STOP_PROPAGATION) { + return; + } + } + } + + if (stop) { + return STOP_PROPAGATION; + } + } + + /** + * Internal keyup handler + * @param {object} param0 + * @param {number} param0.keyCode + * @param {boolean} param0.shift + * @param {boolean} param0.alt + */ + handleKeyup({ keyCode, shift, alt }) { + for (const key in this.keybindings) { + /** @type {Keybinding} */ + const binding = this.keybindings[key]; + if (binding.keyCode === keyCode) { + binding.currentlyDown = false; + } + } + } + + /** + * Returns a given keybinding + * @param {string} id + * @returns {Keybinding} + */ + getBinding(id) { + assert(this.keybindings[id], "Keybinding " + id + " not known!"); + return this.keybindings[id]; + } +} diff --git a/src/js/game/logic.js b/src/js/game/logic.js new file mode 100644 index 00000000..fe58ee4e --- /dev/null +++ b/src/js/game/logic.js @@ -0,0 +1,209 @@ +import { GameRoot } from "./root"; +import { Entity } from "./entity"; +import { Vector, enumDirectionToVector, enumDirection } from "../core/vector"; +import { MetaBuilding } from "./meta_building"; +import { StaticMapEntityComponent } from "./components/static_map_entity"; +import { Math_abs } from "../core/builtins"; +import { Rectangle } from "../core/rectangle"; +import { createLogger } from "../core/logging"; + +const logger = createLogger("ingame/logic"); + +/** + * Typing helper + * @typedef {Array<{ + * entity: Entity, + * slot: import("./components/item_ejector").ItemEjectorSlot, + * fromTile: Vector, + * toDirection: enumDirection + * }>} EjectorsAffectingTile + */ + +/** + * Typing helper + * @typedef {Array<{ + * entity: Entity, + * slot: import("./components/item_acceptor").ItemAcceptorSlot, + * toTile: Vector, + * fromDirection: enumDirection + * }>} AcceptorsAffectingTile + */ + +/** + * @typedef {{ + * acceptors: AcceptorsAffectingTile, + * ejectors: EjectorsAffectingTile + * }} AcceptorsAndEjectorsAffectingTile + */ + +export class GameLogic { + /** + * + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + } + + /** + * + * @param {Vector} origin + * @param {number} rotation + * @param {MetaBuilding} building + */ + isAreaFreeToBuild(origin, rotation, building) { + const checker = new StaticMapEntityComponent({ + origin, + tileSize: building.getDimensions(), + rotationDegrees: rotation, + }); + + const rect = checker.getTileSpaceBounds(); + + for (let x = rect.x; x < rect.x + rect.w; ++x) { + for (let y = rect.y; y < rect.y + rect.h; ++y) { + const contents = this.root.map.getTileContentXY(x, y); + if (contents && !contents.components.ReplaceableMapEntity) { + return false; + } + } + } + return true; + } + + /** + * + * @param {Vector} origin + * @param {number} rotation + * @param {MetaBuilding} building + */ + checkCanPlaceBuilding(origin, rotation, building) { + if (!building.getIsUnlocked(this.root)) { + return false; + } + return this.isAreaFreeToBuild(origin, rotation, building); + } + + /** + * + * @param {object} param0 + * @param {Vector} param0.origin + * @param {number} param0.rotation + * @param {number} param0.rotationVariant + * @param {MetaBuilding} param0.building + */ + tryPlaceBuilding({ origin, rotation, rotationVariant, building }) { + if (this.checkCanPlaceBuilding(origin, rotation, building)) { + // Remove any removeable entities below + const checker = new StaticMapEntityComponent({ + origin, + tileSize: building.getDimensions(), + rotationDegrees: rotation, + }); + + const rect = checker.getTileSpaceBounds(); + + for (let x = rect.x; x < rect.x + rect.w; ++x) { + for (let y = rect.y; y < rect.y + rect.h; ++y) { + const contents = this.root.map.getTileContentXY(x, y); + if (contents && contents.components.ReplaceableMapEntity) { + if (!this.tryDeleteBuilding(contents)) { + logger.error("Building has replaceable component but is also unremovable"); + return false; + } + } + } + } + + building.createAndPlaceEntity(this.root, origin, rotation, rotationVariant); + return true; + } + return false; + } + + /** + * Returns whether the given building can get removed + * @param {Entity} building + */ + canDeleteBuilding(building) { + return building.components.StaticMapEntity && !building.components.Unremovable; + } + + /** + * Tries to delete the given building + * @param {Entity} building + */ + tryDeleteBuilding(building) { + if (!this.canDeleteBuilding(building)) { + return false; + } + this.root.map.removeStaticEntity(building); + this.root.entityMgr.destroyEntity(building); + return true; + } + + /** + * Returns the acceptors and ejectors which affect the current tile + * @param {Vector} tile + * @returns {AcceptorsAndEjectorsAffectingTile} + */ + getEjectorsAndAcceptorsAtTile(tile) { + /** @type {EjectorsAffectingTile} */ + let ejectors = []; + /** @type {AcceptorsAffectingTile} */ + let acceptors = []; + + for (let dx = -1; dx <= 1; ++dx) { + for (let dy = -1; dy <= 1; ++dy) { + if (Math_abs(dx) + Math_abs(dy) !== 1) { + continue; + } + + const entity = this.root.map.getTileContentXY(tile.x + dx, tile.y + dy); + if (entity) { + const staticComp = entity.components.StaticMapEntity; + const itemEjector = entity.components.ItemEjector; + if (itemEjector) { + for (let ejectorSlot = 0; ejectorSlot < itemEjector.slots.length; ++ejectorSlot) { + const slot = itemEjector.slots[ejectorSlot]; + const wsTile = staticComp.localTileToWorld(slot.pos); + const wsDirection = staticComp.localDirectionToWorld(slot.direction); + const targetTile = wsTile.add(enumDirectionToVector[wsDirection]); + if (targetTile.equals(tile)) { + ejectors.push({ + entity, + slot, + fromTile: wsTile, + toDirection: wsDirection, + }); + } + } + } + + const itemAcceptor = entity.components.ItemAcceptor; + if (itemAcceptor) { + for (let acceptorSlot = 0; acceptorSlot < itemAcceptor.slots.length; ++acceptorSlot) { + const slot = itemAcceptor.slots[acceptorSlot]; + const wsTile = staticComp.localTileToWorld(slot.pos); + for (let k = 0; k < slot.directions.length; ++k) { + const direction = slot.directions[k]; + const wsDirection = staticComp.localDirectionToWorld(direction); + + const sourceTile = wsTile.add(enumDirectionToVector[wsDirection]); + if (sourceTile.equals(tile)) { + acceptors.push({ + entity, + slot, + toTile: wsTile, + fromDirection: wsDirection, + }); + } + } + } + } + } + } + } + return { ejectors, acceptors }; + } +} diff --git a/src/js/game/map.js b/src/js/game/map.js new file mode 100644 index 00000000..97f6d3e6 --- /dev/null +++ b/src/js/game/map.js @@ -0,0 +1,207 @@ +/* typehints:start */ +import { GameRoot } from "./root"; +/* typehints:end */ + +import { globalConfig } from "../core/config"; +import { Vector } from "../core/vector"; +import { Entity } from "./entity"; +import { Math_floor } from "../core/builtins"; +import { createLogger } from "../core/logging"; +import { BaseItem } from "./base_item"; +import { MapChunkView } from "./map_chunk_view"; + +const logger = createLogger("map"); + +export class BaseMap { + /** + * + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + + /** + * Mapping of 'X|Y' to chunk + * @type {Map} */ + this.chunksById = new Map(); + } + + /** + * Returns the given chunk by index + * @param {number} chunkX + * @param {number} chunkY + */ + getChunk(chunkX, chunkY, createIfNotExistent = false) { + // TODO: Better generation + const chunkIdentifier = chunkX + "|" + chunkY; + let storedChunk; + + if ((storedChunk = this.chunksById.get(chunkIdentifier))) { + return storedChunk; + } + + if (createIfNotExistent) { + const instance = new MapChunkView(this.root, chunkX, chunkY); + this.chunksById.set(chunkIdentifier, instance); + return instance; + } + + return null; + } + + /** + * Gets or creates a new chunk if not existent for the given tile + * @param {number} tileX + * @param {number} tileY + * @returns {MapChunkView} + */ + getOrCreateChunkAtTile(tileX, tileY) { + const chunkX = Math_floor(tileX / globalConfig.mapChunkSize); + const chunkY = Math_floor(tileY / globalConfig.mapChunkSize); + return this.getChunk(chunkX, chunkY, true); + } + + /** + * Gets a chunk if not existent for the given tile + * @param {number} tileX + * @param {number} tileY + * @returns {MapChunkView?} + */ + getChunkAtTileOrNull(tileX, tileY) { + const chunkX = Math_floor(tileX / globalConfig.mapChunkSize); + const chunkY = Math_floor(tileY / globalConfig.mapChunkSize); + return this.getChunk(chunkX, chunkY, false); + } + + /** + * Checks if a given tile is within the map bounds + * @param {Vector} tile + * @returns {boolean} + */ + isValidTile(tile) { + if (G_IS_DEV) { + assert(tile instanceof Vector, "tile is not a vector"); + } + return Number.isInteger(tile.x) && Number.isInteger(tile.y); + } + + /** + * Returns the tile content of a given tile + * @param {Vector} tile + * @returns {Entity} Entity or null + */ + getTileContent(tile) { + if (G_IS_DEV) { + this.internalCheckTile(tile); + } + const chunk = this.getChunkAtTileOrNull(tile.x, tile.y); + return chunk && chunk.getTileContentFromWorldCoords(tile.x, tile.y); + } + + /** + * Returns the lower layers content of the given tile + * @param {number} x + * @param {number} y + * @returns {BaseItem=} + */ + getLowerLayerContentXY(x, y) { + return this.getOrCreateChunkAtTile(x, y).getLowerLayerFromWorldCoords(x, y); + } + + /** + * Returns the tile content of a given tile + * @param {number} x + * @param {number} y + * @returns {Entity} Entity or null + */ + getTileContentXY(x, y) { + const chunk = this.getChunkAtTileOrNull(x, y); + return chunk && chunk.getTileContentFromWorldCoords(x, y); + } + + /** + * Checks if the tile is used + * @param {Vector} tile + * @returns {boolean} + */ + isTileUsed(tile) { + if (G_IS_DEV) { + this.internalCheckTile(tile); + } + const chunk = this.getChunkAtTileOrNull(tile.x, tile.y); + return chunk && chunk.getTileContentFromWorldCoords(tile.x, tile.y) != null; + } + + /** + * Sets the tiles content + * @param {Vector} tile + * @param {Entity} entity + */ + setTileContent(tile, entity) { + if (G_IS_DEV) { + this.internalCheckTile(tile); + } + + this.getOrCreateChunkAtTile(tile.x, tile.y).setTileContentFromWorldCords(tile.x, tile.y, entity); + + const staticComponent = entity.components.StaticMapEntity; + assert(staticComponent, "Can only place static map entities in tiles"); + } + + /** + * Places an entity with the StaticMapEntity component + * @param {Entity} entity + */ + placeStaticEntity(entity) { + assert(entity.components.StaticMapEntity, "Entity is not static"); + const staticComp = entity.components.StaticMapEntity; + const rect = staticComp.getTileSpaceBounds(); + for (let dx = 0; dx < rect.w; ++dx) { + for (let dy = 0; dy < rect.h; ++dy) { + const x = rect.x + dx; + const y = rect.y + dy; + this.getOrCreateChunkAtTile(x, y).setTileContentFromWorldCords(x, y, entity); + } + } + } + + /** + * Removes an entity with the StaticMapEntity component + * @param {Entity} entity + */ + removeStaticEntity(entity) { + assert(entity.components.StaticMapEntity, "Entity is not static"); + const staticComp = entity.components.StaticMapEntity; + const rect = staticComp.getTileSpaceBounds(); + for (let dx = 0; dx < rect.w; ++dx) { + for (let dy = 0; dy < rect.h; ++dy) { + const x = rect.x + dx; + const y = rect.y + dy; + this.getOrCreateChunkAtTile(x, y).setTileContentFromWorldCords(x, y, null); + } + } + } + + /** + * Resets the tiles content + * @param {Vector} tile + */ + clearTile(tile) { + if (G_IS_DEV) { + this.internalCheckTile(tile); + } + this.getOrCreateChunkAtTile(tile.x, tile.y).setTileContentFromWorldCords(tile.x, tile.y, null); + } + + // Internal + + /** + * Checks a given tile for validty + * @param {Vector} tile + */ + internalCheckTile(tile) { + assert(tile instanceof Vector, "tile is not a vector: " + tile); + assert(tile.x % 1 === 0, "Tile X is not a valid integer: " + tile.x); + assert(tile.y % 1 === 0, "Tile Y is not a valid integer: " + tile.y); + } +} diff --git a/src/js/game/map_chunk.js b/src/js/game/map_chunk.js new file mode 100644 index 00000000..8cb6758b --- /dev/null +++ b/src/js/game/map_chunk.js @@ -0,0 +1,359 @@ +/* typehints:start */ +import { GameRoot } from "./root"; +/* typehints:end */ + +import { Math_ceil, Math_max, Math_min, Math_random, Math_round } from "../core/builtins"; +import { globalConfig } from "../core/config"; +import { createLogger } from "../core/logging"; +import { + clamp, + fastArrayDeleteValueIfContained, + make2DUndefinedArray, + randomChoice, + randomInt, +} from "../core/utils"; +import { Vector } from "../core/vector"; +import { BaseItem } from "./base_item"; +import { enumColors } from "./colors"; +import { Entity } from "./entity"; +import { ColorItem } from "./items/color_item"; +import { ShapeItem } from "./items/shape_item"; +import { enumSubShape } from "./shape_definition"; + +const logger = createLogger("map_chunk"); + +export class MapChunk { + /** + * + * @param {GameRoot} root + * @param {number} x + * @param {number} y + */ + constructor(root, x, y) { + this.root = root; + this.x = x; + this.y = y; + this.tileX = x * globalConfig.mapChunkSize; + this.tileY = y * globalConfig.mapChunkSize; + + /** @type {Array>} */ + this.contents = make2DUndefinedArray( + globalConfig.mapChunkSize, + globalConfig.mapChunkSize, + "map-chunk@" + this.x + "|" + this.y + ); + + /** @type {Array>} */ + this.lowerLayer = make2DUndefinedArray( + globalConfig.mapChunkSize, + globalConfig.mapChunkSize, + "map-chunk-lower@" + this.x + "|" + this.y + ); + + /** @type {Array} */ + this.containedEntities = []; + + /** + * Store which patches we have so we can render them in the overview + * @type {Array<{pos: Vector, item: BaseItem, size: number }>} + */ + this.patches = []; + + this.generateLowerLayer(); + } + + /** + * Generates a patch filled with the given item + * @param {number} patchSize + * @param {BaseItem} item + * @param {number=} overrideX Override the X position of the patch + * @param {number=} overrideY Override the Y position of the patch + */ + internalGeneratePatch(patchSize, item, overrideX = null, overrideY = null) { + const border = Math_ceil(patchSize / 2 + 3); + + // Find a position within the chunk which is not blocked + let patchX = randomInt(border, globalConfig.mapChunkSize - border - 1); + let patchY = randomInt(border, globalConfig.mapChunkSize - border - 1); + + if (overrideX !== null) { + patchX = overrideX; + } + + if (overrideY !== null) { + patchY = overrideY; + } + + const avgPos = new Vector(0, 0); + let patchesDrawn = 0; + + // Each patch consists of multiple circles + const numCircles = patchSize; + // const numCircles = 1; + + for (let i = 0; i <= numCircles; ++i) { + // Determine circle parameters + const circleRadius = Math_min(1 + i, patchSize); + const circleRadiusSquare = circleRadius * circleRadius; + const circleOffsetRadius = (numCircles - i) / 2 + 2; + + // We draw an elipsis actually + const circleScaleY = 1 + (Math_random() * 2 - 1) * 0.1; + const circleScaleX = 1 + (Math_random() * 2 - 1) * 0.1; + + const circleX = patchX + randomInt(-circleOffsetRadius, circleOffsetRadius); + const circleY = patchY + randomInt(-circleOffsetRadius, circleOffsetRadius); + + for (let dx = -circleRadius * circleScaleX - 2; dx <= circleRadius * circleScaleX + 2; ++dx) { + for (let dy = -circleRadius * circleScaleY - 2; dy <= circleRadius * circleScaleY + 2; ++dy) { + const x = Math_round(circleX + dx); + const y = Math_round(circleY + dy); + if (x >= 0 && x < globalConfig.mapChunkSize && y >= 0 && y <= globalConfig.mapChunkSize) { + const originalDx = dx / circleScaleX; + const originalDy = dy / circleScaleY; + if (originalDx * originalDx + originalDy * originalDy <= circleRadiusSquare) { + if (!this.lowerLayer[x][y]) { + this.lowerLayer[x][y] = item; + ++patchesDrawn; + avgPos.x += x; + avgPos.y += y; + } + } + } else { + // logger.warn("Tried to spawn resource out of chunk"); + } + } + } + } + + this.patches.push({ + pos: avgPos.divideScalar(patchesDrawn), + item, + size: patchSize, + }); + } + + /** + * Generates a color patch + * @param {number} colorPatchSize + * @param {number} distanceToOriginInChunks + */ + internalGenerateColorPatch(colorPatchSize, distanceToOriginInChunks) { + // First, determine available colors + let availableColors = [enumColors.red, enumColors.green]; + if (distanceToOriginInChunks > 2) { + availableColors.push(enumColors.blue); + } + this.internalGeneratePatch(colorPatchSize, new ColorItem(randomChoice(availableColors))); + } + + /** + * Generates a shape patch + * @param {number} shapePatchSize + * @param {number} distanceToOriginInChunks + */ + internalGenerateShapePatch(shapePatchSize, distanceToOriginInChunks) { + /** @type {[enumSubShape, enumSubShape, enumSubShape, enumSubShape]} */ + let subShapes = null; + + let weights = {}; + + if (distanceToOriginInChunks < 3) { + // In the beginning, there are just circles + weights = { + [enumSubShape.circle]: 100, + }; + } else if (distanceToOriginInChunks < 6) { + // Later there come rectangles + if (Math_random() > 0.4) { + weights = { + [enumSubShape.circle]: 100, + }; + } else { + weights = { + [enumSubShape.rect]: 100, + }; + } + } else { + // Finally there is a mix of everything + weights = { + [enumSubShape.rect]: 100, + [enumSubShape.circle]: Math_round(50 + clamp(distanceToOriginInChunks * 2, 0, 50)), + [enumSubShape.star]: Math_round(20 + clamp(distanceToOriginInChunks * 2, 0, 30)), + [enumSubShape.windmill]: Math_round(5 + clamp(distanceToOriginInChunks * 2, 0, 20)), + }; + } + subShapes = [ + this.internalGenerateRandomSubShape(weights), + this.internalGenerateRandomSubShape(weights), + this.internalGenerateRandomSubShape(weights), + this.internalGenerateRandomSubShape(weights), + ]; + + const definition = this.root.shapeDefinitionMgr.getDefinitionFromSimpleShapes(subShapes); + this.internalGeneratePatch(shapePatchSize, new ShapeItem(definition)); + } + + /** + * Chooses a random shape with the given weights + * @param {Object.} weights + * @returns {enumSubShape} + */ + internalGenerateRandomSubShape(weights) { + // @ts-ignore + const sum = Object.values(weights).reduce((a, b) => a + b, 0); + + const chosenNumber = randomInt(0, sum - 1); + let accumulated = 0; + for (const key in weights) { + const weight = weights[key]; + if (accumulated + weight > chosenNumber) { + return key; + } + accumulated += weight; + } + + logger.error("Failed to find matching shape in chunk generation"); + return enumSubShape.circle; + } + + /** + * Generates the lower layer "terrain" + */ + generateLowerLayer() { + if (this.generatePredefined()) { + return; + } + + const chunkCenter = new Vector(this.x, this.y).addScalar(0.5); + const distanceToOriginInChunks = Math_round(chunkCenter.length()); + + // Determine how likely it is that there is a color patch + const colorPatchChance = 0.9 - clamp(distanceToOriginInChunks / 25, 0, 1) * 0.5; + if (Math_random() < colorPatchChance) { + const colorPatchSize = Math_max(2, Math_round(1 + clamp(distanceToOriginInChunks / 8, 0, 4))); + this.internalGenerateColorPatch(colorPatchSize, distanceToOriginInChunks); + } + + // Determine how likely it is that there is a shape patch + const shapePatchChance = 0.9 - clamp(distanceToOriginInChunks / 25, 0, 1) * 0.5; + if (Math_random() < shapePatchChance) { + const shapePatchSize = Math_max(2, Math_round(1 + clamp(distanceToOriginInChunks / 8, 0, 4))); + this.internalGenerateShapePatch(shapePatchSize, distanceToOriginInChunks); + } + } + + /** + * Checks if this chunk has predefined contents, and if so returns true and generates the + * predefined contents + * @returns {boolean} + */ + generatePredefined() { + if (this.x === 0 && this.y === 0) { + this.internalGeneratePatch(2, new ColorItem(enumColors.red), 7, 7); + return true; + } + if (this.x === -1 && this.y === 0) { + const definition = this.root.shapeDefinitionMgr.getDefinitionFromSimpleShapes([ + enumSubShape.circle, + enumSubShape.circle, + enumSubShape.circle, + enumSubShape.circle, + ]); + this.internalGeneratePatch(2, new ShapeItem(definition), globalConfig.mapChunkSize - 9, 7); + return true; + } + if (this.x === 0 && this.y === -1) { + const definition = this.root.shapeDefinitionMgr.getDefinitionFromSimpleShapes([ + enumSubShape.rect, + enumSubShape.rect, + enumSubShape.rect, + enumSubShape.rect, + ]); + this.internalGeneratePatch(2, new ShapeItem(definition), 5, globalConfig.mapChunkSize - 7); + return true; + } + + if (this.x === -1 && this.y === -1) { + this.internalGeneratePatch(2, new ColorItem(enumColors.green)); + return true; + } + + return false; + } + + /** + * + * @param {number} worldX + * @param {number} worldY + * @returns {BaseItem=} + */ + getLowerLayerFromWorldCoords(worldX, worldY) { + const localX = worldX - this.tileX; + const localY = worldY - this.tileY; + assert(localX >= 0, "Local X is < 0"); + assert(localY >= 0, "Local Y is < 0"); + assert(localX < globalConfig.mapChunkSize, "Local X is >= chunk size"); + assert(localY < globalConfig.mapChunkSize, "Local Y is >= chunk size"); + return this.lowerLayer[localX][localY] || null; + } + + /** + * Returns the contents of this chunk from the given world space coordinates + * @param {number} worldX + * @param {number} worldY + * @returns {Entity=} + */ + getTileContentFromWorldCoords(worldX, worldY) { + const localX = worldX - this.tileX; + const localY = worldY - this.tileY; + assert(localX >= 0, "Local X is < 0"); + assert(localY >= 0, "Local Y is < 0"); + assert(localX < globalConfig.mapChunkSize, "Local X is >= chunk size"); + assert(localY < globalConfig.mapChunkSize, "Local Y is >= chunk size"); + return this.contents[localX][localY] || null; + } + + /** + * Returns the chunks contents from the given local coordinates + * @param {number} localX + * @param {number} localY + * @returns {Entity=} + */ + getTileContentFromLocalCoords(localX, localY) { + assert(localX >= 0, "Local X is < 0"); + assert(localY >= 0, "Local Y is < 0"); + assert(localX < globalConfig.mapChunkSize, "Local X is >= chunk size"); + assert(localY < globalConfig.mapChunkSize, "Local Y is >= chunk size"); + + return this.contents[localX][localY] || null; + } + + /** + * Sets the chunks contents + * @param {number} tileX + * @param {number} tileY + * @param {Entity=} contents + */ + setTileContentFromWorldCords(tileX, tileY, contents) { + const localX = tileX - this.tileX; + const localY = tileY - this.tileY; + assert(localX >= 0, "Local X is < 0"); + assert(localY >= 0, "Local Y is < 0"); + assert(localX < globalConfig.mapChunkSize, "Local X is >= chunk size"); + assert(localY < globalConfig.mapChunkSize, "Local Y is >= chunk size"); + const oldContents = this.contents[localX][localY]; + assert(contents === null || !oldContents, "Tile already used: " + tileX + " / " + tileY); + + if (oldContents) { + // Remove from list + fastArrayDeleteValueIfContained(this.containedEntities, oldContents); + } + this.contents[localX][localY] = contents; + if (contents) { + if (this.containedEntities.indexOf(contents) < 0) { + this.containedEntities.push(contents); + } + } + } +} diff --git a/src/js/game/map_chunk_view.js b/src/js/game/map_chunk_view.js new file mode 100644 index 00000000..7634db64 --- /dev/null +++ b/src/js/game/map_chunk_view.js @@ -0,0 +1,226 @@ +import { MapChunk } from "./map_chunk"; +import { GameRoot } from "./root"; +import { globalConfig } from "../core/config"; +import { DrawParameters } from "../core/draw_parameters"; +import { round1Digit } from "../core/utils"; +import { Math_max, Math_round } from "../core/builtins"; +import { Rectangle } from "../core/rectangle"; +import { createLogger } from "../core/logging"; +import { smoothenDpi } from "../core/dpi_manager"; + +const logger = createLogger("chunk"); +const chunkSizePixels = globalConfig.mapChunkSize * globalConfig.tileSize; + +export class MapChunkView extends MapChunk { + /** + * + * @param {GameRoot} root + * @param {number} x + * @param {number} y + */ + constructor(root, x, y) { + super(root, x, y); + + this.boundInternalDrawBackgroundToContext = this.internalDrawBackgroundToContext.bind(this); + this.boundInternalDrawForegroundToContext = this.internalDrawForegroundToContext.bind(this); + + /** + * Whenever something changes, we increase this number - so we know we need to redraw + */ + this.renderIteration = 0; + + this.markDirty(); + } + + /** + * Marks this chunk as dirty, rerendering all caches + */ + markDirty() { + ++this.renderIteration; + this.renderKey = this.x + "/" + this.y + "@" + this.renderIteration; + } + + /** + * Draws the background layer + * @param {DrawParameters} parameters + */ + drawBackgroundLayer(parameters) { + if (parameters.zoomLevel > globalConfig.mapChunkPrerenderMinZoom) { + this.internalDrawBackgroundSystems(parameters); + return; + } + + const dpi = smoothenDpi(parameters.zoomLevel); + const buffer = this.root.buffers.getForKey( + "" + dpi, + this.renderKey + "@bg", + chunkSizePixels, + chunkSizePixels, + dpi, + this.boundInternalDrawBackgroundToContext, + { zoomLevel: parameters.zoomLevel } + ); + + parameters.context.drawImage( + buffer, + this.tileX * globalConfig.tileSize, + this.tileY * globalConfig.tileSize, + chunkSizePixels, + chunkSizePixels + ); + } + + /** + * Draws the foreground layer + * @param {DrawParameters} parameters + */ + drawForegroundLayer(parameters) { + if (parameters.zoomLevel > globalConfig.mapChunkPrerenderMinZoom) { + this.internalDrawForegroundSystems(parameters); + return; + } + + const dpi = smoothenDpi(parameters.zoomLevel); + const buffer = this.root.buffers.getForKey( + "" + dpi, + this.renderKey + "@fg", + chunkSizePixels, + chunkSizePixels, + dpi, + this.boundInternalDrawForegroundToContext, + { zoomLevel: parameters.zoomLevel } + ); + parameters.context.drawImage( + buffer, + this.tileX * globalConfig.tileSize, + this.tileY * globalConfig.tileSize, + chunkSizePixels, + chunkSizePixels + ); + } + + /** + * + * @param {HTMLCanvasElement} canvas + * @param {CanvasRenderingContext2D} context + * @param {number} w + * @param {number} h + * @param {number} dpi + */ + internalDrawBackgroundToContext(canvas, context, w, h, dpi, { zoomLevel }) { + const pattern = context.createPattern(this.root.map.cachedBackgroundCanvas, "repeat"); + context.scale(dpi, dpi); + + if (zoomLevel >= globalConfig.mapChunkOverviewMinZoom) { + const bgDpi = this.root.map.backgroundCacheDPI; + context.scale(1 / bgDpi, 1 / bgDpi); + context.fillStyle = pattern; + context.fillRect(0, 0, chunkSizePixels * bgDpi, chunkSizePixels * bgDpi); + context.scale(bgDpi, bgDpi); + } else { + if (this.containedEntities.length > 0) { + context.fillStyle = "#c5ccd6"; + } else { + context.fillStyle = "#a6afbb"; + } + context.fillRect(0, 0, 10000, 10000); + } + + if (G_IS_DEV && globalConfig.debug.showChunkBorders) { + context.fillStyle = "rgba(0, 0, 255, 0.1)"; + context.fillRect(0, 0, 10000, 10000); + } + + const parameters = new DrawParameters({ + context, + visibleRect: new Rectangle( + this.tileX * globalConfig.tileSize, + this.tileY * globalConfig.tileSize, + chunkSizePixels, + chunkSizePixels + ), + desiredAtlasScale: "1", + zoomLevel, + root: this.root, + }); + + parameters.context.translate( + -this.tileX * globalConfig.tileSize, + -this.tileY * globalConfig.tileSize + ); + // parameters.context.save(); + // parameters.context.transform( + // 1, + // 0, + // 0, + // zoomLevel, + // this.tileX * globalConfig.tileSize, + // this.tileY * globalConfig.tileSize + // ); + + this.internalDrawBackgroundSystems(parameters); + + // parameters.context.restore(); + } + + /** + * + * @param {HTMLCanvasElement} canvas + * @param {CanvasRenderingContext2D} context + * @param {number} w + * @param {number} h + * @param {number} dpi + */ + internalDrawForegroundToContext(canvas, context, w, h, dpi, { zoomLevel }) { + context.scale(dpi, dpi); + + const parameters = new DrawParameters({ + context, + visibleRect: new Rectangle( + this.tileX * globalConfig.tileSize, + this.tileY * globalConfig.tileSize, + chunkSizePixels, + chunkSizePixels + ), + desiredAtlasScale: "1", + zoomLevel, + root: this.root, + }); + // parameters.context.save(); + // parameters.context.save(); + // parameters.context.transform( + // zoomLevel, + // 0, + // 0, + // zoomLevel, + // this.tileX * globalConfig.tileSize, + // this.tileY * globalConfig.tileSize + // ); + + parameters.context.translate( + -this.tileX * globalConfig.tileSize, + -this.tileY * globalConfig.tileSize + ); + this.internalDrawForegroundSystems(parameters); + + // parameters.context.restore(); + } + + /** + * @param {DrawParameters} parameters + */ + internalDrawBackgroundSystems(parameters) { + const systems = this.root.systemMgr.systems; + systems.mapResources.drawChunk(parameters, this); + systems.belt.drawChunk(parameters, this); + } + + /** + * @param {DrawParameters} parameters + */ + internalDrawForegroundSystems(parameters) { + const systems = this.root.systemMgr.systems; + systems.miner.drawChunk(parameters, this); + systems.staticMapEntities.drawChunk(parameters, this); + } +} diff --git a/src/js/game/map_view.js b/src/js/game/map_view.js new file mode 100644 index 00000000..6c42b266 --- /dev/null +++ b/src/js/game/map_view.js @@ -0,0 +1,249 @@ +import { Math_max, Math_min, Math_floor, Math_ceil } from "../core/builtins"; +import { globalConfig } from "../core/config"; +import { DrawParameters } from "../core/draw_parameters"; +import { BaseMap } from "./map"; +import { freeCanvas, makeOffscreenBuffer } from "../core/buffer_utils"; +import { Entity } from "./entity"; + +/** + * This is the view of the map, it extends the map which is the raw model and allows + * to draw it + */ +export class MapView extends BaseMap { + constructor(root) { + super(root); + + /** + * DPI of the background cache images, required in some places + */ + this.backgroundCacheDPI = 4; + + /** + * The cached background sprite, containing the flat background + * @type {HTMLCanvasElement} */ + this.cachedBackgroundCanvas = null; + + /** @type {CanvasRenderingContext2D} */ + this.cachedBackgroundContext = null; + /** + * Cached pattern of the stripes background + * @type {CanvasPattern} */ + this.cachedBackgroundPattern = null; + + this.internalInitializeCachedBackgroundCanvases(); + this.root.signals.aboutToDestruct.add(this.cleanup, this); + + this.root.signals.entityAdded.add(this.onEntityChanged, this); + this.root.signals.entityDestroyed.add(this.onEntityChanged, this); + } + + cleanup() { + freeCanvas(this.cachedBackgroundCanvas); + this.cachedBackgroundCanvas = null; + this.cachedBackgroundPattern = null; + } + + /** + * Called when an entity was added or removed + * @param {Entity} entity + */ + onEntityChanged(entity) { + const staticComp = entity.components.StaticMapEntity; + if (staticComp) { + const rect = staticComp.getTileSpaceBounds(); + for (let x = rect.x; x <= rect.right(); ++x) { + for (let y = rect.y; y <= rect.bottom(); ++y) { + this.root.map.getOrCreateChunkAtTile(x, y).markDirty(); + } + } + } + } + + /** + * Draws all static entities like buildings etc. + * @param {DrawParameters} drawParameters + */ + drawStaticEntities(drawParameters) { + const cullRange = drawParameters.visibleRect.toTileCullRectangle(); + const top = cullRange.top(); + const right = cullRange.right(); + const bottom = cullRange.bottom(); + const left = cullRange.left(); + + const border = 1; + + const minY = top - border; + const maxY = bottom + border; + const minX = left - border; + const maxX = right + border - 1; + + // Render y from top down for proper blending + for (let y = minY; y <= maxY; ++y) { + for (let x = minX; x <= maxX; ++x) { + // const content = this.tiles[x][y]; + const chunk = this.getChunkAtTileOrNull(x, y); + if (!chunk) { + continue; + } + const content = chunk.getTileContentFromWorldCoords(x, y); + if (content) { + let isBorder = x <= left - 1 || x >= right + 1 || y <= top - 1 || y >= bottom + 1; + if (!isBorder) { + content.draw(drawParameters); + } + } + } + } + } + + /** + * Initializes all canvases used for background rendering + */ + internalInitializeCachedBackgroundCanvases() { + // Background canvas + const dims = globalConfig.tileSize; + const dpi = this.backgroundCacheDPI; + const [canvas, context] = makeOffscreenBuffer(dims * dpi, dims * dpi, { + smooth: false, + label: "map-cached-bg", + }); + context.scale(dpi, dpi); + + context.fillStyle = "#fff"; + context.fillRect(0, 0, dims, dims); + + context.fillStyle = "#fafafa"; + context.fillRect(0, 0, dims, 1); + context.fillRect(0, 0, 1, dims); + context.fillRect(dims - 1, 0, 1, dims); + context.fillRect(0, dims - 1, dims, 1); + + this.cachedBackgroundCanvas = canvas; + this.cachedBackgroundContext = context; + } + + /** + * Draws the maps foreground + * @param {DrawParameters} parameters + */ + drawForeground(parameters) { + const cullRange = parameters.visibleRect.toTileCullRectangle(); + const top = cullRange.top(); + const right = cullRange.right(); + const bottom = cullRange.bottom(); + const left = cullRange.left(); + + const border = 1; + const minY = top - border; + const maxY = bottom + border; + const minX = left - border; + const maxX = right + border - 1; + + const chunkStartX = Math_floor(minX / globalConfig.mapChunkSize); + const chunkStartY = Math_floor(minY / globalConfig.mapChunkSize); + + const chunkEndX = Math_ceil(maxX / globalConfig.mapChunkSize); + const chunkEndY = Math_ceil(maxY / globalConfig.mapChunkSize); + + // Render y from top down for proper blending + for (let chunkX = chunkStartX; chunkX <= chunkEndX; ++chunkX) { + for (let chunkY = chunkStartY; chunkY <= chunkEndY; ++chunkY) { + const chunk = this.root.map.getChunk(chunkX, chunkY, true); + chunk.drawForegroundLayer(parameters); + } + } + } + + /** + * Draws the map background + * @param {DrawParameters} parameters + */ + drawBackground(parameters) { + // If not using prerendered, draw background + if (parameters.zoomLevel > globalConfig.mapChunkPrerenderMinZoom) { + if (!this.cachedBackgroundPattern) { + this.cachedBackgroundPattern = parameters.context.createPattern( + this.cachedBackgroundCanvas, + "repeat" + ); + } + + const dpi = this.backgroundCacheDPI; + parameters.context.scale(1 / dpi, 1 / dpi); + + parameters.context.fillStyle = this.cachedBackgroundPattern; + parameters.context.fillRect( + parameters.visibleRect.x * dpi, + parameters.visibleRect.y * dpi, + parameters.visibleRect.w * dpi, + parameters.visibleRect.h * dpi + ); + parameters.context.scale(dpi, dpi); + } + + const cullRange = parameters.visibleRect.toTileCullRectangle(); + const top = cullRange.top(); + const right = cullRange.right(); + const bottom = cullRange.bottom(); + const left = cullRange.left(); + + const border = 1; + const minY = top - border; + const maxY = bottom + border; + const minX = left - border; + const maxX = right + border - 1; + + const chunkStartX = Math_floor(minX / globalConfig.mapChunkSize); + const chunkStartY = Math_floor(minY / globalConfig.mapChunkSize); + + const chunkEndX = Math_ceil(maxX / globalConfig.mapChunkSize); + const chunkEndY = Math_ceil(maxY / globalConfig.mapChunkSize); + + // Render y from top down for proper blending + for (let chunkX = chunkStartX; chunkX <= chunkEndX; ++chunkX) { + for (let chunkY = chunkStartY; chunkY <= chunkEndY; ++chunkY) { + const chunk = this.root.map.getChunk(chunkX, chunkY, true); + chunk.drawBackgroundLayer(parameters); + } + } + + if (G_IS_DEV && globalConfig.debug.showChunkBorders) { + const cullRange = parameters.visibleRect.toTileCullRectangle(); + const top = cullRange.top(); + const right = cullRange.right(); + const bottom = cullRange.bottom(); + const left = cullRange.left(); + + const border = 1; + const minY = top - border; + const maxY = bottom + border; + const minX = left - border; + const maxX = right + border - 1; + + const chunkStartX = Math_floor(minX / globalConfig.mapChunkSize); + const chunkStartY = Math_floor(minY / globalConfig.mapChunkSize); + + const chunkEndX = Math_ceil(maxX / globalConfig.mapChunkSize); + const chunkEndY = Math_ceil(maxY / globalConfig.mapChunkSize); + + // Render y from top down for proper blending + for (let chunkX = chunkStartX; chunkX <= chunkEndX; ++chunkX) { + for (let chunkY = chunkStartY; chunkY <= chunkEndY; ++chunkY) { + parameters.context.fillStyle = "#ffaaaa"; + parameters.context.fillRect( + chunkX * globalConfig.mapChunkSize * globalConfig.tileSize, + chunkY * globalConfig.mapChunkSize * globalConfig.tileSize, + globalConfig.mapChunkSize * globalConfig.tileSize, + 3 + ); + parameters.context.fillRect( + chunkX * globalConfig.mapChunkSize * globalConfig.tileSize, + chunkY * globalConfig.mapChunkSize * globalConfig.tileSize, + 3, + globalConfig.mapChunkSize * globalConfig.tileSize + ); + } + } + } + } +} diff --git a/src/js/game/meta_building.js b/src/js/game/meta_building.js new file mode 100644 index 00000000..a5fc8c25 --- /dev/null +++ b/src/js/game/meta_building.js @@ -0,0 +1,155 @@ +import { Vector, enumDirection, enumAngleToDirection } from "../core/vector"; +import { Loader } from "../core/loader"; +import { GameRoot } from "./root"; +import { AtlasSprite } from "../core/sprites"; +import { Entity } from "./entity"; +import { StaticMapEntityComponent } from "./components/static_map_entity"; + +export class MetaBuilding { + /** + * + * @param {string} id Building id + */ + constructor(id) { + this.id = id; + } + + /** + * Returns the id of this building + */ + getId() { + return this.id; + } + + /** + * Should return the dimensions of the building + */ + getDimensions() { + return new Vector(1, 1); + } + + /** + * Should return the name of this building + */ + getName() { + return this.id; + } + + /** + * Should return the description of this building + */ + getDescription() { + return "No Description"; + } + + /** + * Whether to stay in placement mode after having placed a building + */ + getStayInPlacementMode() { + return false; + } + + /** + * Whether to flip the orientation after a building has been placed - useful + * for tunnels. + */ + getFlipOrientationAfterPlacement() { + return false; + } + + /** + * Returns a preview sprite + * @returns {AtlasSprite} + */ + getPreviewSprite(rotationVariant = 0) { + return Loader.getSprite("sprites/buildings/" + this.id + ".png"); + } + + /** + * Returns whether this building is rotateable + * @returns {boolean} + */ + isRotateable() { + return true; + } + + /** + * Returns whether this building is unlocked for the given game + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return true; + } + + /** + * Should return a silhouette color for the map overview or null if not set + */ + getSilhouetteColor() { + return null; + } + + /** + * Creates the entity at the given location + * @param {GameRoot} root + * @param {Vector} origin Origin tile + * @param {number=} rotation Rotation + * @param {number=} rotationVariant Rotation variant + */ + createAndPlaceEntity(root, origin, rotation = 0, rotationVariant = 0) { + const entity = new Entity(root); + entity.addComponent( + new StaticMapEntityComponent({ + spriteKey: "sprites/buildings/" + this.id + ".png", + origin: new Vector(origin.x, origin.y), + rotationDegrees: rotation, + tileSize: this.getDimensions().copy(), + silhouetteColor: this.getSilhouetteColor(), + }) + ); + + this.setupEntityComponents(entity, root); + this.updateRotationVariant(entity, rotationVariant); + + root.entityMgr.registerEntity(entity); + root.map.placeStaticEntity(entity); + return entity; + } + + /** + * Should compute the optimal rotation variant on the given tile + * @param {GameRoot} root + * @param {Vector} tile + * @param {number} rotation + * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }} + */ + computeOptimalDirectionAndRotationVariantAtTile(root, tile, rotation) { + if (!this.isRotateable()) { + return { + rotation: 0, + rotationVariant: 0, + }; + } + return { + rotation, + rotationVariant: 0, + }; + } + + /** + * Should update the entity to match the given rotation variant + * @param {Entity} entity + * @param {number} rotationVariant + */ + updateRotationVariant(entity, rotationVariant) {} + + // PRIVATE INTERFACE + + /** + * Should setup the entity components + * @param {Entity} entity + * @param {GameRoot} root + */ + setupEntityComponents(entity, root) { + abstract; + } +} diff --git a/src/js/game/meta_building_registry.js b/src/js/game/meta_building_registry.js new file mode 100644 index 00000000..450a9743 --- /dev/null +++ b/src/js/game/meta_building_registry.js @@ -0,0 +1,26 @@ +import { gMetaBuildingRegistry } from "../core/global_registries"; +import { MetaBeltBaseBuilding } from "./buildings/belt_base"; +import { MetaCutterBuilding } from "./buildings/cutter"; +import { MetaMinerBuilding } from "./buildings/miner"; +import { MetaMixerBuilding } from "./buildings/mixer"; +import { MetaPainterBuilding } from "./buildings/painter"; +import { MetaRotaterBuilding } from "./buildings/rotater"; +import { MetaSplitterBuilding } from "./buildings/splitter"; +import { MetaStackerBuilding } from "./buildings/stacker"; +import { MetaTrashBuilding } from "./buildings/trash"; +import { MetaUndergroundBeltBuilding } from "./buildings/underground_belt"; +import { MetaHubBuilding } from "./buildings/hub"; + +export function initMetaBuildingRegistry() { + gMetaBuildingRegistry.register(MetaSplitterBuilding); + gMetaBuildingRegistry.register(MetaMinerBuilding); + gMetaBuildingRegistry.register(MetaCutterBuilding); + gMetaBuildingRegistry.register(MetaRotaterBuilding); + gMetaBuildingRegistry.register(MetaStackerBuilding); + gMetaBuildingRegistry.register(MetaMixerBuilding); + gMetaBuildingRegistry.register(MetaPainterBuilding); + gMetaBuildingRegistry.register(MetaTrashBuilding); + gMetaBuildingRegistry.register(MetaBeltBaseBuilding); + gMetaBuildingRegistry.register(MetaUndergroundBeltBuilding); + gMetaBuildingRegistry.register(MetaHubBuilding); +} diff --git a/src/js/game/root.js b/src/js/game/root.js new file mode 100644 index 00000000..7a6910f3 --- /dev/null +++ b/src/js/game/root.js @@ -0,0 +1,214 @@ +/* eslint-disable no-unused-vars */ + +import { Signal } from "../core/signal"; +import { RandomNumberGenerator } from "../core/rng"; +// import { gFactionRegistry } from "./global_registries"; +import { createLogger } from "../core/logging"; + +// Type hints +/* typehints:start */ +import { GameTime } from "./time/game_time"; +import { EntityManager } from "./entity_manager"; +import { GameSystemManager } from "./game_system_manager"; +import { GameHUD } from "./hud/hud"; +// import { GameLogic } from "./game_logic"; +import { MapView } from "./map_view"; +import { Camera } from "./camera"; +// import { ParticleManager } from "../particles/particle_manager"; +import { InGameState } from "../states/ingame"; +// import { CanvasClickInterceptor } from "/canvas_click_interceptor"; +import { AutomaticSave } from "./automatic_save"; +import { Application } from "../application"; +import { SoundProxy } from "./sound_proxy"; +import { Savegame } from "../savegame/savegame"; +import { GameLogic } from "./logic"; +import { ShapeDefinitionManager } from "./shape_definition_manager"; +import { CanvasClickInterceptor } from "./canvas_click_interceptor"; +import { PerlinNoise } from "../core/perlin_noise"; +import { HubGoals } from "./hub_goals"; +import { BufferMaintainer } from "../core/buffer_maintainer"; +/* typehints:end */ + +const logger = createLogger("game/root"); + +/** + * The game root is basically the whole game state at a given point, + * combining all important classes. We don't have globals, but this + * class is passed to almost all game classes. + */ +export class GameRoot { + /** + * Constructs a new game root + * @param {Application} app + */ + constructor(app) { + this.app = app; + + /** @type {Savegame} */ + this.savegame = null; + + /** @type {InGameState} */ + this.gameState = null; + + // Store game dimensions + this.gameWidth = 500; + this.gameHeight = 500; + + // Stores whether the current session is a fresh game (true), or was continued (false) + /** @type {boolean} */ + this.gameIsFresh = true; + + // Stores whether the logic is already initialized + /** @type {boolean} */ + this.logicInitialized = false; + + // Stores whether the game is already initialized, that is, all systems etc have been created + /** @type {boolean} */ + this.gameInitialized = false; + + //////// Other properties /////// + + /** @type {Camera} */ + this.camera = null; + + /** @type {HTMLCanvasElement} */ + this.canvas = null; + + /** @type {CanvasRenderingContext2D} */ + this.context = null; + + /** @type {MapView} */ + this.map = null; + + /** @type {GameLogic} */ + this.logic = null; + + /** @type {EntityManager} */ + this.entityMgr = null; + + /** @type {GameHUD} */ + this.hud = null; + + /** @type {GameSystemManager} */ + this.systemMgr = null; + + /** @type {GameTime} */ + this.time = null; + + /** @type {PerlinNoise} */ + this.mapNoiseGenerator = null; + + /** @type {HubGoals} */ + this.hubGoals = null; + + /** @type {BufferMaintainer} */ + this.buffers = null; + + // /** @type {ParticleManager} */ + // this.particleMgr = null; + + // /** @type {ParticleManager} */ + // this.uiParticleMgr = null; + + /** @type {CanvasClickInterceptor} */ + this.canvasClickInterceptor = null; + + /** @type {AutomaticSave} */ + this.automaticSave = null; + + /** @type {SoundProxy} */ + this.soundProxy = null; + + // /** @type {MinimapRenderer} */ + // this.minimapRenderer = null; + + /** @type {ShapeDefinitionManager} */ + this.shapeDefinitionMgr = null; + + this.signals = { + // Entities + entityAdded: new Signal(/* entity */), + entityGotNewComponent: new Signal(/* entity */), + entityQueuedForDestroy: new Signal(/* entity */), + entityDestroyed: new Signal(/* entity */), + + // Global + resized: new Signal(/* w, h */), // Game got resized, + readyToRender: new Signal(), + aboutToDestruct: new Signal(), + + // Game Hooks + gameSaved: new Signal(), // Game got saved + gameRestored: new Signal(), // Game got restored + gameOver: new Signal(), // Game over + + storyGoalCompleted: new Signal(/* level, reward */), + upgradePurchased: new Signal(), + + // Called right after game is initialized + postLoadHook: new Signal(), + + // Can be used to trigger an async task + performAsync: new Signal(), + }; + + // RNG's + /** @type {Object.>} */ + this.rngs = {}; + + // Work queue + this.queue = { + requireRedraw: false, + }; + } + + /** + * Destructs the game root + */ + destruct() { + logger.log("destructing root"); + this.signals.aboutToDestruct.dispatch(); + + this.reset(); + } + + /** + * Prepares the root for game over, this sets the right flags and + * detaches all signals so no bad stuff happens + */ + prepareGameOver() { + this.gameInitialized = false; + this.logicInitialized = false; + // for (const key in this.signals) { + // if (key !== "aboutToDestruct") { + // this.signals[key].removeAll(); + // } + // } + } + + /** + * Resets the whole root and removes all properties + */ + reset() { + if (this.signals) { + // Destruct all signals + for (let i = 0; i < this.signals.length; ++i) { + this.signals[i].removeAll(); + } + } + + if (this.hud) { + this.hud.cleanup(); + } + if (this.camera) { + this.camera.cleanup(); + } + + // Finally free all properties + for (let prop in this) { + if (this.hasOwnProperty(prop)) { + delete this[prop]; + } + } + } +} diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js new file mode 100644 index 00000000..a3f91224 --- /dev/null +++ b/src/js/game/shape_definition.js @@ -0,0 +1,447 @@ +import { makeOffscreenBuffer } from "../core/buffer_utils"; +import { JSON_parse, JSON_stringify, Math_max, Math_PI, Math_radians } from "../core/builtins"; +import { globalConfig } from "../core/config"; +import { smoothenDpi } from "../core/dpi_manager"; +import { DrawParameters } from "../core/draw_parameters"; +import { createLogger } from "../core/logging"; +import { Vector } from "../core/vector"; +import { BasicSerializableObject } from "../savegame/serialization"; +import { enumColors, enumColorsToHexCode, enumColorToShortcode, enumShortcodeToColor } from "./colors"; + +const rusha = require("rusha"); + +const logger = createLogger("shape_definition"); + +/** + * @typedef {{ + * subShape: enumSubShape, + * color: enumColors, + * }} ShapeLayerItem + */ + +/** + * Order is Q1 (tr), Q2(br), Q3(bl), Q4(tl) + * @typedef {[ShapeLayerItem?, ShapeLayerItem?, ShapeLayerItem?, ShapeLayerItem?]} ShapeLayer + */ + +const arrayQuadrantIndexToOffset = [ + new Vector(1, -1), // tr + new Vector(1, 1), // br + new Vector(-1, 1), // bl + new Vector(-1, -1), // tl +]; + +/** @enum {string} */ +export const enumSubShape = { + rect: "rect", + circle: "circle", + star: "star", + windmill: "windmill", +}; + +/** @enum {string} */ +export const enumSubShapeToShortcode = { + [enumSubShape.rect]: "R", + [enumSubShape.circle]: "C", + [enumSubShape.star]: "S", + [enumSubShape.windmill]: "W", +}; + +/** @enum {enumSubShape} */ +export const enumShortcodeToSubShape = {}; +for (const key in enumSubShapeToShortcode) { + enumShortcodeToSubShape[enumSubShapeToShortcode[key]] = key; +} + +/** + * Converts the given parameters to a valid shape definition + * @param {*} layers + * @returns {Array} + */ +export function createSimpleShape(layers) { + layers.forEach(layer => { + layer.forEach(item => { + if (item) { + item.color = item.color || enumColors.uncolored; + } + }); + }); + return layers; +} + +export class ShapeDefinition extends BasicSerializableObject { + static getId() { + return "ShapeDefinition"; + } + + /** + * + * @param {object} param0 + * @param {Array=} param0.layers + */ + constructor({ layers = [] }) { + super(); + + /** + * The layers from bottom to top + * @type {Array} */ + this.layers = layers; + + /** @type {string} */ + this.cachedHash = null; + + // Set on demand + this.bufferGenerator = null; + } + + /** + * Generates the definition from the given short key + */ + static fromShortKey(key) { + const sourceLayers = key.split(":"); + let layers = []; + for (let i = 0; i < sourceLayers.length; ++i) { + const text = sourceLayers[i]; + assert(text.length === 8, "Invalid shape short key: " + key); + + /** @type {ShapeLayer} */ + const quads = [null, null, null, null]; + for (let quad = 0; quad < 4; ++quad) { + const shapeText = text[quad * 2 + 0]; + const subShape = enumShortcodeToSubShape[shapeText]; + const color = enumShortcodeToColor[text[quad * 2 + 1]]; + if (subShape) { + assert(color, "Invalid shape short key:", key); + quads[quad] = { + subShape, + color, + }; + } else if (shapeText !== "-") { + assert(false, "Invalid shape key: " + shapeText); + } + } + layers.push(quads); + } + + return new ShapeDefinition({ layers }); + } + + /** + * Internal method to clone the shape definition + * @returns {Array} + */ + internalCloneLayers() { + return JSON_parse(JSON_stringify(this.layers)); + } + + /** + * Returns if the definition is entirely empty^ + * @returns {boolean} + */ + isEntirelyEmpty() { + return this.layers.length === 0; + } + + /** + * Returns a unique id for this shape + * @returns {string} + */ + getHash() { + if (this.cachedHash) { + return this.cachedHash; + } + + let id = ""; + for (let layerIndex = 0; layerIndex < this.layers.length; ++layerIndex) { + const layer = this.layers[layerIndex]; + + for (let quadrant = 0; quadrant < layer.length; ++quadrant) { + const item = layer[quadrant]; + if (item) { + id += enumSubShapeToShortcode[item.subShape] + enumColorToShortcode[item.color]; + } else { + id += "--"; + } + } + } + this.cachedHash = id; + return id; + } + + /** + * Draws the shape definition + * @param {number} x + * @param {number} y + * @param {DrawParameters} parameters + */ + draw(x, y, parameters, size = 20) { + const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel); + + if (!this.bufferGenerator) { + this.bufferGenerator = this.internalGenerateShapeBuffer.bind(this); + } + + const key = size + "/" + dpi; + const canvas = parameters.root.buffers.getForKey( + key, + this.cachedHash, + size, + size, + dpi, + this.bufferGenerator + ); + parameters.context.drawImage(canvas, x - size / 2, y - size / 2, size, size); + } + + /** + * Generates this shape as a canvas + * @param {number} size + */ + generateAsCanvas(size = 20) { + const [canvas, context] = makeOffscreenBuffer(size, size, { + smooth: true, + label: "definition-canvas-cache-" + this.getHash(), + reusable: false, + }); + + this.internalGenerateShapeBuffer(canvas, context, size, size, 1); + return canvas; + } + + /** + * + * @param {HTMLCanvasElement} canvas + * @param {CanvasRenderingContext2D} context + * @param {number} w + * @param {number} h + * @param {number} dpi + */ + internalGenerateShapeBuffer(canvas, context, w, h, dpi) { + context.translate((w * dpi) / 2, (h * dpi) / 2); + context.scale((dpi * w) / 23, (dpi * h) / 23); + + context.fillStyle = "#e9ecf7"; + + const quadrantSize = 10; + const quadrantHalfSize = quadrantSize / 2; + + context.fillStyle = "rgba(40, 50, 65, 0.1)"; + context.beginCircle(0, 0, quadrantSize * 1.15); + context.fill(); + + for (let layerIndex = 0; layerIndex < this.layers.length; ++layerIndex) { + const quadrants = this.layers[layerIndex]; + + const layerScale = Math_max(0.1, 0.9 - layerIndex * 0.22); + + for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { + if (!quadrants[quadrantIndex]) { + continue; + } + const { subShape, color } = quadrants[quadrantIndex]; + + const quadrantPos = arrayQuadrantIndexToOffset[quadrantIndex]; + const centerQuadrantX = quadrantPos.x * quadrantHalfSize; + const centerQuadrantY = quadrantPos.y * quadrantHalfSize; + + const rotation = Math_radians(quadrantIndex * 90); + + context.translate(centerQuadrantX, centerQuadrantY); + context.rotate(rotation); + + context.fillStyle = enumColorsToHexCode[color]; + context.strokeStyle = "#555"; + context.lineWidth = 1; + + const insetPadding = 0.0; + + switch (subShape) { + case enumSubShape.rect: { + context.beginPath(); + const dims = quadrantSize * layerScale; + context.rect( + insetPadding + -quadrantHalfSize, + -insetPadding + quadrantHalfSize - dims, + dims, + dims + ); + + break; + } + case enumSubShape.star: { + context.beginPath(); + const dims = quadrantSize * layerScale; + + let originX = insetPadding - quadrantHalfSize; + let originY = -insetPadding + quadrantHalfSize - dims; + + const moveInwards = dims * 0.4; + context.moveTo(originX, originY + moveInwards); + context.lineTo(originX + dims, originY); + context.lineTo(originX + dims - moveInwards, originY + dims); + context.lineTo(originX, originY + dims); + context.closePath(); + break; + } + + case enumSubShape.windmill: { + context.beginPath(); + const dims = quadrantSize * layerScale; + + let originX = insetPadding - quadrantHalfSize; + let originY = -insetPadding + quadrantHalfSize - dims; + const moveInwards = dims * 0.4; + context.moveTo(originX, originY + moveInwards); + context.lineTo(originX + dims, originY); + context.lineTo(originX + dims, originY + dims); + context.lineTo(originX, originY + dims); + context.closePath(); + break; + } + + case enumSubShape.circle: { + context.beginPath(); + context.moveTo(insetPadding + -quadrantHalfSize, -insetPadding + quadrantHalfSize); + context.arc( + insetPadding + -quadrantHalfSize, + -insetPadding + quadrantHalfSize, + quadrantSize * layerScale, + -Math_PI * 0.5, + 0 + ); + context.closePath(); + break; + } + + default: { + assertAlways(false, "Unkown sub shape: " + subShape); + } + } + + context.fill(); + context.stroke(); + + context.rotate(-rotation); + context.translate(-centerQuadrantX, -centerQuadrantY); + } + } + } + + /** + * Returns a definition with only the given quadrants + * @param {Array} includeQuadrants + * @returns {ShapeDefinition} + */ + cloneFilteredByQuadrants(includeQuadrants) { + const newLayers = this.internalCloneLayers(); + for (let layerIndex = 0; layerIndex < newLayers.length; ++layerIndex) { + const quadrants = newLayers[layerIndex]; + let anyContents = false; + for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { + if (includeQuadrants.indexOf(quadrantIndex) < 0) { + quadrants[quadrantIndex] = null; + } else if (quadrants[quadrantIndex]) { + anyContents = true; + } + } + + // Check if the layer is entirely empty + if (!anyContents) { + newLayers.splice(layerIndex, 1); + layerIndex -= 1; + } + } + return new ShapeDefinition({ layers: newLayers }); + } + + /** + * Returns a definition which was rotated clockwise + * @returns {ShapeDefinition} + */ + cloneRotateCW() { + const newLayers = this.internalCloneLayers(); + for (let layerIndex = 0; layerIndex < newLayers.length; ++layerIndex) { + const quadrants = newLayers[layerIndex]; + quadrants.unshift(quadrants[3]); + quadrants.pop(); + } + return new ShapeDefinition({ layers: newLayers }); + } + + /** + * Stacks the given shape definition on top. + * @param {ShapeDefinition} definition + */ + cloneAndStackWith(definition) { + const newLayers = this.internalCloneLayers(); + + if (this.isEntirelyEmpty() || definition.isEntirelyEmpty()) { + assert(false, "Can not stack entirely empty definition"); + } + + // Put layer for layer on top + for (let i = 0; i < definition.layers.length; ++i) { + const layerToAdd = definition.layers[i]; + + // On which layer we can merge this upper layer + let mergeOnLayerIndex = null; + + // Go from top to bottom and check if there is anything intercepting it + for (let k = newLayers.length - 1; k >= 0; --k) { + const lowerLayer = newLayers[k]; + + let canMerge = true; + for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { + const upperItem = layerToAdd[quadrantIndex]; + const lowerItem = lowerLayer[quadrantIndex]; + + if (upperItem && lowerItem) { + // so, we can't merge it because two items conflict + canMerge = false; + break; + } + } + + // If we can merge it, store it - since we go from top to bottom + // we can simply override it + if (canMerge) { + mergeOnLayerIndex = k; + } + } + + if (mergeOnLayerIndex !== null) { + // Simply merge using an OR mask + for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { + newLayers[mergeOnLayerIndex][quadrantIndex] = + newLayers[mergeOnLayerIndex][quadrantIndex] || layerToAdd[quadrantIndex]; + } + } else { + // Add new layer + newLayers.push(layerToAdd); + } + } + + newLayers.splice(4); + + return new ShapeDefinition({ layers: newLayers }); + } + + /** + * Clones the shape and colors everything in the given color + * @param {enumColors} color + */ + cloneAndPaintWith(color) { + const newLayers = this.internalCloneLayers(); + + for (let layerIndex = 0; layerIndex < newLayers.length; ++layerIndex) { + const quadrants = newLayers[layerIndex]; + for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { + const item = quadrants[quadrantIndex]; + if (item) { + item.color = color; + } + } + } + return new ShapeDefinition({ layers: newLayers }); + } +} diff --git a/src/js/game/shape_definition_manager.js b/src/js/game/shape_definition_manager.js new file mode 100644 index 00000000..25f456cd --- /dev/null +++ b/src/js/game/shape_definition_manager.js @@ -0,0 +1,142 @@ +import { BasicSerializableObject } from "../savegame/serialization"; +import { GameRoot } from "./root"; +import { ShapeDefinition, enumSubShape } from "./shape_definition"; +import { createLogger } from "../core/logging"; +import { enumColors } from "./colors"; + +const logger = createLogger("shape_definition_manager"); + +export class ShapeDefinitionManager extends BasicSerializableObject { + static getId() { + return "ShapeDefinitionManager"; + } + + /** + * + * @param {GameRoot} root + */ + constructor(root) { + super(); + this.root = root; + + this.shapeKeyToDefinition = {}; + + // Caches operations in the form of 'operation:def1[:def2]' + /** @type {Object.|ShapeDefinition>} */ + this.operationCache = {}; + } + + /** + * Registers a new shape definition + * @param {ShapeDefinition} definition + */ + registerShapeDefinition(definition) { + const id = definition.getHash(); + assert(!this.shapeKeyToDefinition[id], "Shape Definition " + id + " already exists"); + this.shapeKeyToDefinition[id] = definition; + // logger.log("Registered shape with key", id); + } + + /** + * Generates a definition for splitting a shape definition in two halfs + * @param {ShapeDefinition} definition + * @returns {[ShapeDefinition, ShapeDefinition]} + */ + shapeActionCutHalf(definition) { + const key = "cut:" + definition.getHash(); + if (this.operationCache[key]) { + return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key]); + } + const rightSide = definition.cloneFilteredByQuadrants([0, 1]); + const leftSide = definition.cloneFilteredByQuadrants([2, 3]); + + return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key] = [ + this.registerOrReturnHandle(rightSide), + this.registerOrReturnHandle(leftSide), + ]); + } + + /** + * Generates a definition for rotating a shape clockwise + * @param {ShapeDefinition} definition + * @returns {ShapeDefinition} + */ + shapeActionRotateCW(definition) { + const key = "rotate:" + definition.getHash(); + if (this.operationCache[key]) { + return /** @type {ShapeDefinition} */ (this.operationCache[key]); + } + + const rotated = definition.cloneRotateCW(); + + return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle( + rotated + )); + } + + /** + * Generates a definition for stacking the upper definition onto the lower one + * @param {ShapeDefinition} lowerDefinition + * @param {ShapeDefinition} upperDefinition + * @returns {ShapeDefinition} + */ + shapeActionStack(lowerDefinition, upperDefinition) { + const key = "stack:" + lowerDefinition.getHash() + ":" + upperDefinition.getHash(); + if (this.operationCache[key]) { + return /** @type {ShapeDefinition} */ (this.operationCache[key]); + } + const stacked = lowerDefinition.cloneAndStackWith(upperDefinition); + return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle( + stacked + )); + } + + /** + * Generates a definition for painting it with the given color + * @param {ShapeDefinition} definition + * @param {string} color + * @returns {ShapeDefinition} + */ + shapeActionPaintWith(definition, color) { + const key = "paint:" + definition.getHash() + ":" + color; + if (this.operationCache[key]) { + return /** @type {ShapeDefinition} */ (this.operationCache[key]); + } + const colorized = definition.cloneAndPaintWith(color); + return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle( + colorized + )); + } + + /** + * Checks if we already have cached this definition, and if so throws it away and returns the already + * cached variant + * @param {ShapeDefinition} definition + */ + registerOrReturnHandle(definition) { + const id = definition.getHash(); + if (this.shapeKeyToDefinition[id]) { + return this.shapeKeyToDefinition[id]; + } + this.shapeKeyToDefinition[id] = definition; + // logger.log("Registered shape with key (2)", id); + return definition; + } + + /** + * + * @param {[enumSubShape, enumSubShape, enumSubShape, enumSubShape]} subShapes + * @returns {ShapeDefinition} + */ + getDefinitionFromSimpleShapes(subShapes, color = enumColors.uncolored) { + const shapeLayer = /** @type {import("./shape_definition").ShapeLayer} */ (subShapes.map( + subShape => ({ + subShape, + rotation: 0, + color, + }) + )); + + return this.registerOrReturnHandle(new ShapeDefinition({ layers: [shapeLayer] })); + } +} diff --git a/src/js/game/sound_proxy.js b/src/js/game/sound_proxy.js new file mode 100644 index 00000000..120136d4 --- /dev/null +++ b/src/js/game/sound_proxy.js @@ -0,0 +1,83 @@ +/* typehints:start */ +import { GameRoot } from "./root"; +/* typehints:end */ + +import { Vector } from "../core/vector"; +import { SOUNDS } from "../platform/sound"; + +const avgSoundDurationSeconds = 0.25; +const maxOngoingSounds = 10; + +// Proxy to the application sound instance +export class SoundProxy { + /** + * @param {GameRoot} root + */ + constructor(root) { + this.root = root; + + // Store a list of sounds and when we started them + this.playingSounds = []; + } + + /** + * Plays a new ui sound + * @param {string} id Sound ID + */ + playUi(id) { + assert(typeof id === "string", "Not a valid sound id: " + id); + this.root.app.sound.playUiSound(id); + } + + /** + * Plays the ui click sound + */ + playUiClick() { + this.playUi(SOUNDS.uiClick); + } + + /** + * Plays the ui error sound + */ + playUiError() { + this.playUi(SOUNDS.uiError); + } + + /** + * Plays a 3D sound whose volume is scaled based on where it was emitted + * @param {string} id Sound ID + * @param {Vector} pos World space position + */ + play3D(id, pos) { + assert(typeof id === "string", "Not a valid sound id: " + id); + assert(pos instanceof Vector, "Invalid sound position"); + this.internalUpdateOngoingSounds(); + + if (this.playingSounds.length > maxOngoingSounds) { + // Too many ongoing sounds + // console.warn( + // "Not playing", + // id, + // "because there are too many sounds playing" + // ); + return false; + } + + this.root.app.sound.play3DSound(id, pos, this.root); + this.playingSounds.push(this.root.time.realtimeNow()); + return true; + } + + /** + * Updates the list of ongoing sounds + */ + internalUpdateOngoingSounds() { + const now = this.root.time.realtimeNow(); + for (let i = 0; i < this.playingSounds.length; ++i) { + if (now - this.playingSounds[i] > avgSoundDurationSeconds) { + this.playingSounds.splice(i, 1); + i -= 1; + } + } + } +} diff --git a/src/js/game/systems/belt.js b/src/js/game/systems/belt.js new file mode 100644 index 00000000..a2853998 --- /dev/null +++ b/src/js/game/systems/belt.js @@ -0,0 +1,201 @@ +import { Math_radians, Math_min } from "../../core/builtins"; +import { globalConfig } from "../../core/config"; +import { DrawParameters } from "../../core/draw_parameters"; +import { Loader } from "../../core/loader"; +import { AtlasSprite } from "../../core/sprites"; +import { BeltComponent } from "../components/belt"; +import { Entity } from "../entity"; +import { GameSystemWithFilter } from "../game_system_with_filter"; +import { enumDirection, enumDirectionToVector, Vector } from "../../core/vector"; +import { MapChunkView } from "../map_chunk_view"; + +const BELT_ANIM_COUNT = 6; + +export class BeltSystem extends GameSystemWithFilter { + constructor(root) { + super(root, [BeltComponent]); + /** + * @type {Object.>} + */ + this.beltSprites = { + [enumDirection.top]: Loader.getSprite("sprites/belt/forward_0.png"), + [enumDirection.left]: Loader.getSprite("sprites/belt/left_0.png"), + [enumDirection.right]: Loader.getSprite("sprites/belt/right_0.png"), + }; + /** + * @type {Object.>} + */ + this.beltAnimations = { + [enumDirection.top]: [ + Loader.getSprite("sprites/belt/forward_0.png"), + Loader.getSprite("sprites/belt/forward_1.png"), + Loader.getSprite("sprites/belt/forward_2.png"), + Loader.getSprite("sprites/belt/forward_3.png"), + Loader.getSprite("sprites/belt/forward_4.png"), + Loader.getSprite("sprites/belt/forward_5.png"), + ], + [enumDirection.left]: [ + Loader.getSprite("sprites/belt/left_0.png"), + Loader.getSprite("sprites/belt/left_1.png"), + Loader.getSprite("sprites/belt/left_2.png"), + Loader.getSprite("sprites/belt/left_3.png"), + Loader.getSprite("sprites/belt/left_4.png"), + Loader.getSprite("sprites/belt/left_5.png"), + ], + [enumDirection.right]: [ + Loader.getSprite("sprites/belt/right_0.png"), + Loader.getSprite("sprites/belt/right_1.png"), + Loader.getSprite("sprites/belt/right_2.png"), + Loader.getSprite("sprites/belt/right_3.png"), + Loader.getSprite("sprites/belt/right_4.png"), + Loader.getSprite("sprites/belt/right_5.png"), + ], + }; + } + + draw(parameters) { + this.forEachMatchingEntityOnScreen(parameters, this.drawEntityItems.bind(this)); + } + + update() { + const beltSpeed = this.root.hubGoals.getBeltBaseSpeed() * globalConfig.physicsDeltaSeconds; + + for (let i = 0; i < this.allEntities.length; ++i) { + const entity = this.allEntities[i]; + const beltComp = entity.components.Belt; + const staticComp = entity.components.StaticMapEntity; + const items = beltComp.sortedItems; + if (items.length === 0) { + // Fast out for performance + continue; + } + + const ejectorComp = entity.components.ItemEjector; + let maxProgress = 1; + + // When ejecting, we can not go further than the item spacing since it + // will be on the corner + if (ejectorComp.isAnySlotEjecting()) { + maxProgress = 1 - globalConfig.itemSpacingOnBelts; + } else { + // Find follow up belt to make sure we don't clash items + const followUpDirection = staticComp.localDirectionToWorld(beltComp.direction); + const followUpVector = enumDirectionToVector[followUpDirection]; + + const followUpTile = staticComp.origin.add(followUpVector); + const followUpEntity = this.root.map.getTileContent(followUpTile); + + if (followUpEntity) { + const followUpBeltComp = followUpEntity.components.Belt; + if (followUpBeltComp) { + const spacingOnBelt = followUpBeltComp.getDistanceToFirstItemCenter(); + maxProgress = Math_min(1, 1 - globalConfig.itemSpacingOnBelts + spacingOnBelt); + } + } + } + + let speedMultiplier = 1; + if (beltComp.direction !== enumDirection.top) { + // Shaped belts are longer, thus being quicker + speedMultiplier = 1.41; + } + + for (let itemIndex = items.length - 1; itemIndex >= 0; --itemIndex) { + const itemAndProgress = items[itemIndex]; + + const newProgress = itemAndProgress[0] + speedMultiplier * beltSpeed; + if (newProgress >= 1.0) { + // Try to give this item to a new belt + const freeSlot = ejectorComp.getFirstFreeSlot(); + + if (freeSlot === null) { + // So, we don't have a free slot - damned! + itemAndProgress[0] = 1.0; + maxProgress = 1 - globalConfig.itemSpacingOnBelts; + } else { + // We got a free slot, remove this item and keep it on the ejector slot + if (!ejectorComp.tryEject(freeSlot, itemAndProgress[1])) { + assert(false, "Ejection failed"); + } + items.splice(itemIndex, 1); + maxProgress = 1; + } + } else { + itemAndProgress[0] = Math_min(newProgress, maxProgress); + maxProgress = itemAndProgress[0] - globalConfig.itemSpacingOnBelts; + } + } + } + } + + /** + * + * @param {DrawParameters} parameters + * @param {MapChunkView} chunk + */ + drawChunk(parameters, chunk) { + if (parameters.zoomLevel < globalConfig.mapChunkOverviewMinZoom) { + return; + 1; + } + + const speedMultiplier = this.root.hubGoals.getBeltBaseSpeed(); + + // SYNC with systems/item_processor.js:drawEntityUnderlays! + // 126 / 42 is the exact animation speed of the png animation + const animationIndex = Math.floor( + (this.root.time.now() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42 + ); + const contents = chunk.contents; + for (let y = 0; y < globalConfig.mapChunkSize; ++y) { + for (let x = 0; x < globalConfig.mapChunkSize; ++x) { + const entity = contents[x][y]; + + if (entity && entity.components.Belt) { + const direction = entity.components.Belt.direction; + const sprite = this.beltAnimations[direction][animationIndex % BELT_ANIM_COUNT]; + + entity.components.StaticMapEntity.drawSpriteOnFullEntityBounds( + parameters, + sprite, + 0, + false + ); + } + } + } + 1; + } + + /** + * @param {DrawParameters} parameters + * @param {Entity} entity + */ + drawEntityItems(parameters, entity) { + const beltComp = entity.components.Belt; + const staticComp = entity.components.StaticMapEntity; + + const items = beltComp.sortedItems; + + if (items.length === 0) { + // Fast out for performance + return; + } + + for (let i = 0; i < items.length; ++i) { + const itemAndProgress = items[i]; + + // Nice would be const [pos, item] = itemAndPos; but that gets polyfilled and is super slow then + const progress = itemAndProgress[0]; + const item = itemAndProgress[1]; + + const position = staticComp.applyRotationToVector(beltComp.transformBeltToLocalSpace(progress)); + + item.draw( + (staticComp.origin.x + position.x + 0.5) * globalConfig.tileSize, + (staticComp.origin.y + position.y + 0.5) * globalConfig.tileSize, + parameters + ); + } + } +} diff --git a/src/js/game/systems/hub.js b/src/js/game/systems/hub.js new file mode 100644 index 00000000..9a768c81 --- /dev/null +++ b/src/js/game/systems/hub.js @@ -0,0 +1,83 @@ +import { GameSystemWithFilter } from "../game_system_with_filter"; +import { HubComponent } from "../components/hub"; +import { DrawParameters } from "../../core/draw_parameters"; +import { Entity } from "../entity"; +import { formatBigNumber } from "../../core/utils"; + +export class HubSystem extends GameSystemWithFilter { + constructor(root) { + super(root, [HubComponent]); + } + + draw(parameters) { + this.forEachMatchingEntityOnScreen(parameters, this.drawEntity.bind(this)); + } + + update() { + for (let i = 0; i < this.allEntities.length; ++i) { + const entity = this.allEntities[i]; + + const hubComponent = entity.components.Hub; + + const queue = hubComponent.definitionsToAnalyze; + for (let k = 0; k < queue.length; ++k) { + const definition = queue[k]; + this.root.hubGoals.handleDefinitionDelivered(definition); + } + + hubComponent.definitionsToAnalyze = []; + } + } + + /** + * @param {DrawParameters} parameters + * @param {Entity} entity + */ + drawEntity(parameters, entity) { + const context = parameters.context; + const staticComp = entity.components.StaticMapEntity; + + const pos = staticComp.getTileSpaceBounds().getCenter().toWorldSpace(); + + const definition = this.root.hubGoals.currentGoal.definition; + + definition.draw(pos.x - 25, pos.y - 10, parameters, 40); + + const goals = this.root.hubGoals.currentGoal; + + const textOffsetX = 2; + const textOffsetY = -6; + + // Deliver count + context.font = "bold 25px GameFont"; + context.fillStyle = "#64666e"; + context.textAlign = "left"; + context.fillText( + "" + formatBigNumber(this.root.hubGoals.getCurrentGoalDelivered()), + pos.x + textOffsetX, + pos.y + textOffsetY + ); + + // Required + context.font = "13px GameFont"; + context.fillStyle = "#a4a6b0"; + context.fillText( + "/ " + formatBigNumber(goals.required), + pos.x + textOffsetX, + pos.y + textOffsetY + 13 + ); + + // Reward + context.font = "bold 11px GameFont"; + context.fillStyle = "#fd0752"; + context.textAlign = "center"; + context.fillText(goals.reward.toUpperCase(), pos.x, pos.y + 46); + + // Level + context.font = "bold 11px GameFont"; + context.fillStyle = "#fff"; + context.fillText("" + this.root.hubGoals.level, pos.x - 42, pos.y - 36); + + context.textAlign = "left"; + } +} diff --git a/src/js/game/systems/item_ejector.js b/src/js/game/systems/item_ejector.js new file mode 100644 index 00000000..ee448dd9 --- /dev/null +++ b/src/js/game/systems/item_ejector.js @@ -0,0 +1,173 @@ +import { globalConfig } from "../../core/config"; +import { DrawParameters } from "../../core/draw_parameters"; +import { enumDirectionToVector, Vector } from "../../core/vector"; +import { BaseItem } from "../base_item"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { Entity } from "../entity"; +import { GameSystemWithFilter } from "../game_system_with_filter"; +import { Math_min } from "../../core/builtins"; + +export class ItemEjectorSystem extends GameSystemWithFilter { + constructor(root) { + super(root, [ItemEjectorComponent]); + } + + update() { + const effectiveBeltSpeed = this.root.hubGoals.getBeltBaseSpeed(); + const progressGrowth = (effectiveBeltSpeed / 0.5) * globalConfig.physicsDeltaSeconds; + + // Try to find acceptors for every ejector + for (let i = 0; i < this.allEntities.length; ++i) { + const entity = this.allEntities[i]; + const ejectorComp = entity.components.ItemEjector; + const staticComp = entity.components.StaticMapEntity; + + // For every ejector slot, try to find an acceptor + for (let ejectorSlotIndex = 0; ejectorSlotIndex < ejectorComp.slots.length; ++ejectorSlotIndex) { + const ejectorSlot = ejectorComp.slots[ejectorSlotIndex]; + const ejectingItem = ejectorSlot.item; + if (!ejectingItem) { + // No item ejected + continue; + } + + ejectorSlot.progress = Math_min(1, ejectorSlot.progress + progressGrowth); + if (ejectorSlot.progress < 1.0) { + // Still ejecting + continue; + } + + // Figure out where and into which direction we eject items + const ejectSlotWsTile = staticComp.localTileToWorld(ejectorSlot.pos); + const ejectSlotWsDirection = staticComp.localDirectionToWorld(ejectorSlot.direction); + const ejectSlotWsDirectionVector = enumDirectionToVector[ejectSlotWsDirection]; + const ejectSlotTargetWsTile = ejectSlotWsTile.add(ejectSlotWsDirectionVector); + + // Try to find the given acceptor component to take the item + const targetEntity = this.root.map.getTileContent(ejectSlotTargetWsTile); + if (!targetEntity) { + // No consumer for item + continue; + } + + const targetAcceptorComp = targetEntity.components.ItemAcceptor; + const targetStaticComp = targetEntity.components.StaticMapEntity; + if (!targetAcceptorComp) { + // Entity doesn't accept items + continue; + } + + const matchingSlot = targetAcceptorComp.findMatchingSlot( + targetStaticComp.worldToLocalTile(ejectSlotTargetWsTile), + targetStaticComp.worldDirectionToLocal(ejectSlotWsDirection) + ); + + if (!matchingSlot) { + // No matching slot found + continue; + } + + if (!targetAcceptorComp.canAcceptItem(matchingSlot.index, ejectingItem)) { + // Can not accept item + continue; + } + + if ( + this.tryPassOverItem( + ejectingItem, + targetEntity, + matchingSlot.index, + matchingSlot.acceptedDirection + ) + ) { + ejectorSlot.item = null; + continue; + } + } + } + } + + /** + * + * @param {BaseItem} item + * @param {Entity} receiver + * @param {number} slotIndex + * @param {string} localDirection + */ + tryPassOverItem(item, receiver, slotIndex, localDirection) { + // Try figuring out how what to do with the item + // TODO: Kinda hacky. How to solve this properly? Don't want to go through inheritance hell. + // Also its just a few cases (hope it stays like this .. :x). + + const beltComp = receiver.components.Belt; + if (beltComp) { + // Ayy, its a belt! + if (beltComp.canAcceptNewItem(localDirection)) { + beltComp.takeNewItem(item, localDirection); + return true; + } + } + + const itemProcessorComp = receiver.components.ItemProcessor; + if (itemProcessorComp) { + // Its an item processor .. + if (itemProcessorComp.tryTakeItem(item, slotIndex, localDirection)) { + return true; + } + } + + const undergroundBeltCmop = receiver.components.UndergroundBelt; + if (undergroundBeltCmop) { + // Its an underground belt. yay. + if ( + undergroundBeltCmop.tryAcceptExternalItem( + item, + this.root.hubGoals.getUndergroundBeltBaseSpeed() + ) + ) { + return true; + } + } + + return false; + } + + draw(parameters) { + this.forEachMatchingEntityOnScreen(parameters, this.drawSingleEntity.bind(this)); + } + + /** + * @param {DrawParameters} parameters + * @param {Entity} entity + */ + drawSingleEntity(parameters, entity) { + const ejectorComp = entity.components.ItemEjector; + const staticComp = entity.components.StaticMapEntity; + + for (let i = 0; i < ejectorComp.slots.length; ++i) { + const slot = ejectorComp.slots[i]; + const ejectedItem = slot.item; + if (!ejectedItem) { + // No item + continue; + } + + const realPosition = slot.pos.rotateFastMultipleOf90(staticComp.rotationDegrees); + const realDirection = Vector.transformDirectionFromMultipleOf90( + slot.direction, + staticComp.rotationDegrees + ); + const realDirectionVector = enumDirectionToVector[realDirection]; + + const tileX = + staticComp.origin.x + realPosition.x + 0.5 + realDirectionVector.x * 0.5 * slot.progress; + const tileY = + staticComp.origin.y + realPosition.y + 0.5 + realDirectionVector.y * 0.5 * slot.progress; + + const worldX = tileX * globalConfig.tileSize; + const worldY = tileY * globalConfig.tileSize; + + ejectedItem.draw(worldX, worldY, parameters); + } + } +} diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js new file mode 100644 index 00000000..63e921a8 --- /dev/null +++ b/src/js/game/systems/item_processor.js @@ -0,0 +1,341 @@ +import { globalConfig } from "../../core/config"; +import { DrawParameters } from "../../core/draw_parameters"; +import { Loader } from "../../core/loader"; +import { Entity } from "../entity"; +import { GameSystemWithFilter } from "../game_system_with_filter"; +import { ItemProcessorComponent, enumItemProcessorTypes } from "../components/item_processor"; +import { Math_max, Math_radians } from "../../core/builtins"; +import { BaseItem } from "../base_item"; +import { ShapeItem } from "../items/shape_item"; +import { enumDirectionToVector, enumDirection, enumDirectionToAngle } from "../../core/vector"; +import { ColorItem } from "../items/color_item"; +import { enumColorMixingResults } from "../colors"; +import { drawRotatedSprite } from "../../core/draw_utils"; + +export class ItemProcessorSystem extends GameSystemWithFilter { + constructor(root) { + super(root, [ItemProcessorComponent]); + + this.sprites = {}; + for (const key in enumItemProcessorTypes) { + this.sprites[key] = Loader.getSprite("sprites/buildings/" + key + ".png"); + } + + this.underlayBeltSprites = [ + Loader.getSprite("sprites/belt/forward_0.png"), + Loader.getSprite("sprites/belt/forward_1.png"), + Loader.getSprite("sprites/belt/forward_2.png"), + Loader.getSprite("sprites/belt/forward_3.png"), + Loader.getSprite("sprites/belt/forward_4.png"), + Loader.getSprite("sprites/belt/forward_5.png"), + ]; + } + + draw(parameters) { + this.forEachMatchingEntityOnScreen(parameters, this.drawEntity.bind(this)); + } + + drawUnderlays(parameters) { + this.forEachMatchingEntityOnScreen(parameters, this.drawEntityUnderlays.bind(this)); + } + + update() { + for (let i = 0; i < this.allEntities.length; ++i) { + const entity = this.allEntities[i]; + + const processorComp = entity.components.ItemProcessor; + const ejectorComp = entity.components.ItemEjector; + + // First of all, process the current recipe + processorComp.secondsUntilEject = Math_max( + 0, + processorComp.secondsUntilEject - globalConfig.physicsDeltaSeconds + ); + + // Also, process item consumption animations to avoid items popping from the belts + for (let animIndex = 0; animIndex < processorComp.itemConsumptionAnimations.length; ++animIndex) { + const anim = processorComp.itemConsumptionAnimations[animIndex]; + anim.animProgress += + globalConfig.physicsDeltaSeconds * this.root.hubGoals.getBeltBaseSpeed() * 2; + if (anim.animProgress > 1) { + processorComp.itemConsumptionAnimations.splice(animIndex, 1); + animIndex -= 1; + } + } + + // Check if we have any finished items we can eject + if ( + processorComp.secondsUntilEject === 0 && // it was processed in time + processorComp.itemsToEject.length > 0 // we have some items left to eject + ) { + for (let itemIndex = 0; itemIndex < processorComp.itemsToEject.length; ++itemIndex) { + const { item, requiredSlot, preferredSlot } = processorComp.itemsToEject[itemIndex]; + + let slot = null; + if (requiredSlot !== null && requiredSlot !== undefined) { + // We have a slot override, check if that is free + if (ejectorComp.canEjectOnSlot(requiredSlot)) { + slot = requiredSlot; + } + } else if (preferredSlot !== null && preferredSlot !== undefined) { + // We have a slot preference, try using it but otherwise use a free slot + if (ejectorComp.canEjectOnSlot(preferredSlot)) { + slot = preferredSlot; + } else { + slot = ejectorComp.getFirstFreeSlot(); + } + } else { + // We can eject on any slot + slot = ejectorComp.getFirstFreeSlot(); + } + + if (slot !== null) { + // Alright, we can actually eject + if (!ejectorComp.tryEject(slot, item)) { + assert(false, "Failed to eject"); + } else { + processorComp.itemsToEject.splice(itemIndex, 1); + itemIndex -= 1; + } + } + } + } + + // Check if we have an empty queue and can start a new charge + if (processorComp.itemsToEject.length === 0) { + if (processorComp.inputSlots.length === processorComp.inputsPerCharge) { + this.startNewCharge(entity); + } + } + } + } + + /** + * Starts a new charge for the entity + * @param {Entity} entity + */ + startNewCharge(entity) { + const processorComp = entity.components.ItemProcessor; + + // First, take items + const items = processorComp.inputSlots; + processorComp.inputSlots = []; + + const baseSpeed = this.root.hubGoals.getProcessorBaseSpeed(processorComp.type); + processorComp.secondsUntilEject = 1 / baseSpeed; + + /** @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} */ + const outItems = []; + + // DO SOME MAGIC + + switch (processorComp.type) { + // SPLITTER + case enumItemProcessorTypes.splitter: { + let nextSlot = processorComp.nextOutputSlot++ % 2; + for (let i = 0; i < items.length; ++i) { + outItems.push({ + item: items[i].item, + preferredSlot: (nextSlot + i) % 2, + }); + } + break; + } + + // CUTTER + case enumItemProcessorTypes.cutter: { + const inputItem = /** @type {ShapeItem} */ (items[0].item); + assert(inputItem instanceof ShapeItem, "Input for cut is not a shape"); + const inputDefinition = inputItem.definition; + + const [cutDefinition1, cutDefinition2] = this.root.shapeDefinitionMgr.shapeActionCutHalf( + inputDefinition + ); + + if (!cutDefinition1.isEntirelyEmpty()) { + outItems.push({ + item: new ShapeItem(cutDefinition1), + requiredSlot: 0, + }); + } + + if (!cutDefinition2.isEntirelyEmpty()) { + outItems.push({ + item: new ShapeItem(cutDefinition2), + requiredSlot: 1, + }); + } + + break; + } + + // ROTATER + case enumItemProcessorTypes.rotater: { + const inputItem = /** @type {ShapeItem} */ (items[0].item); + assert(inputItem instanceof ShapeItem, "Input for cut is not a shape"); + const inputDefinition = inputItem.definition; + + const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCW(inputDefinition); + outItems.push({ + item: new ShapeItem(rotatedDefinition), + }); + break; + } + + // STACKER + + case enumItemProcessorTypes.stacker: { + const item1 = items[0]; + const item2 = items[1]; + + const lowerItem = /** @type {ShapeItem} */ (item1.sourceSlot === 0 ? item1.item : item2.item); + const upperItem = /** @type {ShapeItem} */ (item1.sourceSlot === 1 ? item1.item : item2.item); + assert(lowerItem instanceof ShapeItem, "Input for lower stack is not a shape"); + assert(upperItem instanceof ShapeItem, "Input for upper stack is not a shape"); + + const stackedDefinition = this.root.shapeDefinitionMgr.shapeActionStack( + lowerItem.definition, + upperItem.definition + ); + outItems.push({ + item: new ShapeItem(stackedDefinition), + }); + break; + } + + // TRASH + + case enumItemProcessorTypes.trash: { + // Well this one is easy .. simply do nothing with the item + break; + } + + // MIXER + + case enumItemProcessorTypes.mixer: { + // Find both colors and combine them + const item1 = /** @type {ColorItem} */ (items[0].item); + const item2 = /** @type {ColorItem} */ (items[1].item); + assert(item1 instanceof ColorItem, "Input for color mixer is not a color"); + assert(item2 instanceof ColorItem, "Input for color mixer is not a color"); + + const color1 = item1.color; + const color2 = item2.color; + + // Try finding mixer color, and if we can't mix it we simply return the same color + const mixedColor = enumColorMixingResults[color1][color2]; + let resultColor = color1; + if (mixedColor) { + resultColor = mixedColor; + } + outItems.push({ + item: new ColorItem(resultColor), + }); + + break; + } + + // PAINTER + + case enumItemProcessorTypes.painter: { + const item1 = items[0]; + const item2 = items[1]; + + const shapeItem = /** @type {ShapeItem} */ (item1.sourceSlot === 0 ? item1.item : item2.item); + const colorItem = /** @type {ColorItem} */ (item1.sourceSlot === 1 ? item1.item : item2.item); + + const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith( + shapeItem.definition, + colorItem.color + ); + + outItems.push({ + item: new ShapeItem(colorizedDefinition), + }); + + break; + } + + // HUB + + case enumItemProcessorTypes.hub: { + const shapeItem = /** @type {ShapeItem} */ (items[0].item); + + const hubComponent = entity.components.Hub; + assert(hubComponent, "Hub item processor has no hub component"); + + hubComponent.queueShapeDefinition(shapeItem.definition); + break; + } + + default: + assertAlways(false, "Unkown item processor type: " + processorComp.type); + } + + processorComp.itemsToEject = outItems; + } + + /** + * @param {DrawParameters} parameters + * @param {Entity} entity + */ + drawEntity(parameters, entity) { + const staticComp = entity.components.StaticMapEntity; + const processorComp = entity.components.ItemProcessor; + const acceptorComp = entity.components.ItemAcceptor; + + for (let animIndex = 0; animIndex < processorComp.itemConsumptionAnimations.length; ++animIndex) { + const { item, slotIndex, animProgress, direction } = processorComp.itemConsumptionAnimations[ + animIndex + ]; + + const slotData = acceptorComp.slots[slotIndex]; + const slotWorldPos = staticComp.applyRotationToVector(slotData.pos).add(staticComp.origin); + + const fadeOutDirection = enumDirectionToVector[staticComp.localDirectionToWorld(direction)]; + const finalTile = slotWorldPos.subScalars( + fadeOutDirection.x * (animProgress / 2 - 0.5), + fadeOutDirection.y * (animProgress / 2 - 0.5) + ); + item.draw( + (finalTile.x + 0.5) * globalConfig.tileSize, + (finalTile.y + 0.5) * globalConfig.tileSize, + parameters + ); + } + } + /** + * @param {DrawParameters} parameters + * @param {Entity} entity + */ + drawEntityUnderlays(parameters, entity) { + const staticComp = entity.components.StaticMapEntity; + const processorComp = entity.components.ItemProcessor; + + const underlays = processorComp.beltUnderlays; + for (let i = 0; i < underlays.length; ++i) { + const { pos, direction } = underlays[i]; + + const transformedPos = staticComp.localTileToWorld(pos); + const angle = enumDirectionToAngle[staticComp.localDirectionToWorld(direction)]; + + // SYNC with systems/belt.js:drawSingleEntity! + const animationIndex = Math.floor( + (this.root.time.now() * + this.root.hubGoals.getBeltBaseSpeed() * + this.underlayBeltSprites.length * + 126) / + 42 + ); + + drawRotatedSprite({ + parameters, + sprite: this.underlayBeltSprites[animationIndex % this.underlayBeltSprites.length], + x: (transformedPos.x + 0.5) * globalConfig.tileSize, + y: (transformedPos.y + 0.5) * globalConfig.tileSize, + angle: Math_radians(angle), + size: globalConfig.tileSize, + }); + } + } +} diff --git a/src/js/game/systems/map_resources.js b/src/js/game/systems/map_resources.js new file mode 100644 index 00000000..7edb827c --- /dev/null +++ b/src/js/game/systems/map_resources.js @@ -0,0 +1,56 @@ +import { GameSystem } from "../game_system"; +import { DrawParameters } from "../../core/draw_parameters"; +import { globalConfig } from "../../core/config"; +import { MapChunkView } from "../map_chunk_view"; + +export class MapResourcesSystem extends GameSystem { + /** + * Draws the map resources + * @param {DrawParameters} parameters + * @param {MapChunkView} chunk + */ + drawChunk(parameters, chunk) { + const renderItems = parameters.zoomLevel >= globalConfig.mapChunkOverviewMinZoom; + + parameters.context.globalAlpha = 0.5; + const layer = chunk.lowerLayer; + for (let x = 0; x < globalConfig.mapChunkSize; ++x) { + const row = layer[x]; + for (let y = 0; y < globalConfig.mapChunkSize; ++y) { + const lowerItem = row[y]; + if (lowerItem) { + parameters.context.fillStyle = lowerItem.getBackgroundColorAsResource(); + parameters.context.fillRect( + (chunk.tileX + x) * globalConfig.tileSize, + (chunk.tileY + y) * globalConfig.tileSize, + globalConfig.tileSize, + globalConfig.tileSize + ); + if (renderItems) { + lowerItem.draw( + (chunk.tileX + x + 0.5) * globalConfig.tileSize, + (chunk.tileY + y + 0.5) * globalConfig.tileSize, + parameters + ); + } + } + } + } + parameters.context.globalAlpha = 1; + + if (!renderItems) { + // Render patches instead + const patches = chunk.patches; + for (let i = 0; i < patches.length; ++i) { + const { pos, item, size } = patches[i]; + + item.draw( + (chunk.tileX + pos.x + 0.5) * globalConfig.tileSize, + (chunk.tileY + pos.y + 0.5) * globalConfig.tileSize, + parameters, + 80 + ); + } + } + } +} diff --git a/src/js/game/systems/miner.js b/src/js/game/systems/miner.js new file mode 100644 index 00000000..4c9d5cca --- /dev/null +++ b/src/js/game/systems/miner.js @@ -0,0 +1,87 @@ +import { globalConfig } from "../../core/config"; +import { DrawParameters } from "../../core/draw_parameters"; +import { MinerComponent } from "../components/miner"; +import { GameSystemWithFilter } from "../game_system_with_filter"; +import { MapChunkView } from "../map_chunk_view"; + +export class MinerSystem extends GameSystemWithFilter { + constructor(root) { + super(root, [MinerComponent]); + } + + update() { + const miningSpeed = this.root.hubGoals.getMinerBaseSpeed(); + for (let i = 0; i < this.allEntities.length; ++i) { + const entity = this.allEntities[i]; + + const minerComp = entity.components.Miner; + const staticComp = entity.components.StaticMapEntity; + const ejectComp = entity.components.ItemEjector; + + if (this.root.time.isIngameTimerExpired(minerComp.lastMiningTime, 1 / miningSpeed)) { + if (!ejectComp.canEjectOnSlot(0)) { + // We can't eject further + continue; + } + + // Actually mine + minerComp.lastMiningTime = this.root.time.now(); + + const lowerLayerItem = this.root.map.getLowerLayerContentXY( + staticComp.origin.x, + staticComp.origin.y + ); + if (!lowerLayerItem) { + // Nothing below; + continue; + } + + // Try actually ejecting + if (!ejectComp.tryEject(0, lowerLayerItem)) { + assert(false, "Failed to eject"); + } + } + } + } + + /** + * + * @param {DrawParameters} parameters + * @param {MapChunkView} chunk + */ + drawChunk(parameters, chunk) { + const contents = chunk.contents; + for (let y = 0; y < globalConfig.mapChunkSize; ++y) { + for (let x = 0; x < globalConfig.mapChunkSize; ++x) { + const entity = contents[x][y]; + + if (entity && entity.components.Miner) { + const staticComp = entity.components.StaticMapEntity; + const lowerLayerItem = this.root.map.getLowerLayerContentXY( + staticComp.origin.x, + staticComp.origin.y + ); + + if (lowerLayerItem) { + const padding = 3; + parameters.context.fillStyle = lowerLayerItem.getBackgroundColorAsResource(); + parameters.context.fillRect( + staticComp.origin.x * globalConfig.tileSize + padding, + staticComp.origin.y * globalConfig.tileSize + padding, + globalConfig.tileSize - 2 * padding, + globalConfig.tileSize - 2 * padding + ); + } + + if (lowerLayerItem) { + lowerLayerItem.draw( + (0.5 + staticComp.origin.x) * globalConfig.tileSize, + (0.5 + staticComp.origin.y) * globalConfig.tileSize, + parameters + ); + } + } + } + } + } +} diff --git a/src/js/game/systems/static_map_entity.js b/src/js/game/systems/static_map_entity.js new file mode 100644 index 00000000..5c57b492 --- /dev/null +++ b/src/js/game/systems/static_map_entity.js @@ -0,0 +1,72 @@ +import { GameSystem } from "../game_system"; +import { DrawParameters } from "../../core/draw_parameters"; +import { globalConfig } from "../../core/config"; +import { MapChunkView } from "../map_chunk_view"; +import { Loader } from "../../core/loader"; +import { enumDirection } from "../../core/vector"; + +export class StaticMapEntitySystem extends GameSystem { + constructor(root) { + super(root); + + this.beltOverviewSprites = { + [enumDirection.top]: Loader.getSprite("sprites/map_overview/belt_forward.png"), + [enumDirection.right]: Loader.getSprite("sprites/map_overview/belt_right.png"), + [enumDirection.left]: Loader.getSprite("sprites/map_overview/belt_left.png"), + }; + } + + /** + * Draws the static entities + * @param {DrawParameters} parameters + * @param {MapChunkView} chunk + */ + drawChunk(parameters, chunk) { + if (G_IS_DEV && globalConfig.debug.doNotRenderStatics) { + return; + } + + const drawOutlinesOnly = parameters.zoomLevel < globalConfig.mapChunkOverviewMinZoom; + + const contents = chunk.contents; + for (let y = 0; y < globalConfig.mapChunkSize; ++y) { + for (let x = 0; x < globalConfig.mapChunkSize; ++x) { + const entity = contents[x][y]; + + if (entity) { + const staticComp = entity.components.StaticMapEntity; + if (drawOutlinesOnly) { + const rect = staticComp.getTileSpaceBounds(); + parameters.context.fillStyle = staticComp.silhouetteColor || "#aaa"; + const beltComp = entity.components.Belt; + if (beltComp) { + const sprite = this.beltOverviewSprites[beltComp.direction]; + staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 0, false); + } else { + parameters.context.fillRect( + rect.x * globalConfig.tileSize, + rect.y * globalConfig.tileSize, + rect.w * globalConfig.tileSize, + rect.h * globalConfig.tileSize + ); + } + } else { + const spriteKey = staticComp.spriteKey; + if (spriteKey) { + // Check if origin is contained to avoid drawing entities multiple times + if ( + staticComp.origin.x >= chunk.tileX && + staticComp.origin.x < chunk.tileX + globalConfig.mapChunkSize && + staticComp.origin.y >= chunk.tileY && + staticComp.origin.y < chunk.tileY + globalConfig.mapChunkSize + ) { + const sprite = Loader.getSprite(spriteKey); + staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2, false); + } + } + } + } + } + } + } +} diff --git a/src/js/game/systems/underground_belt.js b/src/js/game/systems/underground_belt.js new file mode 100644 index 00000000..c8baec5b --- /dev/null +++ b/src/js/game/systems/underground_belt.js @@ -0,0 +1,129 @@ +import { GameSystemWithFilter } from "../game_system_with_filter"; +import { UndergroundBeltComponent, enumUndergroundBeltMode } from "../components/underground_belt"; +import { Entity } from "../entity"; +import { Loader } from "../../core/loader"; +import { Math_max } from "../../core/builtins"; +import { globalConfig } from "../../core/config"; +import { enumDirection, enumDirectionToVector, enumDirectionToAngle } from "../../core/vector"; +import { MapChunkView } from "../map_chunk_view"; +import { DrawParameters } from "../../core/draw_parameters"; + +export class UndergroundBeltSystem extends GameSystemWithFilter { + constructor(root) { + super(root, [UndergroundBeltComponent]); + + this.beltSprites = { + [enumUndergroundBeltMode.sender]: Loader.getSprite( + "sprites/buildings/underground_belt_entry.png" + ), + [enumUndergroundBeltMode.receiver]: Loader.getSprite( + "sprites/buildings/underground_belt_exit.png" + ), + }; + } + + update() { + for (let i = 0; i < this.allEntities.length; ++i) { + const entity = this.allEntities[i]; + + const undergroundComp = entity.components.UndergroundBelt; + + // Decrease remaining time of all items in belt + for (let k = 0; k < undergroundComp.pendingItems.length; ++k) { + const item = undergroundComp.pendingItems[k]; + item[1] = Math_max(0, item[1] - globalConfig.physicsDeltaSeconds); + } + + if (undergroundComp.mode === enumUndergroundBeltMode.sender) { + this.handleSender(entity); + } else { + this.handleReceiver(entity); + } + } + } + + /** + * + * @param {Entity} entity + */ + handleSender(entity) { + const staticComp = entity.components.StaticMapEntity; + const undergroundComp = entity.components.UndergroundBelt; + + // Check if we have any item + + if (undergroundComp.pendingItems.length > 0) { + const nextItemAndDuration = undergroundComp.pendingItems[0]; + const remainingTime = nextItemAndDuration[1]; + const nextItem = nextItemAndDuration[0]; + + if (remainingTime === 0) { + // Try to find a receiver + const searchDirection = staticComp.localDirectionToWorld(enumDirection.top); + const searchVector = enumDirectionToVector[searchDirection]; + const targetRotation = enumDirectionToAngle[searchDirection]; + + let currentTile = staticComp.origin; + + for ( + let searchOffset = 0; + searchOffset < globalConfig.undergroundBeltMaxTiles; + ++searchOffset + ) { + currentTile = currentTile.add(searchVector); + + const contents = this.root.map.getTileContent(currentTile); + if (contents) { + const receiverUndergroundComp = contents.components.UndergroundBelt; + if (receiverUndergroundComp) { + const receiverStaticComp = contents.components.StaticMapEntity; + if (receiverStaticComp.rotationDegrees === targetRotation) { + if (receiverUndergroundComp.mode === enumUndergroundBeltMode.receiver) { + // Try to pass over the item to the receiver + if ( + receiverUndergroundComp.tryAcceptTunneledItem( + nextItem, + searchOffset, + this.root.hubGoals.getUndergroundBeltBaseSpeed() + ) + ) { + undergroundComp.pendingItems = []; + } + } + + // When we hit some underground belt, always stop, no matter what + break; + } + } + } + } + } + } + } + + /** + * + * @param {Entity} entity + */ + handleReceiver(entity) { + const undergroundComp = entity.components.UndergroundBelt; + + // Try to eject items, we only check the first one cuz its sorted by remaining time + const items = undergroundComp.pendingItems; + if (items.length > 0) { + const nextItemAndDuration = undergroundComp.pendingItems[0]; + const remainingTime = nextItemAndDuration[1]; + const nextItem = nextItemAndDuration[0]; + + if (remainingTime <= 0) { + const ejectorComp = entity.components.ItemEjector; + const nextSlotIndex = ejectorComp.getFirstFreeSlot(); + if (nextSlotIndex !== null) { + if (ejectorComp.tryEject(nextSlotIndex, nextItem)) { + items.shift(); + } + } + } + } + } +} diff --git a/src/js/game/time/base_game_speed.js b/src/js/game/time/base_game_speed.js new file mode 100644 index 00000000..8898b6cf --- /dev/null +++ b/src/js/game/time/base_game_speed.js @@ -0,0 +1,55 @@ +/* typehints:start */ +import { GameRoot } from "../root"; +/* typehints:end */ + +import { BasicSerializableObject } from "../../savegame/serialization"; + +export class BaseGameSpeed extends BasicSerializableObject { + /** + * @param {GameRoot} root + */ + constructor(root) { + super(); + this.root = root; + this.initializeAfterDeserialize(root); + } + + /** @returns {string} */ + static getId() { + abstract; + return "unknown-speed"; + } + + getId() { + // @ts-ignore + return this.constructor.getId(); + } + + static getSchema() { + return {}; + } + + initializeAfterDeserialize(root) { + this.root = root; + } + + /** + * Returns the time multiplier + */ + getTimeMultiplier() { + return 1; + } + + /** + * Returns how many logic steps there may be queued + */ + getMaxLogicStepsInQueue() { + return 3; + } + + // Internals + /** @returns {BaseGameSpeed} */ + newSpeed(instance) { + return new instance(this.root); + } +} diff --git a/src/js/game/time/fast_forward_game_speed.js b/src/js/game/time/fast_forward_game_speed.js new file mode 100644 index 00000000..f2c23bec --- /dev/null +++ b/src/js/game/time/fast_forward_game_speed.js @@ -0,0 +1,16 @@ +import { BaseGameSpeed } from "./base_game_speed"; +import { globalConfig } from "../../core/config"; + +export class FastForwardGameSpeed extends BaseGameSpeed { + static getId() { + return "fast-forward"; + } + + getTimeMultiplier() { + return globalConfig.fastForwardSpeed; + } + + getMaxLogicStepsInQueue() { + return 3 * globalConfig.fastForwardSpeed; + } +} diff --git a/src/js/game/time/game_time.js b/src/js/game/time/game_time.js new file mode 100644 index 00000000..3fe48453 --- /dev/null +++ b/src/js/game/time/game_time.js @@ -0,0 +1,233 @@ +/* typehints:start */ +import { GameRoot } from "../root"; +/* typehints:end */ + +import { types, BasicSerializableObject } from "../../savegame/serialization"; +import { RegularGameSpeed } from "./regular_game_speed"; +import { BaseGameSpeed } from "./base_game_speed"; +import { PausedGameSpeed } from "./paused_game_speed"; +import { performanceNow } from "../../core/builtins"; +import { FastForwardGameSpeed } from "./fast_forward_game_speed"; +import { gGameSpeedRegistry } from "../../core/global_registries"; +import { globalConfig } from "../../core/config"; +import { checkTimerExpired, quantizeFloat } from "../../core/utils"; +import { createLogger } from "../../core/logging"; + +const logger = createLogger("game_time"); + +export class GameTime extends BasicSerializableObject { + /** + * @param {GameRoot} root + */ + constructor(root) { + super(); + this.root = root; + + // Current ingame time seconds, not incremented while paused + this.timeSeconds = 0; + + // Current "realtime", a timer which always is incremented no matter whether the game is paused or no + this.realtimeSeconds = 0; + + // The adjustment, used when loading savegames so we can continue where we were + this.realtimeAdjust = 0; + + /** @type {BaseGameSpeed} */ + this.speed = new RegularGameSpeed(this.root); + + // Store how much time we have in bucket + this.logicTimeBudget = 0; + + if (G_IS_DEV) { + window.addEventListener("keydown", ev => { + if (ev.key === "p") { + this.requestSpeedToggle(); + } + }); + } + } + + static getId() { + return "GameTime"; + } + + static getSchema() { + return { + timeSeconds: types.float, + speed: types.obj(gGameSpeedRegistry), + realtimeSeconds: types.float, + }; + } + + /** + * Fetches the new "real" time, called from the core once per frame, since performance now() is kinda slow + */ + updateRealtimeNow() { + this.realtimeSeconds = performanceNow() / 1000.0 + this.realtimeAdjust; + } + + /** + * Returns the ingame time in milliseconds + */ + getTimeMs() { + return this.timeSeconds * 1000.0; + } + + /** + * Safe check to check if a timer is expired. quantizes numbers + * @param {number} lastTick Last tick of the timer + * @param {number} tickRateSeconds Interval of the timer in seconds + */ + isIngameTimerExpired(lastTick, tickRateSeconds) { + return checkTimerExpired(this.timeSeconds, lastTick, tickRateSeconds); + } + + /** + * Returns how many seconds we are in the grace period + * @returns {number} + */ + getRemainingGracePeriodSeconds() { + return 0; + } + + /** + * Returns if we are currently in the grace period + * @returns {boolean} + */ + getIsWithinGracePeriod() { + return this.getRemainingGracePeriodSeconds() > 0; + } + + /** + * Internal method to generate new logic time budget + * @param {number} deltaMs + */ + înternalAddDeltaToBudget(deltaMs) { + // Only update if game is supposed to update + if (this.root.hud.shouldPauseGame()) { + this.logicTimeBudget = 0; + } else { + const multiplier = this.getSpeed().getTimeMultiplier(); + this.logicTimeBudget += deltaMs * multiplier; + } + + // Check for too big pile of updates -> reduce it to 1 + const maxLogicSteps = this.speed.getMaxLogicStepsInQueue(); + if (this.logicTimeBudget > globalConfig.physicsDeltaMs * maxLogicSteps) { + this.logicTimeBudget = globalConfig.physicsDeltaMs * maxLogicSteps; + } + } + + /** + * Performs update ticks based on the queued logic budget + * @param {number} deltaMs + * @param {function():boolean} updateMethod + */ + performTicks(deltaMs, updateMethod) { + this.înternalAddDeltaToBudget(deltaMs); + + const speedAtStart = this.root.time.getSpeed(); + + // Update physics & logic + while (this.logicTimeBudget >= globalConfig.physicsDeltaMs) { + this.logicTimeBudget -= globalConfig.physicsDeltaMs; + + if (!updateMethod()) { + // Gameover happened or so, do not update anymore + return; + } + + // Step game time + this.timeSeconds = quantizeFloat(this.timeSeconds + globalConfig.physicsDeltaSeconds); + + // Game time speed changed, need to abort since our logic steps are no longer valid + if (speedAtStart.getId() !== this.speed.getId()) { + logger.warn( + "Skipping update because speed changed from", + speedAtStart.getId(), + "to", + this.speed.getId() + ); + break; + } + + // If we queued async tasks, perform them next frame and do not update anymore + if (this.root.hud.parts.processingOverlay.hasTasks()) { + break; + } + } + } + + /** + * Returns ingame time in seconds + * @returns {number} seconds + */ + now() { + return this.timeSeconds; + } + + /** + * Returns "real" time in seconds + * @returns {number} seconds + */ + realtimeNow() { + return this.realtimeSeconds; + } + + /** + * Returns "real" time in seconds + * @returns {number} seconds + */ + systemNow() { + return (this.realtimeSeconds - this.realtimeAdjust) * 1000.0; + } + + getIsPaused() { + return this.speed.getId() === PausedGameSpeed.getId(); + } + + requestSpeedToggle() { + logger.warn("Request speed toggle"); + switch (this.speed.getId()) { + case PausedGameSpeed.getId(): + this.setSpeed(new RegularGameSpeed(this.root)); + break; + + case RegularGameSpeed.getId(): + this.setSpeed(new PausedGameSpeed(this.root)); + break; + + case FastForwardGameSpeed.getId(): + this.setSpeed(new RegularGameSpeed(this.root)); + break; + } + } + + getSpeed() { + return this.speed; + } + + setSpeed(speed) { + assert(speed instanceof BaseGameSpeed, "Not a valid game speed"); + if (this.speed.getId() === speed.getId()) { + logger.warn("Same speed set than current one:", speed.constructor.getId()); + } + this.speed = speed; + } + + deserialize(data) { + const errorCode = super.deserialize(data); + if (errorCode) { + return errorCode; + } + + // Adjust realtime now difference so they match + this.realtimeAdjust = this.realtimeSeconds - performanceNow() / 1000.0; + this.updateRealtimeNow(); + + // Make sure we have a quantizied time + this.timeSeconds = quantizeFloat(this.timeSeconds); + + this.speed.initializeAfterDeserialize(this.root); + } +} diff --git a/src/js/game/time/paused_game_speed.js b/src/js/game/time/paused_game_speed.js new file mode 100644 index 00000000..6d841b92 --- /dev/null +++ b/src/js/game/time/paused_game_speed.js @@ -0,0 +1,15 @@ +import { BaseGameSpeed } from "./base_game_speed"; + +export class PausedGameSpeed extends BaseGameSpeed { + static getId() { + return "paused"; + } + + getTimeMultiplier() { + return 0; + } + + getMaxLogicStepsInQueue() { + return 0; + } +} diff --git a/src/js/game/time/regular_game_speed.js b/src/js/game/time/regular_game_speed.js new file mode 100644 index 00000000..ffee6998 --- /dev/null +++ b/src/js/game/time/regular_game_speed.js @@ -0,0 +1,11 @@ +import { BaseGameSpeed } from "./base_game_speed"; + +export class RegularGameSpeed extends BaseGameSpeed { + static getId() { + return "regular"; + } + + getTimeMultiplier() { + return 1; + } +} diff --git a/src/js/game/tutorial_goals.js b/src/js/game/tutorial_goals.js new file mode 100644 index 00000000..7532e090 --- /dev/null +++ b/src/js/game/tutorial_goals.js @@ -0,0 +1,163 @@ +import { enumSubShape, ShapeDefinition, createSimpleShape } from "./shape_definition"; +import { enumColors } from "./colors"; + +/** + * @enum {string} + */ +export const enumHubGoalRewards = { + reward_cutter_and_trash: "Cutting Shapes", + reward_rotater: "Rotating", + reward_painter: "Painting", + reward_mixer: "Color Mixing", + reward_stacker: "Combiner", + reward_splitter: "Splitter/Merger", + reward_tunnel: "Tunnel", + + no_reward: "Next level", +}; + +export const tutorialGoals = [ + // Circle + { + shape: "CuCuCuCu", + required: 40, + reward: enumHubGoalRewards.reward_cutter_and_trash, + }, + + // Cutter + { + shape: "CuCu----", + required: 150, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "----CuCu", + required: 200, + reward: enumHubGoalRewards.reward_splitter, + }, + + // Rectangle + { + shape: "RuRuRuRu", + required: 80, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "RuRu----", + required: 250, + reward: enumHubGoalRewards.reward_rotater, + }, + + // Rotater + { + shape: "--CuCu--", + required: 300, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "Ru----Ru", + required: 400, + reward: enumHubGoalRewards.reward_tunnel, + }, + + { + shape: "Cu------", + required: 800, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "------Ru", + required: 1000, + reward: enumHubGoalRewards.reward_painter, + }, + + // Painter + { + shape: "CrCrCrCr", + required: 1500, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "RbRb----", + required: 2500, + reward: enumHubGoalRewards.reward_mixer, + }, + + // Mixing (purple) + { + shape: "CpCpCpCp", + required: 4000, + reward: enumHubGoalRewards.no_reward, + }, + + // Star shape + cyan + { + shape: "ScScScSc", + required: 500, + reward: enumHubGoalRewards.reward_stacker, + }, + + // Stacker + { + shape: "CcCcRgRg", + required: 3000, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "RgRgRgRg:CcCcCcCc", + required: 4000, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "CgCgRgRg", + required: 6000, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "CwSwCwSw", + required: 6000, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "WyWyWyWy", + required: 2000, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "WyWgWyWg:CbCpCbCp", + required: 4000, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "WyRgWyCg:CbCpCbCp:CwCwCwCw", + required: 9000, + reward: enumHubGoalRewards.no_reward, + }, + + { + shape: "CwRrWbSp:WcWrCpCw", + required: 15000, + reward: enumHubGoalRewards.no_reward, + }, +]; + +if (G_IS_DEV) { + tutorialGoals.forEach(({ shape, required, reward }) => { + try { + ShapeDefinition.fromShortKey(shape); + } catch (ex) { + throw new Error("Invalid tutorial goal: '" + ex + "' for shape" + shape); + } + }); +} diff --git a/src/js/game/upgrades.js b/src/js/game/upgrades.js new file mode 100644 index 00000000..7dd9e8df --- /dev/null +++ b/src/js/game/upgrades.js @@ -0,0 +1,326 @@ +import { createSimpleShape, enumSubShape, ShapeDefinition } from "./shape_definition"; +import { enumColors } from "./colors"; +import { findNiceIntegerValue } from "../core/utils"; +import { globalConfig } from "../core/config"; + +export const TIER_LABELS = [ + "I", + "II", + "III", + "IV", + "V", + "VI", + "VII", + "VIII", + "IX", + "X", + "XI", + "XII", + "XIII", + "XIV", + "XV", + "XVI", + "XVII", + "XVIII", + "XIX", + "XX", +]; + +export const UPGRADES = { + belt: { + label: "Belts, Distributer & Tunnels", + description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + tiers: [ + { + required: [{ shape: "CuCuCuCu", amount: 80 }], + improvement: 1, + }, + { + required: [{ shape: "Ru----Ru", amount: 4000 }], + improvement: 2, + }, + { + required: [{ shape: "CwSwCwSw", amount: 30000 }], + improvement: 4, + }, + { + required: [{ shape: "RgRgSpSp:CwSwCwSw:Cr--Sw--", amount: 80000 }], + improvement: 8, + }, + ], + }, + + miner: { + label: "Extraction", + description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + tiers: [ + { + required: [{ shape: "RuRuRuRu", amount: 200 }], + improvement: 1, + }, + { + required: [{ shape: "Cu------", amount: 4000 }], + improvement: 2, + }, + { + required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }], + improvement: 4, + }, + { + required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }], + improvement: 8, + }, + ], + }, + + processors: { + label: "Shape Processing", + description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + tiers: [ + { + required: [{ shape: "RuRuRuRu", amount: 200 }], + improvement: 1, + }, + { + required: [{ shape: "Cu------", amount: 4000 }], + improvement: 2, + }, + { + required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }], + improvement: 4, + }, + { + required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }], + improvement: 8, + }, + ], + }, + + painting: { + label: "Mixing & Painting", + description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + tiers: [ + { + required: [{ shape: "RuRuRuRu", amount: 200 }], + improvement: 1, + }, + { + required: [{ shape: "Cu------", amount: 4000 }], + improvement: 2, + }, + { + required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }], + improvement: 4, + }, + { + required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }], + improvement: 8, + }, + ], + }, + + // cutter: { + // label: "Cut Half", + // description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + // tiers: [ + // { + // required: [{ shape: "----CuCu", amount: 450 }], + // improvement: 1, + // }, + // { + // required: [{ shape: "CpCpCpCp", amount: 12000 }], + // improvement: 2, + // }, + // { + // required: [{ shape: "CwRrWbSp:WcWrCpCw", amount: 45000 }], + // improvement: 4, + // }, + // { + // required: [{ shape: "CwRrWbSp:WcWrCpCw:WpWpWb--", amount: 100000 }], + // improvement: 8, + // }, + // ], + // }, + // splitter: { + // label: "Distribute", + // description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + // tiers: [ + // { + // required: [{ shape: "CuCu----", amount: 350 }], + // improvement: 1, + // }, + // { + // required: [{ shape: "CrCrCrCr", amount: 7000 }], + // improvement: 2, + // }, + // { + // required: [{ shape: "WyWyWyWy", amount: 30000 }], + // improvement: 4, + // }, + // { + // required: [{ shape: "WyWyWyWy:CwSpRgRc", amount: 100000 }], + // improvement: 8, + // }, + // ], + // }, + + // rotater: { + // label: "Rotate", + // description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + // tiers: [ + // { + // required: [{ shape: "RuRu----", amount: 750 }], + // improvement: 1, + // }, + // { + // required: [{ shape: "ScScScSc", amount: 3000 }], + // improvement: 2, + // }, + // { + // required: [{ shape: "ScSpRwRw:Cw----Cw", amount: 15000 }], + // improvement: 4, + // }, + // { + // required: [{ shape: "ScSpRwRw:Cw----Cw:CpCpCpCp", amount: 80000 }], + // improvement: 8, + // }, + // ], + // }, + + // underground_belt: { + // label: "Tunnel", + // description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + // tiers: [ + // { + // required: [{ shape: "--CuCu--", amount: 1000 }], + // improvement: 1, + // }, + // { + // required: [{ shape: "RbRb----", amount: 9000 }], + // improvement: 2, + // }, + // { + // required: [{ shape: "RbRb----:WpWpWpWp", amount: 25000 }], + // improvement: 4, + // }, + // { + // required: [{ shape: "RbRb----:WpWpWpWp:RwRwRpRp", amount: 100000 }], + // improvement: 8, + // }, + // ], + // }, + + // painter: { + // label: "Dye", + // description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + // tiers: [ + // { + // required: [{ shape: "------Ru", amount: 4000 }], + // improvement: 1, + // }, + // { + // required: [{ shape: "CcCcRgRg", amount: 15000 }], + // improvement: 2, + // }, + // { + // required: [{ shape: "CcCcRgRg:WgWgWgWg", amount: 35000 }], + // improvement: 4, + // }, + // { + // required: [{ shape: "CcCcRgRg:WgWgWgWg:CpRpCpRp", amount: 100000 }], + // improvement: 8, + // }, + // ], + // }, + + // mixer: { + // label: "Mix Colors", + // description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + // tiers: [ + // { + // required: [{ shape: "RgRgRgRg:CcCcCcCc", amount: 11000 }], + // improvement: 1, + // }, + // { + // required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 15000 }], + // improvement: 2, + // }, + // { + // required: [{ shape: "CcCcRgRg:WgWgWgWg:CpRpCpRp", amount: 45000 }], + // improvement: 4, + // }, + // { + // required: [{ shape: "CcCcRgRg:WgWgWgWg:CpRpCpRp:CpCpCpCp", amount: 100000 }], + // improvement: 8, + // }, + // ], + // }, + // stacker: { + // label: "Combine", + // description: improvement => "Speed +" + Math.floor(improvement * 100.0) + "%", + // tiers: [ + // { + // required: [{ shape: "CgCgRgRg", amount: 20000 }], + // improvement: 1, + // }, + // { + // required: [{ shape: "CgCgRgRg:WpRpWpRp", amount: 50000 }], + // improvement: 2, + // }, + // { + // required: [{ shape: "CgCgRgRg:WpRpWpRp:SpSwSpSw", amount: 70000 }], + // improvement: 4, + // }, + // { + // required: [{ shape: "CgCgRgRg:WpRpWpRp:SpSwSpSw:CwCwCwCw", amount: 100000 }], + // improvement: 8, + // }, + // ], + // }, +}; + +// Tiers need % of the previous tier as requirement too +const tierGrowth = 2; + +// Automatically generate tier levels +for (const upgradeId in UPGRADES) { + const upgrade = UPGRADES[upgradeId]; + + let currentTierRequirements = []; + for (let i = 0; i < upgrade.tiers.length; ++i) { + const tierHandle = upgrade.tiers[i]; + const originalRequired = tierHandle.required.slice(); + + for (let k = currentTierRequirements.length - 1; k >= 0; --k) { + const oldTierRequirement = currentTierRequirements[k]; + tierHandle.required.unshift({ + shape: oldTierRequirement.shape, + amount: oldTierRequirement.amount, + }); + } + currentTierRequirements.push( + ...originalRequired.map(req => ({ + amount: req.amount, + shape: req.shape, + })) + ); + currentTierRequirements.forEach(tier => { + tier.amount = findNiceIntegerValue(tier.amount * tierGrowth); + }); + } +} + +if (G_IS_DEV) { + for (const upgradeId in UPGRADES) { + const upgrade = UPGRADES[upgradeId]; + upgrade.tiers.forEach(tier => { + tier.required.forEach(({ shape }) => { + try { + ShapeDefinition.fromShortKey(shape); + } catch (ex) { + throw new Error("Invalid upgrade goal: '" + ex + "' for shape" + shape); + } + }); + }); + } +} diff --git a/src/js/game_analytics.d.ts b/src/js/game_analytics.d.ts new file mode 100644 index 00000000..3324213e --- /dev/null +++ b/src/js/game_analytics.d.ts @@ -0,0 +1,737 @@ +declare module gameanalytics { + enum EGAErrorSeverity { + Undefined = 0, + Debug = 1, + Info = 2, + Warning = 3, + Error = 4, + Critical = 5, + } + enum EGAProgressionStatus { + Undefined = 0, + Start = 1, + Complete = 2, + Fail = 3, + } + enum EGAResourceFlowType { + Undefined = 0, + Source = 1, + Sink = 2, + } + module http { + enum EGAHTTPApiResponse { + NoResponse = 0, + BadResponse = 1, + RequestTimeout = 2, + JsonEncodeFailed = 3, + JsonDecodeFailed = 4, + InternalServerError = 5, + BadRequest = 6, + Unauthorized = 7, + UnknownResponseCode = 8, + Ok = 9, + Created = 10, + } + } + module events { + enum EGASdkErrorCategory { + Undefined = 0, + EventValidation = 1, + Database = 2, + Init = 3, + Http = 4, + Json = 5, + } + enum EGASdkErrorArea { + Undefined = 0, + BusinessEvent = 1, + ResourceEvent = 2, + ProgressionEvent = 3, + DesignEvent = 4, + ErrorEvent = 5, + InitHttp = 9, + EventsHttp = 10, + ProcessEvents = 11, + AddEventsToStore = 12, + } + enum EGASdkErrorAction { + Undefined = 0, + InvalidCurrency = 1, + InvalidShortString = 2, + InvalidEventPartLength = 3, + InvalidEventPartCharacters = 4, + InvalidStore = 5, + InvalidFlowType = 6, + StringEmptyOrNull = 7, + NotFoundInAvailableCurrencies = 8, + InvalidAmount = 9, + NotFoundInAvailableItemTypes = 10, + WrongProgressionOrder = 11, + InvalidEventIdLength = 12, + InvalidEventIdCharacters = 13, + InvalidProgressionStatus = 15, + InvalidSeverity = 16, + InvalidLongString = 17, + DatabaseTooLarge = 18, + DatabaseOpenOrCreate = 19, + JsonError = 25, + FailHttpJsonDecode = 29, + FailHttpJsonEncode = 30, + } + enum EGASdkErrorParameter { + Undefined = 0, + Currency = 1, + CartType = 2, + ItemType = 3, + ItemId = 4, + Store = 5, + FlowType = 6, + Amount = 7, + Progression01 = 8, + Progression02 = 9, + Progression03 = 10, + EventId = 11, + ProgressionStatus = 12, + Severity = 13, + Message = 14, + } + } +} +export declare var EGAErrorSeverity: typeof gameanalytics.EGAErrorSeverity; +export declare var EGAProgressionStatus: typeof gameanalytics.EGAProgressionStatus; +export declare var EGAResourceFlowType: typeof gameanalytics.EGAResourceFlowType; +declare module gameanalytics { + module logging { + class GALogger { + private static readonly instance; + private infoLogEnabled; + private infoLogVerboseEnabled; + private static debugEnabled; + private static readonly Tag; + private constructor(); + static setInfoLog(value: boolean): void; + static setVerboseLog(value: boolean): void; + static i(format: string): void; + static w(format: string): void; + static e(format: string): void; + static ii(format: string): void; + static d(format: string): void; + private sendNotificationMessage; + } + } +} +declare module gameanalytics { + module utilities { + class GAUtilities { + static getHmac(key: string, data: string): string; + static stringMatch(s: string, pattern: RegExp): boolean; + static joinStringArray(v: Array, delimiter: string): string; + static stringArrayContainsString(array: Array, search: string): boolean; + private static readonly keyStr; + static encode64(input: string): string; + static decode64(input: string): string; + static timeIntervalSince1970(): number; + static createGuid(): string; + private static s4; + } + } +} +declare module gameanalytics { + module validators { + import EGASdkErrorCategory = gameanalytics.events.EGASdkErrorCategory; + import EGASdkErrorArea = gameanalytics.events.EGASdkErrorArea; + import EGASdkErrorAction = gameanalytics.events.EGASdkErrorAction; + import EGASdkErrorParameter = gameanalytics.events.EGASdkErrorParameter; + class ValidationResult { + category: EGASdkErrorCategory; + area: EGASdkErrorArea; + action: EGASdkErrorAction; + parameter: EGASdkErrorParameter; + reason: string; + constructor( + category: EGASdkErrorCategory, + area: EGASdkErrorArea, + action: EGASdkErrorAction, + parameter: EGASdkErrorParameter, + reason: string + ); + } + class GAValidator { + static validateBusinessEvent( + currency: string, + amount: number, + cartType: string, + itemType: string, + itemId: string + ): ValidationResult; + static validateResourceEvent( + flowType: EGAResourceFlowType, + currency: string, + amount: number, + itemType: string, + itemId: string, + availableCurrencies: Array, + availableItemTypes: Array + ): ValidationResult; + static validateProgressionEvent( + progressionStatus: EGAProgressionStatus, + progression01: string, + progression02: string, + progression03: string + ): ValidationResult; + static validateDesignEvent(eventId: string): ValidationResult; + static validateErrorEvent(severity: EGAErrorSeverity, message: string): ValidationResult; + static validateSdkErrorEvent( + gameKey: string, + gameSecret: string, + category: EGASdkErrorCategory, + area: EGASdkErrorArea, + action: EGASdkErrorAction + ): boolean; + static validateKeys(gameKey: string, gameSecret: string): boolean; + static validateCurrency(currency: string): boolean; + static validateEventPartLength(eventPart: string, allowNull: boolean): boolean; + static validateEventPartCharacters(eventPart: string): boolean; + static validateEventIdLength(eventId: string): boolean; + static validateEventIdCharacters(eventId: string): boolean; + static validateAndCleanInitRequestResponse( + initResponse: { + [key: string]: any; + }, + configsCreated: boolean + ): { + [key: string]: any; + }; + static validateBuild(build: string): boolean; + static validateSdkWrapperVersion(wrapperVersion: string): boolean; + static validateEngineVersion(engineVersion: string): boolean; + static validateUserId(uId: string): boolean; + static validateShortString(shortString: string, canBeEmpty: boolean): boolean; + static validateString(s: string, canBeEmpty: boolean): boolean; + static validateLongString(longString: string, canBeEmpty: boolean): boolean; + static validateConnectionType(connectionType: string): boolean; + static validateCustomDimensions(customDimensions: Array): boolean; + static validateResourceCurrencies(resourceCurrencies: Array): boolean; + static validateResourceItemTypes(resourceItemTypes: Array): boolean; + static validateDimension01(dimension01: string, availableDimensions: Array): boolean; + static validateDimension02(dimension02: string, availableDimensions: Array): boolean; + static validateDimension03(dimension03: string, availableDimensions: Array): boolean; + static validateArrayOfStrings( + maxCount: number, + maxStringLength: number, + allowNoValues: boolean, + logTag: string, + arrayOfStrings: Array + ): boolean; + static validateClientTs(clientTs: number): boolean; + } + } +} +declare module gameanalytics { + module device { + class NameValueVersion { + name: string; + value: string; + version: string; + constructor(name: string, value: string, version: string); + } + class NameVersion { + name: string; + version: string; + constructor(name: string, version: string); + } + class GADevice { + private static readonly sdkWrapperVersion; + private static readonly osVersionPair; + static readonly buildPlatform: string; + static readonly deviceModel: string; + static readonly deviceManufacturer: string; + static readonly osVersion: string; + static readonly browserVersion: string; + static sdkGameEngineVersion: string; + static gameEngineVersion: string; + private static connectionType; + static touch(): void; + static getRelevantSdkVersion(): string; + static getConnectionType(): string; + static updateConnectionType(): void; + private static getOSVersionString; + private static runtimePlatformToString; + private static getBrowserVersionString; + private static getDeviceModel; + private static getDeviceManufacturer; + private static matchItem; + } + } +} +declare module gameanalytics { + module threading { + class TimedBlock { + readonly deadline: Date; + block: () => void; + readonly id: number; + ignore: boolean; + async: boolean; + running: boolean; + private static idCounter; + constructor(deadline: Date); + } + } +} +declare module gameanalytics { + module threading { + interface IComparer { + compare(x: T, y: T): number; + } + class PriorityQueue { + _subQueues: { + [key: number]: Array; + }; + _sortedKeys: Array; + private comparer; + constructor(priorityComparer: IComparer); + enqueue(priority: number, item: TItem): void; + private addQueueOfPriority; + peek(): TItem; + hasItems(): boolean; + dequeue(): TItem; + private dequeueFromHighPriorityQueue; + } + } +} +declare module gameanalytics { + module store { + enum EGAStoreArgsOperator { + Equal = 0, + LessOrEqual = 1, + NotEqual = 2, + } + enum EGAStore { + Events = 0, + Sessions = 1, + Progression = 2, + } + class GAStore { + private static readonly instance; + private static storageAvailable; + private static readonly MaxNumberOfEntries; + private eventsStore; + private sessionsStore; + private progressionStore; + private storeItems; + private static readonly StringFormat; + private static readonly KeyFormat; + private static readonly EventsStoreKey; + private static readonly SessionsStoreKey; + private static readonly ProgressionStoreKey; + private static readonly ItemsStoreKey; + private constructor(); + static isStorageAvailable(): boolean; + static isStoreTooLargeForEvents(): boolean; + static select( + store: EGAStore, + args?: Array<[string, EGAStoreArgsOperator, any]>, + sort?: boolean, + maxCount?: number + ): Array<{ + [key: string]: any; + }>; + static update( + store: EGAStore, + setArgs: Array<[string, any]>, + whereArgs?: Array<[string, EGAStoreArgsOperator, any]> + ): boolean; + static delete(store: EGAStore, args: Array<[string, EGAStoreArgsOperator, any]>): void; + static insert( + store: EGAStore, + newEntry: { + [key: string]: any; + }, + replace?: boolean, + replaceKey?: string + ): void; + static save(gameKey: string): void; + static load(gameKey: string): void; + static setItem(gameKey: string, key: string, value: string): void; + static getItem(gameKey: string, key: string): string; + private static getStore; + } + } +} +declare module gameanalytics { + module state { + class GAState { + private static readonly CategorySdkError; + private static readonly MAX_CUSTOM_FIELDS_COUNT; + private static readonly MAX_CUSTOM_FIELDS_KEY_LENGTH; + private static readonly MAX_CUSTOM_FIELDS_VALUE_STRING_LENGTH; + static readonly instance: GAState; + private constructor(); + private userId; + static setUserId(userId: string): void; + private identifier; + static getIdentifier(): string; + private initialized; + static isInitialized(): boolean; + static setInitialized(value: boolean): void; + sessionStart: number; + static getSessionStart(): number; + private sessionNum; + static getSessionNum(): number; + private transactionNum; + static getTransactionNum(): number; + sessionId: string; + static getSessionId(): string; + private currentCustomDimension01; + static getCurrentCustomDimension01(): string; + private currentCustomDimension02; + static getCurrentCustomDimension02(): string; + private currentCustomDimension03; + static getCurrentCustomDimension03(): string; + private gameKey; + static getGameKey(): string; + private gameSecret; + static getGameSecret(): string; + private availableCustomDimensions01; + static getAvailableCustomDimensions01(): Array; + static setAvailableCustomDimensions01(value: Array): void; + private availableCustomDimensions02; + static getAvailableCustomDimensions02(): Array; + static setAvailableCustomDimensions02(value: Array): void; + private availableCustomDimensions03; + static getAvailableCustomDimensions03(): Array; + static setAvailableCustomDimensions03(value: Array): void; + private availableResourceCurrencies; + static getAvailableResourceCurrencies(): Array; + static setAvailableResourceCurrencies(value: Array): void; + private availableResourceItemTypes; + static getAvailableResourceItemTypes(): Array; + static setAvailableResourceItemTypes(value: Array): void; + private build; + static getBuild(): string; + static setBuild(value: string): void; + private useManualSessionHandling; + static getUseManualSessionHandling(): boolean; + private _isEventSubmissionEnabled; + static isEventSubmissionEnabled(): boolean; + sdkConfigCached: { + [key: string]: any; + }; + private configurations; + private remoteConfigsIsReady; + private remoteConfigsListeners; + initAuthorized: boolean; + clientServerTimeOffset: number; + configsHash: string; + abId: string; + static getABTestingId(): string; + abVariantId: string; + static getABTestingVariantId(): string; + private defaultUserId; + private setDefaultId; + static getDefaultId(): string; + sdkConfigDefault: { + [key: string]: string; + }; + sdkConfig: { + [key: string]: any; + }; + static getSdkConfig(): { + [key: string]: any; + }; + private progressionTries; + static readonly DefaultUserIdKey: string; + static readonly SessionNumKey: string; + static readonly TransactionNumKey: string; + private static readonly Dimension01Key; + private static readonly Dimension02Key; + private static readonly Dimension03Key; + static readonly SdkConfigCachedKey: string; + static isEnabled(): boolean; + static setCustomDimension01(dimension: string): void; + static setCustomDimension02(dimension: string): void; + static setCustomDimension03(dimension: string): void; + static incrementSessionNum(): void; + static incrementTransactionNum(): void; + static incrementProgressionTries(progression: string): void; + static getProgressionTries(progression: string): number; + static clearProgressionTries(progression: string): void; + static setKeys(gameKey: string, gameSecret: string): void; + static setManualSessionHandling(flag: boolean): void; + static setEnabledEventSubmission(flag: boolean): void; + static getEventAnnotations(): { + [key: string]: any; + }; + static getSdkErrorEventAnnotations(): { + [key: string]: any; + }; + static getInitAnnotations(): { + [key: string]: any; + }; + static getClientTsAdjusted(): number; + static sessionIsStarted(): boolean; + private static cacheIdentifier; + static ensurePersistedStates(): void; + static calculateServerTimeOffset(serverTs: number): number; + static validateAndCleanCustomFields(fields: { + [id: string]: any; + }): { + [id: string]: any; + }; + static validateAndFixCurrentDimensions(): void; + static getConfigurationStringValue(key: string, defaultValue: string): string; + static isRemoteConfigsReady(): boolean; + static addRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void; + static removeRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void; + static getRemoteConfigsContentAsString(): string; + static populateConfigurations(sdkConfig: { [key: string]: any }): void; + } + } +} +declare module gameanalytics { + module tasks { + class SdkErrorTask { + private static readonly MaxCount; + private static readonly countMap; + private static readonly timestampMap; + static execute(url: string, type: string, payloadData: string, secretKey: string): void; + } + } +} +declare module gameanalytics { + module http { + import EGASdkErrorCategory = gameanalytics.events.EGASdkErrorCategory; + import EGASdkErrorArea = gameanalytics.events.EGASdkErrorArea; + import EGASdkErrorAction = gameanalytics.events.EGASdkErrorAction; + import EGASdkErrorParameter = gameanalytics.events.EGASdkErrorParameter; + class GAHTTPApi { + static readonly instance: GAHTTPApi; + private protocol; + private hostName; + private version; + private remoteConfigsVersion; + private baseUrl; + private remoteConfigsBaseUrl; + private initializeUrlPath; + private eventsUrlPath; + private useGzip; + private static readonly MAX_ERROR_MESSAGE_LENGTH; + private constructor(); + requestInit( + configsHash: string, + callback: ( + response: EGAHTTPApiResponse, + json: { + [key: string]: any; + } + ) => void + ): void; + sendEventsInArray( + eventArray: Array<{ + [key: string]: any; + }>, + requestId: string, + callback: ( + response: EGAHTTPApiResponse, + json: { + [key: string]: any; + }, + requestId: string, + eventCount: number + ) => void + ): void; + sendSdkErrorEvent( + category: EGASdkErrorCategory, + area: EGASdkErrorArea, + action: EGASdkErrorAction, + parameter: EGASdkErrorParameter, + reason: string, + gameKey: string, + secretKey: string + ): void; + private static sendEventInArrayRequestCallback; + private static sendRequest; + private static initRequestCallback; + private createPayloadData; + private processRequestResponse; + private static sdkErrorCategoryString; + private static sdkErrorAreaString; + private static sdkErrorActionString; + private static sdkErrorParameterString; + } + } +} +declare module gameanalytics { + module events { + class GAEvents { + private static readonly CategorySessionStart; + private static readonly CategorySessionEnd; + private static readonly CategoryDesign; + private static readonly CategoryBusiness; + private static readonly CategoryProgression; + private static readonly CategoryResource; + private static readonly CategoryError; + private static readonly MaxEventCount; + private constructor(); + static addSessionStartEvent(): void; + static addSessionEndEvent(): void; + static addBusinessEvent( + currency: string, + amount: number, + itemType: string, + itemId: string, + cartType: string, + fields: { + [id: string]: any; + } + ): void; + static addResourceEvent( + flowType: EGAResourceFlowType, + currency: string, + amount: number, + itemType: string, + itemId: string, + fields: { + [id: string]: any; + } + ): void; + static addProgressionEvent( + progressionStatus: EGAProgressionStatus, + progression01: string, + progression02: string, + progression03: string, + score: number, + sendScore: boolean, + fields: { + [id: string]: any; + } + ): void; + static addDesignEvent( + eventId: string, + value: number, + sendValue: boolean, + fields: { + [id: string]: any; + } + ): void; + static addErrorEvent( + severity: EGAErrorSeverity, + message: string, + fields: { + [id: string]: any; + } + ): void; + static processEvents(category: string, performCleanUp: boolean): void; + private static processEventsCallback; + private static cleanupEvents; + private static fixMissingSessionEndEvents; + private static addEventToStore; + private static updateSessionStore; + private static addDimensionsToEvent; + private static addFieldsToEvent; + private static resourceFlowTypeToString; + private static progressionStatusToString; + private static errorSeverityToString; + } + } +} +declare module gameanalytics { + module threading { + class GAThreading { + private static readonly instance; + readonly blocks: PriorityQueue; + private readonly id2TimedBlockMap; + private static runTimeoutId; + private static readonly ThreadWaitTimeInMs; + private static ProcessEventsIntervalInSeconds; + private keepRunning; + private isRunning; + private constructor(); + static createTimedBlock(delayInSeconds?: number): TimedBlock; + static performTaskOnGAThread(taskBlock: () => void, delayInSeconds?: number): void; + static performTimedBlockOnGAThread(timedBlock: TimedBlock): void; + static scheduleTimer(interval: number, callback: () => void): number; + static getTimedBlockById(blockIdentifier: number): TimedBlock; + static ensureEventQueueIsRunning(): void; + static endSessionAndStopQueue(): void; + static stopEventQueue(): void; + static ignoreTimer(blockIdentifier: number): void; + static setEventProcessInterval(interval: number): void; + private addTimedBlock; + private static run; + private static startThread; + private static getNextBlock; + private static processEventQueue; + } + } +} +declare module gameanalytics { + class GameAnalytics { + private static initTimedBlockId; + static methodMap: { + [id: string]: (...args: any[]) => void; + }; + static init(): void; + static gaCommand(...args: any[]): void; + static configureAvailableCustomDimensions01(customDimensions?: Array): void; + static configureAvailableCustomDimensions02(customDimensions?: Array): void; + static configureAvailableCustomDimensions03(customDimensions?: Array): void; + static configureAvailableResourceCurrencies(resourceCurrencies?: Array): void; + static configureAvailableResourceItemTypes(resourceItemTypes?: Array): void; + static configureBuild(build?: string): void; + static configureSdkGameEngineVersion(sdkGameEngineVersion?: string): void; + static configureGameEngineVersion(gameEngineVersion?: string): void; + static configureUserId(uId?: string): void; + static initialize(gameKey?: string, gameSecret?: string): void; + static addBusinessEvent( + currency?: string, + amount?: number, + itemType?: string, + itemId?: string, + cartType?: string + ): void; + static addResourceEvent( + flowType?: EGAResourceFlowType, + currency?: string, + amount?: number, + itemType?: string, + itemId?: string + ): void; + static addProgressionEvent( + progressionStatus?: EGAProgressionStatus, + progression01?: string, + progression02?: string, + progression03?: string, + score?: any + ): void; + static addDesignEvent(eventId: string, value?: any): void; + static addErrorEvent(severity?: EGAErrorSeverity, message?: string): void; + static setEnabledInfoLog(flag?: boolean): void; + static setEnabledVerboseLog(flag?: boolean): void; + static setEnabledManualSessionHandling(flag?: boolean): void; + static setEnabledEventSubmission(flag?: boolean): void; + static setCustomDimension01(dimension?: string): void; + static setCustomDimension02(dimension?: string): void; + static setCustomDimension03(dimension?: string): void; + static setEventProcessInterval(intervalInSeconds: number): void; + static startSession(): void; + static endSession(): void; + static onStop(): void; + static onResume(): void; + static getRemoteConfigsValueAsString(key: string, defaultValue?: string): string; + static isRemoteConfigsReady(): boolean; + static addRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void; + static removeRemoteConfigsListener(listener: { onRemoteConfigsUpdated: () => void }): void; + static getRemoteConfigsContentAsString(): string; + static getABTestingId(): string; + static getABTestingVariantId(): string; + private static internalInitialize; + private static newSession; + private static startNewSessionCallback; + private static resumeSessionAndStartQueue; + private static isSdkReady; + } +} +declare var GameAnalyticsCommand: typeof gameanalytics.GameAnalytics.gaCommand; +export declare var GameAnalytics: typeof gameanalytics.GameAnalytics; +export default GameAnalytics; diff --git a/src/js/globals.d.ts b/src/js/globals.d.ts new file mode 100644 index 00000000..5a17daa8 --- /dev/null +++ b/src/js/globals.d.ts @@ -0,0 +1,191 @@ +// Globals defined by webpack + +declare const G_IS_DEV: boolean; +declare const G_IS_PROD: boolean; +declare function assert(condition: boolean | object | string, ...errorMessage: string[]): void; +declare function assertAlways(condition: boolean | object | string, ...errorMessage: string[]): void; + +declare const abstract: void; + +declare const G_API_ENDPOINT: string; +declare const G_APP_ENVIRONMENT: string; +declare const G_HAVE_ASSERT: boolean; +declare const G_BUILD_TIME: number; +declare const G_IS_STANDALONE: boolean; +declare const G_IS_BROWSER: boolean; +declare const G_IS_MOBILE_APP: boolean; + +declare const G_BUILD_COMMIT_HASH: string; +declare const G_TRACKING_ENDPOINT: string; +declare const G_BUILD_VERSION: string; +declare const G_ALL_UI_IMAGES: Array; +declare const G_IS_RELEASE: boolean; + +// Node require +declare function require(...args): any; + +// Polyfills +declare interface String { + replaceAll(search: string, replacement: string): string; +} + +declare interface CanvasRenderingContext2D { + beginRoundedRect(x: number, y: number, w: number, h: number, r: number): void; + beginCircle(x: number, y: number, r: number): void; + + msImageSmoothingEnabled: boolean; + mozImageSmoothingEnabled: boolean; + webkitImageSmoothingEnabled: boolean; +} + +declare interface HTMLCanvasElement { + opaque: boolean; + webkitOpaque: boolean; +} + +// Just for compatibility with the shared code +declare interface Logger { + log(...args); + warn(...args); + info(...args); + error(...args); +} + +// Cordova +declare interface Device { + uuid: string; + platform: string; + available: boolean; + version: string; + cordova: string; + model: string; + manufacturer: string; + isVirtual: boolean; + serial: string; +} + +declare interface MobileAccessibility { + usePreferredTextZoom(boolean); +} + +declare interface Window { + // Cordova + device: Device; + StatusBar: any; + AndroidFullScreen: any; + AndroidNotch: any; + plugins: any; + + // Adinplay + aiptag: any; + adPlayer: any; + aipPlayer: any; + MobileAccessibility: MobileAccessibility; + LocalFileSystem: any; + + // Debugging + activeClickDetectors: Array; + + // Experimental/Newer apis + FontFace: any; + TouchEvent: undefined | TouchEvent; + + // Thirdparty + XPayStationWidget: any; + Sentry: any; + LogRocket: any; + grecaptcha: any; + gtag: any; + cpmstarAPI: any; + + // Mods + registerMod: any; + anyModLoaded: any; + + webkitRequestAnimationFrame(); + + assert(condition: boolean, failureMessage: string); + + coreThreadLoadedCb(); + + gameanalytics: typeof import("./game_analytics"); +} + +declare interface Navigator { + app: any; + device: any; + splashscreen: any; +} + +// FontFace +declare interface Document { + fonts: any; +} + +// Webpack +declare interface WebpackContext { + keys(): Array; +} + +declare interface NodeRequire { + context(src: string, flag: boolean, regexp: RegExp): WebpackContext; +} + +// HTML Element +declare interface Element { + style: any; + innerText: string; + innerHTML: string; +} + +declare interface Math { + radians(number): number; + degrees(number): number; +} + +declare interface String { + padStart(size: number, fill: string): string; + padEnd(size: number, fill: string): string; +} + +declare interface FactoryTemplate { + entries: Array T>; + entryIds: Array; + idToEntry: any; + + getId(): string; + getAllIds(): Array; + register(entry: new (...args: any[]) => T): void; + hasId(id: string): boolean; + findById(id: string): new (...args: any[]) => T; + getEntries(): Array T>; + getNumEntries(): number; +} + +declare interface SingletonFactoryTemplate { + entries: Array; + idToEntry: any; + + register(classHandle: new (...args: any[]) => T): void; + hasId(id: string): boolean; + findById(id: string): T; + findByClass(classHandle: new (...args: any[]) => T): T; + getEntries(): Array; + getNumEntries(): number; +} + +declare interface SignalTemplate0 { + add(receiver: () => string | void, scope: null | any); + dispatch(): string | void; + remove(receiver: () => string | void); + removeAll(); +} + +declare class TypedTrackedState { + constructor(callbackMethod?: (value: T) => void, callbackScope?: any); + + set(value: T, changeHandler?: (value: T) => void, changeScope?: any): void; + + setSilent(value: any): void; + get(): T; +} diff --git a/src/js/main.js b/src/js/main.js new file mode 100644 index 00000000..5eef3a3f --- /dev/null +++ b/src/js/main.js @@ -0,0 +1,61 @@ +import "./core/polyfills"; +import "./core/assert"; +import "./core/error_handler"; + +import { createLogger, logSection } from "./core/logging"; +import { Application } from "./application"; +import { IS_DEBUG } from "./core/config"; +import { initComponentRegistry } from "./game/component_registry"; +import { initDrawUtils } from "./core/draw_utils"; +import { initItemRegistry } from "./game/item_registry"; +import { initMetaBuildingRegistry } from "./game/meta_building_registry"; + +const logger = createLogger("main"); + +if (window.coreThreadLoadedCb) { + logger.log("Javascript parsed, calling html thread"); + window.coreThreadLoadedCb(); +} + +console.log( + `%cshapez.io ️%c\n© 2019 Tobias Springer IT Solutions\nCommit %c${G_BUILD_COMMIT_HASH}%c on %c${new Date( + G_BUILD_TIME + ).toLocaleString()}\n`, + "font-size: 35px; font-family: Arial;font-weight: bold; padding: 10px 0;", + "color: #aaa", + "color: #7f7", + "color: #aaa", + "color: #7f7" +); + +console.log("Environment: %c" + G_APP_ENVIRONMENT, "color: #fff"); + +if (G_IS_DEV && IS_DEBUG) { + console.log("\n%c🛑 DEBUG ENVIRONMENT 🛑\n", "color: #f77"); +} + +/* typehints:start */ +// @ts-ignore +assert(false, "typehints built in, this should never be the case!"); +/* typehints:end */ + +/* dev:start */ +console.log("%cDEVCODE BUILT IN", "color: #f77"); +/* dev:end */ + +logSection("Boot Process", "#f9a825"); + +initDrawUtils(); +initComponentRegistry(); +initItemRegistry(); +initMetaBuildingRegistry(); + +let app = null; + +function bootApp() { + logger.log("Page Loaded"); + app = new Application(); + app.boot(); +} + +window.addEventListener("load", bootApp); diff --git a/src/js/platform/ad_provider.js b/src/js/platform/ad_provider.js new file mode 100644 index 00000000..a614a793 --- /dev/null +++ b/src/js/platform/ad_provider.js @@ -0,0 +1,45 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +export class AdProviderInterface { + /** @param {Application} app */ + constructor(app) { + this.app = app; + } + + /** + * Initializes the storage + * @returns {Promise} + */ + initialize() { + return Promise.resolve(); + } + + /** + * Returns if this provider serves ads at all + * @returns {boolean} + */ + getHasAds() { + abstract; + return false; + } + + /** + * Returns if it would be possible to show a video ad *now*. This can be false if for + * example the last video ad is + * @returns {boolean} + */ + getCanShowVideoAd() { + abstract; + return false; + } + + /** + * Shows an video ad + * @returns {Promise} + */ + showVideoAd() { + return Promise.resolve(); + } +} diff --git a/src/js/platform/ad_providers/adinplay.js b/src/js/platform/ad_providers/adinplay.js new file mode 100644 index 00000000..a5731dfa --- /dev/null +++ b/src/js/platform/ad_providers/adinplay.js @@ -0,0 +1,188 @@ +/* typehints:start */ +import { Application } from "../../application"; +/* typehints:end */ + +import { AdProviderInterface } from "../ad_provider"; +import { createLogger } from "../../core/logging"; +import { ClickDetector } from "../../core/click_detector"; +import { performanceNow } from "../../core/builtins"; +import { clamp } from "../../core/utils"; + +const logger = createLogger("adprovider/adinplay"); + +const minimumTimeBetweenVideoAdsMs = G_IS_DEV ? 1 : 15 * 60 * 1000; + +export class AdinplayAdProvider extends AdProviderInterface { + /** + * + * @param {Application} app + */ + constructor(app) { + super(app); + + /** @type {ClickDetector} */ + this.getOnSteamClickDetector = null; + + /** @type {Element} */ + this.adContainerMainElement = null; + + /** + * The resolve function to finish the current video ad. Null if none is currently running + * @type {Function} + */ + this.videoAdResolveFunction = null; + + /** + * The current timer which will timeout the resolve + */ + this.videoAdResolveTimer = null; + + /** + * When we showed the last video ad + */ + this.lastVideoAdShowTime = -1e20; + } + + getHasAds() { + return true; + } + + getCanShowVideoAd() { + return ( + this.getHasAds() && + !this.videoAdResolveFunction && + performanceNow() - this.lastVideoAdShowTime > minimumTimeBetweenVideoAdsMs + ); + } + + initialize() { + // No point to initialize everything if ads are not supported + if (!this.getHasAds()) { + return Promise.resolve(); + } + + logger.log("🎬 Initializing Adinplay"); + + // Add the preroll element + this.adContainerMainElement = document.createElement("div"); + this.adContainerMainElement.id = "adinplayVideoContainer"; + this.adContainerMainElement.innerHTML = ` +
+
+ +
+
+ `; + + // Add the setup script + const setupScript = document.createElement("script"); + setupScript.textContent = ` + var aiptag = aiptag || {}; + aiptag.cmd = aiptag.cmd || []; + aiptag.cmd.display = aiptag.cmd.display || []; + aiptag.cmd.player = aiptag.cmd.player || []; + `; + document.head.appendChild(setupScript); + + window.aiptag.gdprShowConsentTool = 0; + window.aiptag.gdprAlternativeConsentTool = 1; + window.aiptag.gdprConsent = 1; + + const scale = this.app.getEffectiveUiScale(); + const targetW = 960; + const targetH = 540; + + const maxScaleX = (window.innerWidth - 100 * scale) / targetW; + const maxScaleY = (window.innerHeight - 150 * scale) / targetH; + + const scaleFactor = clamp(Math.min(maxScaleX, maxScaleY), 0.25, 2); + + const w = Math.round(targetW * scaleFactor); + const h = Math.round(targetH * scaleFactor); + + // Add the player + const videoElement = this.adContainerMainElement.querySelector(".videoInner"); + this.adContainerMainElement.querySelector(".adInner").style.maxWidth = w + "px"; + + const self = this; + window.aiptag.cmd.player.push(function () { + window.adPlayer = new window.aipPlayer({ + AD_WIDTH: w, + AD_HEIGHT: h, + AD_FULLSCREEN: false, + AD_CENTERPLAYER: false, + LOADING_TEXT: "Loading", + PREROLL_ELEM: function () { + return videoElement; + }, + AIP_COMPLETE: function () { + logger.log("🎬 ADINPLAY AD: completed"); + self.adContainerMainElement.classList.add("waitingForFinish"); + }, + AIP_REMOVE: function () { + logger.log("🎬 ADINPLAY AD: remove"); + if (self.videoAdResolveFunction) { + self.videoAdResolveFunction(); + } + }, + }); + }); + + // Load the ads + const aipScript = document.createElement("script"); + aipScript.src = "https://api.adinplay.com/libs/aiptag/pub/YRG/shapez.io/tag.min.js"; + aipScript.setAttribute("async", ""); + document.head.appendChild(aipScript); + + return Promise.resolve(); + } + + showVideoAd() { + assert(this.getHasAds(), "Called showVideoAd but ads are not supported!"); + assert(!this.videoAdResolveFunction, "Video ad still running, can not show again!"); + this.lastVideoAdShowTime = performanceNow(); + document.body.appendChild(this.adContainerMainElement); + this.adContainerMainElement.classList.add("visible"); + this.adContainerMainElement.classList.remove("waitingForFinish"); + + try { + // @ts-ignore + window.aiptag.cmd.player.push(function () { + console.log("🎬 ADINPLAY AD: Start pre roll"); + window.adPlayer.startPreRoll(); + }); + } catch (ex) { + logger.warn("🎬 Failed to play video ad:", ex); + document.body.removeChild(this.adContainerMainElement); + this.adContainerMainElement.classList.remove("visible"); + return Promise.resolve(); + } + + return new Promise(resolve => { + // So, wait for the remove call but also remove after N seconds + this.videoAdResolveFunction = () => { + this.videoAdResolveFunction = null; + clearTimeout(this.videoAdResolveTimer); + this.videoAdResolveTimer = null; + + // When the ad closed, also set the time + this.lastVideoAdShowTime = performanceNow(); + resolve(); + }; + + this.videoAdResolveTimer = setTimeout(() => { + logger.warn(this, "Automatically closing ad after not receiving callback"); + if (this.videoAdResolveFunction) { + this.videoAdResolveFunction(); + } + }, 120 * 1000); + }) + .catch(err => { + logger.error("Error while resolving video ad:", err); + }) + .then(() => { + document.body.removeChild(this.adContainerMainElement); + this.adContainerMainElement.classList.remove("visible"); + }); + } +} diff --git a/src/js/platform/ad_providers/no_ad_provider.js b/src/js/platform/ad_providers/no_ad_provider.js new file mode 100644 index 00000000..ca7d5db1 --- /dev/null +++ b/src/js/platform/ad_providers/no_ad_provider.js @@ -0,0 +1,11 @@ +import { AdProviderInterface } from "../ad_provider"; + +export class NoAdProvider extends AdProviderInterface { + getHasAds() { + return false; + } + + getCanShowVideoAd() { + return false; + } +} diff --git a/src/js/platform/analytics.js b/src/js/platform/analytics.js new file mode 100644 index 00000000..7bd7ae50 --- /dev/null +++ b/src/js/platform/analytics.js @@ -0,0 +1,43 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +export class AnalyticsInterface { + constructor(app) { + /** @type {Application} */ + this.app = app; + } + + /** + * Initializes the analytics + * @returns {Promise} + */ + initialize() { + abstract; + return Promise.reject(); + } + + /** + * Sets the player name for analytics + * @param {string} userName + */ + setUserContext(userName) {} + + /** + * Tracks a click no an ui element + * @param {string} elementName + */ + trackUiClick(elementName) {} + + /** + * Tracks when a new state is entered + * @param {string} stateId + */ + trackStateEnter(stateId) {} + + /** + * Tracks a new user decision + * @param {string} name + */ + trackDecision(name) {} +} diff --git a/src/js/platform/browser/embed_provider.js b/src/js/platform/browser/embed_provider.js new file mode 100644 index 00000000..8703ec27 --- /dev/null +++ b/src/js/platform/browser/embed_provider.js @@ -0,0 +1,47 @@ +import { AdProviderInterface } from "../ad_provider"; + +/** + * Stores information about where we are iframed + */ +export class EmbedProvider { + /** + * @returns {string} + */ + getId() { + abstract; + return ""; + } + + /** + * Whether this provider supports ads + * @returns {boolean} + */ + getSupportsAds() { + return false; + } + + /** + * Returns the ad provider + * @returns {typeof AdProviderInterface} + */ + getAdProvider() { + abstract; + return null; + } + + /** + * Whetherexternal links are supported + * @returns {boolean} + */ + getSupportsExternalLinks() { + return true; + } + + /** + * Returns whether this provider is iframed + * @returns {boolean} + */ + getIsIframed() { + return true; + } +} diff --git a/src/js/platform/browser/embed_providers/armorgames.js b/src/js/platform/browser/embed_providers/armorgames.js new file mode 100644 index 00000000..867e0a71 --- /dev/null +++ b/src/js/platform/browser/embed_providers/armorgames.js @@ -0,0 +1,16 @@ +import { AdinplayAdProvider } from "../../ad_providers/adinplay"; +import { ShapezioWebsiteEmbedProvider } from "./shapezio_website"; + +export class ArmorgamesEmbedProvider extends ShapezioWebsiteEmbedProvider { + getId() { + return "armorgames"; + } + + getAdProvider() { + return AdinplayAdProvider; + } + + getIsIframed() { + return true; + } +} diff --git a/src/js/platform/browser/embed_providers/crazygames.js b/src/js/platform/browser/embed_providers/crazygames.js new file mode 100644 index 00000000..dc0b09dc --- /dev/null +++ b/src/js/platform/browser/embed_providers/crazygames.js @@ -0,0 +1,11 @@ +import { ShapezioWebsiteEmbedProvider } from "./shapezio_website"; + +export class CrazygamesEmbedProvider extends ShapezioWebsiteEmbedProvider { + getId() { + return "crazygames"; + } + + getIsIframed() { + return true; + } +} diff --git a/src/js/platform/browser/embed_providers/gamedistribution.js b/src/js/platform/browser/embed_providers/gamedistribution.js new file mode 100644 index 00000000..49dda339 --- /dev/null +++ b/src/js/platform/browser/embed_providers/gamedistribution.js @@ -0,0 +1,20 @@ +import { AdinplayAdProvider } from "../../ad_providers/adinplay"; +import { ShapezioWebsiteEmbedProvider } from "./shapezio_website"; + +export class GamedistributionEmbedProvider extends ShapezioWebsiteEmbedProvider { + getId() { + return "gamedistribution"; + } + + getAdProvider() { + return AdinplayAdProvider; + } + + getSupportsExternalLinks() { + return false; + } + + getIsIframed() { + return true; + } +} diff --git a/src/js/platform/browser/embed_providers/iogames_space.js b/src/js/platform/browser/embed_providers/iogames_space.js new file mode 100644 index 00000000..5f7d317d --- /dev/null +++ b/src/js/platform/browser/embed_providers/iogames_space.js @@ -0,0 +1,15 @@ +import { ShapezioWebsiteEmbedProvider } from "./shapezio_website"; + +export class IogamesSpaceEmbedProvider extends ShapezioWebsiteEmbedProvider { + getId() { + return "iogames.space"; + } + + getShowUpvoteHints() { + return true; + } + + getIsIframed() { + return true; + } +} diff --git a/src/js/platform/browser/embed_providers/kongregate.js b/src/js/platform/browser/embed_providers/kongregate.js new file mode 100644 index 00000000..b0ed4d8b --- /dev/null +++ b/src/js/platform/browser/embed_providers/kongregate.js @@ -0,0 +1,24 @@ +import { NoAdProvider } from "../../ad_providers/no_ad_provider"; +import { EmbedProvider } from "../embed_provider"; + +export class KongregateEmbedProvider extends EmbedProvider { + getId() { + return "kongregate"; + } + + getSupportsAds() { + return false; + } + + getAdProvider() { + return NoAdProvider; + } + + getSupportsExternalLinks() { + return true; + } + + getIsIframed() { + return true; + } +} diff --git a/src/js/platform/browser/embed_providers/miniclip.js b/src/js/platform/browser/embed_providers/miniclip.js new file mode 100644 index 00000000..e0612978 --- /dev/null +++ b/src/js/platform/browser/embed_providers/miniclip.js @@ -0,0 +1,11 @@ +import { ShapezioWebsiteEmbedProvider } from "./shapezio_website"; + +export class MiniclipEmbedProvider extends ShapezioWebsiteEmbedProvider { + getId() { + return "miniclip"; + } + + getIsIframed() { + return true; + } +} diff --git a/src/js/platform/browser/embed_providers/shapezio_website.js b/src/js/platform/browser/embed_providers/shapezio_website.js new file mode 100644 index 00000000..2a5359ed --- /dev/null +++ b/src/js/platform/browser/embed_providers/shapezio_website.js @@ -0,0 +1,24 @@ +import { EmbedProvider } from "../embed_provider"; +import { AdinplayAdProvider } from "../../ad_providers/adinplay"; + +export class ShapezioWebsiteEmbedProvider extends EmbedProvider { + getId() { + return "shapezio"; + } + + getSupportsAds() { + return true; + } + + getAdProvider() { + return AdinplayAdProvider; + } + + getIsIframed() { + return false; + } + + getSupportsExternalLinks() { + return true; + } +} diff --git a/src/js/platform/browser/game_analytics.js b/src/js/platform/browser/game_analytics.js new file mode 100644 index 00000000..1c06a602 --- /dev/null +++ b/src/js/platform/browser/game_analytics.js @@ -0,0 +1,69 @@ +import { GameAnalyticsInterface } from "../game_analytics"; +import { createLogger } from "../../core/logging"; +import { ShapeDefinition } from "../../game/shape_definition"; +import { gameCreationAction } from "../../states/ingame"; + +const logger = createLogger("ga_com"); + +export class GameAnalyticsDotCom extends GameAnalyticsInterface { + /** + * @returns {Promise} + */ + initialize() { + try { + const ga = window.gameanalytics.GameAnalytics; + ga.configureBuild(G_APP_ENVIRONMENT + "@" + G_BUILD_VERSION + "@" + G_BUILD_COMMIT_HASH); + + ga.setEnabledInfoLog(G_IS_DEV); + ga.setEnabledVerboseLog(G_IS_DEV); + + // @ts-ignore + ga.initialize(window.ga_comKey, window.ga_comToken); + + // start new session + ga.startSession(); + } catch (ex) { + logger.warn("ga_com init error:", ex); + } + return Promise.resolve(); + } + + /** + * @param {ShapeDefinition} definition + */ + handleShapeDelivered(definition) { + const hash = definition.getHash(); + logger.log("Deliver:", hash); + } + + /** + * Handles the given level completed + * @param {number} level + */ + handleLevelCompleted(level) { + logger.log("Complete level", level); + try { + const gaD = window.gameanalytics; + const ga = gaD.GameAnalytics; + ga.addProgressionEvent(gaD.EGAProgressionStatus.Complete, "story", "" + level); + } catch (ex) { + logger.error("ga_com lvl complete error:", ex); + } + } + + /** + * Handles the given upgrade completed + * @param {string} id + * @param {number} level + */ + handleUpgradeUnlocked(id, level) { + logger.log("Unlock upgrade", id, level); + try { + const gaD = window.gameanalytics; + const ga = gaD.GameAnalytics; + ga.addProgressionEvent(gaD.EGAProgressionStatus.Complete, "upgrade", id, "" + level); + } catch (ex) { + logger.error("ga_com upgrade unlock error:", ex); + } + } +} diff --git a/src/js/platform/browser/google_analytics.js b/src/js/platform/browser/google_analytics.js new file mode 100644 index 00000000..55de95cc --- /dev/null +++ b/src/js/platform/browser/google_analytics.js @@ -0,0 +1,101 @@ +import { AnalyticsInterface } from "../analytics"; +import { Math_random, performanceNow } from "../../core/builtins"; +import { createLogger } from "../../core/logging"; + +const logger = createLogger("ga"); + +export class GoogleAnalyticsImpl extends AnalyticsInterface { + initialize() { + this.lastUiClickTracked = -1000; + + setInterval(() => this.internalTrackAfkEvent(), 120 * 1000); + + // Analytics is already loaded in the html + return Promise.resolve(); + } + + setUserContext(userName) { + try { + if (window.gtag) { + logger.log("📊 Setting user context:", userName); + window.gtag("set", { + player: userName, + }); + } + } catch (ex) { + logger.warn("📊 Failed to set user context:", ex); + } + } + + trackStateEnter(stateId) { + const nonInteractionStates = [ + "LoginState", + "MainMenuState", + "PreloadState", + "RegisterState", + "WatchAdState", + ]; + + try { + if (window.gtag) { + logger.log("📊 Tracking state enter:", stateId); + window.gtag("event", "enter_state", { + event_category: "ui", + event_label: stateId, + non_interaction: nonInteractionStates.indexOf(stateId) >= 0, + }); + } + } catch (ex) { + logger.warn("📊 Failed to track state analytcis:", ex); + } + } + + trackDecision(decisionName) { + try { + if (window.gtag) { + logger.log("📊 Tracking decision:", decisionName); + window.gtag("event", "decision", { + event_category: "ui", + event_label: decisionName, + non_interaction: true, + }); + } + } catch (ex) { + logger.warn("📊 Failed to track state analytcis:", ex); + } + } + + trackUiClick(elementName) { + // Only track a fraction of clicks to not annoy google analytics + if (Math_random() < 0.9) { + return; + } + + const stateKey = this.app.stateMgr.getCurrentState().key; + const fullSelector = stateKey + ">" + elementName; + + try { + if (window.gtag) { + logger.log("📊 Tracking click on:", fullSelector); + window.gtag("event", "click", { + event_category: "ui", + event_label: fullSelector, + }); + } + } catch (ex) { + logger.warn("📊 Failed to track ui click:", ex); + } + } + + /** + * Tracks an event so GA keeps track of the user + */ + internalTrackAfkEvent() { + if (window.gtag) { + window.gtag("event", "afk", { + event_category: "ping", + event_label: "timed", + }); + } + } +} diff --git a/src/js/platform/browser/sound.js b/src/js/platform/browser/sound.js new file mode 100644 index 00000000..6776a6d1 --- /dev/null +++ b/src/js/platform/browser/sound.js @@ -0,0 +1,146 @@ +import { MusicInstanceInterface, SoundInstanceInterface, SoundInterface } from "../sound"; +import { cachebust } from "../../core/cachebust"; +import { createLogger } from "../../core/logging"; + +const { Howl, Howler } = require("howler"); + +const logger = createLogger("sound/browser"); + +class SoundInstance extends SoundInstanceInterface { + constructor(key, url) { + super(key, url); + this.howl = null; + this.instance = null; + } + + load() { + return Promise.race([ + new Promise((resolve, reject) => { + setTimeout(reject, G_IS_DEV ? 5000 : 60000); + }), + new Promise(resolve => { + this.howl = new Howl({ + src: cachebust("res/sounds/" + this.url), + autoplay: false, + loop: false, + volume: 0, + preload: true, + onload: () => { + resolve(); + }, + onloaderror: (id, err) => { + logger.warn("Sound", this.url, "failed to load:", id, err); + this.howl = null; + resolve(); + }, + onplayerror: (id, err) => { + logger.warn("Sound", this.url, "failed to play:", id, err); + }, + }); + }), + ]); + } + + play(volume) { + if (this.howl) { + if (!this.instance) { + this.instance = this.howl.play(); + } else { + this.howl.play(this.instance); + this.howl.seek(0, this.instance); + } + this.howl.volume(volume, this.instance); + } + } + + deinitialize() { + if (this.howl) { + this.howl.unload(); + this.howl = null; + this.instance = null; + } + } +} + +class MusicInstance extends MusicInstanceInterface { + constructor(key, url) { + super(key, url); + this.howl = null; + this.instance = null; + this.playing = false; + } + load() { + return Promise.race([ + new Promise((resolve, reject) => { + setTimeout(reject, G_IS_DEV ? 5000 : 60000); + }), + new Promise((resolve, reject) => { + this.howl = new Howl({ + src: cachebust("res/sounds/music/" + this.url), + autoplay: false, + loop: true, + html5: true, + volume: 1, + preload: true, + pool: 2, + + onload: () => { + resolve(); + }, + onloaderror: (id, err) => { + logger.warn(this, "Music", this.url, "failed to load:", id, err); + this.howl = null; + resolve(); + }, + onplayerror: (id, err) => { + logger.warn(this, "Music", this.url, "failed to play:", id, err); + }, + }); + }), + ]); + } + + stop() { + if (this.howl && this.instance) { + this.playing = false; + this.howl.pause(this.instance); + } + } + + isPlaying() { + return this.playing; + } + + play() { + if (this.howl) { + this.playing = true; + if (this.instance) { + this.howl.play(this.instance); + } else { + this.instance = this.howl.play(); + } + } + } + + deinitialize() { + if (this.howl) { + this.howl.unload(); + this.howl = null; + this.instance = null; + } + } +} + +export class SoundImplBrowser extends SoundInterface { + constructor(app) { + super(app, SoundInstance, MusicInstance); + } + + initialize() { + return super.initialize(); + } + + deinitialize() { + return super.deinitialize().then(() => Howler.unload()); + } +} diff --git a/src/js/platform/browser/storage.js b/src/js/platform/browser/storage.js new file mode 100644 index 00000000..23cbe700 --- /dev/null +++ b/src/js/platform/browser/storage.js @@ -0,0 +1,97 @@ +import { FILE_NOT_FOUND, StorageInterface } from "../storage"; +import { createLogger } from "../../core/logging"; + +const logger = createLogger("storage/browser"); + +const LOCAL_STORAGE_UNAVAILABLE = "local-storage-unavailable"; +const LOCAL_STORAGE_NO_WRITE_PERMISSION = "local-storage-no-write-permission"; + +let randomDelay = () => 0; + +if (G_IS_DEV) { + // Random delay for testing + // randomDelay = () => 500; +} + +export class StorageImplBrowser extends StorageInterface { + constructor(app) { + super(app); + this.currentBusyFilename = false; + } + + initialize() { + return new Promise((resolve, reject) => { + // Check for local storage availability in general + if (!window.localStorage) { + alert("Local storage is not available! Please upgrade to a newer browser!"); + reject(LOCAL_STORAGE_UNAVAILABLE); + } + + // Check if we can set and remove items + try { + window.localStorage.setItem("storage_availability_test", "1"); + window.localStorage.removeItem("storage_availability_test"); + } catch (e) { + alert( + "It seems we don't have permission to write to local storage! Please update your browsers settings or use a different browser!" + ); + reject(LOCAL_STORAGE_NO_WRITE_PERMISSION); + return; + } + setTimeout(resolve, 0); + }); + } + + writeFileAsync(filename, contents) { + if (this.currentBusyFilename === filename) { + logger.warn("Attempt to write", filename, "while write process is not finished!"); + } + + this.currentBusyFilename = filename; + window.localStorage.setItem(filename, contents); + return new Promise((resolve, reject) => { + setTimeout(() => { + this.currentBusyFilename = false; + resolve(); + }, 0); + }); + } + + writeFileSyncIfSupported(filename, contents) { + window.localStorage.setItem(filename, contents); + return true; + } + + readFileAsync(filename) { + if (this.currentBusyFilename === filename) { + logger.warn("Attempt to read", filename, "while write progress on it is ongoing!"); + } + + return new Promise((resolve, reject) => { + const contents = window.localStorage.getItem(filename); + if (!contents) { + // File not found + setTimeout(() => reject(FILE_NOT_FOUND), randomDelay()); + return; + } + + // File read, simulate delay + setTimeout(() => resolve(contents), 0); + }); + } + + deleteFileAsync(filename) { + if (this.currentBusyFilename === filename) { + logger.warn("Attempt to delete", filename, "while write progres on it is ongoing!"); + } + + this.currentBusyFilename = filename; + return new Promise((resolve, reject) => { + window.localStorage.removeItem(filename); + setTimeout(() => { + this.currentBusyFilename = false; + resolve(); + }, 0); + }); + } +} diff --git a/src/js/platform/browser/wrapper.js b/src/js/platform/browser/wrapper.js new file mode 100644 index 00000000..93565342 --- /dev/null +++ b/src/js/platform/browser/wrapper.js @@ -0,0 +1,242 @@ +import { Math_min } from "../../core/builtins"; +import { createLogger } from "../../core/logging"; +import { queryParamOptions } from "../../core/query_parameters"; +import { clamp } from "../../core/utils"; +import { globalConfig, IS_MOBILE } from "../../core/config"; +import { NoAdProvider } from "../ad_providers/no_ad_provider"; +import { PlatformWrapperInterface } from "../wrapper"; +import { ShapezioWebsiteEmbedProvider } from "./embed_providers/shapezio_website"; +import { ArmorgamesEmbedProvider } from "./embed_providers/armorgames"; +import { IogamesSpaceEmbedProvider } from "./embed_providers/iogames_space"; +import { MiniclipEmbedProvider } from "./embed_providers/miniclip"; +import { GamedistributionEmbedProvider } from "./embed_providers/gamedistribution"; +import { KongregateEmbedProvider } from "./embed_providers/kongregate"; +import { CrazygamesEmbedProvider } from "./embed_providers/crazygames"; +import { EmbedProvider } from "./embed_provider"; + +const logger = createLogger("platform/browser"); + +export class PlatformWrapperImplBrowser extends PlatformWrapperInterface { + initialize() { + this.recaptchaTokenCallback = null; + + this.embedProvider = new ShapezioWebsiteEmbedProvider(); + + if (!G_IS_STANDALONE && queryParamOptions.embedProvider) { + const providerId = queryParamOptions.embedProvider; + + switch (providerId) { + case "armorgames": { + this.embedProvider = new ArmorgamesEmbedProvider(); + break; + } + + case "iogames.space": { + this.embedProvider = new IogamesSpaceEmbedProvider(); + break; + } + + case "miniclip": { + this.embedProvider = new MiniclipEmbedProvider(); + break; + } + + case "gamedistribution": { + this.embedProvider = new GamedistributionEmbedProvider(); + break; + } + + case "kongregate": { + this.embedProvider = new KongregateEmbedProvider(); + break; + } + + case "crazygames": { + this.embedProvider = new CrazygamesEmbedProvider(); + break; + } + + default: { + logger.error("Got unsupported embed provider:", providerId); + } + } + } + + logger.log("Embed provider:", this.embedProvider.getId()); + + return super.initialize().then(() => { + // SENTRY + if (!G_IS_DEV && false) { + logger.log(this, "Loading sentry"); + const sentryTag = document.createElement("script"); + sentryTag.src = "https://browser.sentry-cdn.com/5.7.1/bundle.min.js"; + sentryTag.setAttribute("integrity", "TODO_SENTRY"); + sentryTag.setAttribute("crossorigin", "anonymous"); + sentryTag.addEventListener("load", this.onSentryLoaded.bind(this)); + document.head.appendChild(sentryTag); + } + }); + } + + /** + * @returns {EmbedProvider} + */ + getEmbedProvider() { + return this.embedProvider; + } + + onSentryLoaded() { + logger.log("Initializing sentry"); + window.Sentry.init({ + dsn: "TODO SENTRY DSN", + release: G_APP_ENVIRONMENT + "-" + G_BUILD_VERSION + "@" + G_BUILD_COMMIT_HASH, + // Will cause a deprecation warning, but the demise of `ignoreErrors` is still under discussion. + // See: https://github.com/getsentry/raven-js/issues/73 + ignoreErrors: [ + // Random plugins/extensions + "top.GLOBALS", + // See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error.html + "originalCreateNotification", + "canvas.contentDocument", + "MyApp_RemoveAllHighlights", + "http://tt.epicplay.com", + "Can't find variable: ZiteReader", + "jigsaw is not defined", + "ComboSearch is not defined", + "http://loading.retry.widdit.com/", + "atomicFindClose", + // Facebook borked + "fb_xd_fragment", + // ISP "optimizing" proxy - `Cache-Control: no-transform` seems to reduce this. (thanks @acdha) + // See http://stackoverflow.com/questions/4113268/how-to-stop-javascript-injection-from-vodafone-proxy + "bmi_SafeAddOnload", + "EBCallBackMessageReceived", + // See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx + "conduitPage", + // Generic error code from errors outside the security sandbox + // You can delete this if using raven.js > 1.0, which ignores these automatically. + "Script error.", + + // Errors from ads + "Cannot read property 'postMessage' of null", + + // Firefox only + "AbortError: The operation was aborted.", + + "", + ], + ignoreUrls: [ + // Facebook flakiness + /graph\.facebook\.com/i, + // Facebook blocked + /connect\.facebook\.net\/en_US\/all\.js/i, + // Woopra flakiness + /eatdifferent\.com\.woopra-ns\.com/i, + /static\.woopra\.com\/js\/woopra\.js/i, + // Chrome extensions + /extensions\//i, + /^chrome:\/\//i, + // Other plugins + /127\.0\.0\.1:4001\/isrunning/i, // Cacaoweb + /webappstoolbarba\.texthelp\.com\//i, + /metrics\.itunes\.apple\.com\.edgesuite\.net\//i, + ], + beforeSend(event, hint) { + if (window.anyModLoaded) { + return null; + } + return event; + }, + }); + } + + getId() { + return "browser@" + this.embedProvider.getId(); + } + + getUiScale() { + if (IS_MOBILE) { + return 1; + } + + const avgDims = Math_min(this.app.screenWidth, this.app.screenHeight); + return clamp((avgDims / 1000.0) * 1.9, 0.1, 10); + } + + getSupportsRestart() { + return true; + } + + getTouchPanStrength() { + return IS_MOBILE ? 1 : 0.5; + } + + openExternalLink(url, force = false) { + logger.log("Opening external:", url); + // if (force || this.embedProvider.getSupportsExternalLinks()) { + window.open(url); + // } else { + // // Do nothing + // alert("This platform does not allow opening external links. You can play on the website directly to open them."); + // } + } + + getSupportsAds() { + return this.embedProvider.getSupportsAds(); + } + + performRestart() { + logger.log("Performing restart"); + window.location.reload(true); + } + + /** + * Detects if there is an adblocker installed + * @returns {Promise} + */ + detectAdblock() { + return Promise.race([ + new Promise(resolve => { + // If the request wasn't blocked within a very short period of time, this means + // the adblocker is not active and the request was actually made -> ignore it then + setTimeout(() => resolve(false), 30); + }), + new Promise(resolve => { + fetch("https://googleads.g.doubleclick.net/pagead/id", { + method: "HEAD", + mode: "no-cors", + }) + .then(res => { + resolve(false); + }) + .catch(err => { + resolve(true); + }); + }), + ]); + } + + initializeAdProvider() { + if (G_IS_DEV && !globalConfig.debug.testAds) { + return Promise.resolve(); + } + + // First, detect adblocker + return this.detectAdblock().then(hasAdblocker => { + if (hasAdblocker) { + return; + } + + const adProvider = this.embedProvider.getAdProvider(); + this.app.adProvider = new adProvider(this.app); + return this.app.adProvider.initialize().catch(err => { + logger.error("Failed to initialize ad provider, disabling ads:", err); + this.app.adProvider = new NoAdProvider(this.app); + }); + }); + } + + exitApp() { + // Can not exit app + } +} diff --git a/src/js/platform/game_analytics.js b/src/js/platform/game_analytics.js new file mode 100644 index 00000000..5b70e565 --- /dev/null +++ b/src/js/platform/game_analytics.js @@ -0,0 +1,38 @@ +/* typehints:start */ +import { Application } from "../application"; +import { ShapeDefinition } from "../game/shape_definition"; +/* typehints:end */ + +export class GameAnalyticsInterface { + constructor(app) { + /** @type {Application} */ + this.app = app; + } + + /** + * Initializes the analytics + * @returns {Promise} + */ + initialize() { + abstract; + return Promise.reject(); + } + + /** + * @param {ShapeDefinition} definition + */ + handleShapeDelivered(definition) {} + + /** + * Handles the given level completed + * @param {number} level + */ + handleLevelCompleted(level) {} + + /** + * Handles the given upgrade completed + * @param {string} id + * @param {number} level + */ + handleUpgradeUnlocked(id, level) {} +} diff --git a/src/js/platform/sound.js b/src/js/platform/sound.js new file mode 100644 index 00000000..c62db515 --- /dev/null +++ b/src/js/platform/sound.js @@ -0,0 +1,277 @@ +/* typehints:start */ +import { Application } from "../application"; +import { Vector } from "../core/vector"; +import { GameRoot } from "../game/root"; +/* typehints:end */ + +import { newEmptyMap, clamp } from "../core/utils"; +import { createLogger } from "../core/logging"; +import { globalConfig } from "../core/config"; + +const logger = createLogger("sound"); + +export const SOUNDS = { + // Menu and such + uiClick: "ui/ui_click.mp3", + uiError: "ui/ui_error.mp3", + dialogError: "ui/dialog_error.mp3", + dialogOk: "ui/dialog_ok.mp3", + swishHide: "ui/ui_swish_hide.mp3", + swishShow: "ui/ui_swish_show.mp3", +}; + +export const MUSIC = { + mainMenu: "main_menu.mp3", + gameBg: "theme_full.mp3", +}; + +export class SoundInstanceInterface { + constructor(key, url) { + this.key = key; + this.url = url; + } + + /** @returns {Promise} */ + load() { + abstract; + return Promise.resolve(); + } + + play(volume) { + abstract; + } + + deinitialize() {} +} + +export class MusicInstanceInterface { + constructor(key, url) { + this.key = key; + this.url = url; + } + + stop() { + abstract; + } + + play() { + abstract; + } + + /** @returns {Promise} */ + load() { + abstract; + return Promise.resolve(); + } + + /** @returns {boolean} */ + isPlaying() { + abstract; + return false; + } + + deinitialize() {} +} + +export class SoundInterface { + constructor(app, soundClass, musicClass) { + /** @type {Application} */ + this.app = app; + + this.soundClass = soundClass; + this.musicClass = musicClass; + + /** @type {Object} */ + this.sounds = newEmptyMap(); + + /** @type {Object} */ + this.music = newEmptyMap(); + + /** @type {MusicInstanceInterface} */ + this.currentMusic = null; + + this.pageIsVisible = true; + + this.musicMuted = false; + this.soundsMuted = false; + } + + /** + * Initializes the sound + * @returns {Promise} + */ + initialize() { + for (const soundKey in SOUNDS) { + const soundPath = SOUNDS[soundKey]; + const sound = new this.soundClass(soundKey, soundPath); + this.sounds[soundPath] = sound; + } + + for (const musicKey in MUSIC) { + const musicPath = MUSIC[musicKey]; + const music = new this.musicClass(musicKey, musicPath); + this.music[musicPath] = music; + } + + // this.musicMuted = this.app.userProfile.getMusicMuted(); + // this.soundsMuted = this.app.userProfile.getSoundsMuted(); + + this.musicMuted = false; + this.soundsMuted = false; + + if (G_IS_DEV && globalConfig.debug.disableMusic) { + this.musicMuted = true; + } + + return Promise.resolve(); + } + + /** + * Pre-Loads the given sounds + * @param {string} key + * @returns {Promise} + */ + loadSound(key) { + if (this.sounds[key]) { + return this.sounds[key].load(); + } else if (this.music[key]) { + return this.music[key].load(); + } else { + logger.error("Sound/Music by key not found:", key); + return Promise.resolve(); + } + } + + /** Deinits the sound */ + deinitialize() { + const promises = []; + for (const key in this.sounds) { + promises.push(this.sounds[key].deinitialize()); + } + for (const key in this.music) { + promises.push(this.music[key].deinitialize()); + } + return Promise.all(promises); + } + + /** + * Returns if the music is muted + * @returns {boolean} + */ + getMusicMuted() { + return this.musicMuted; + } + + /** + * Returns if sounds are muted + * @returns {boolean} + */ + getSoundsMuted() { + return this.soundsMuted; + } + + /** + * Sets if the music is muted + * @param {boolean} muted + */ + setMusicMuted(muted) { + this.musicMuted = muted; + if (this.musicMuted) { + if (this.currentMusic) { + this.currentMusic.stop(); + } + } else { + if (this.currentMusic) { + this.currentMusic.play(); + } + } + } + + /** + * Sets if the sounds are muted + * @param {boolean} muted + */ + setSoundsMuted(muted) { + this.soundsMuted = muted; + } + + /** + * Focus change handler, called by the pap + * @param {boolean} pageIsVisible + */ + onPageRenderableStateChanged(pageIsVisible) { + this.pageIsVisible = pageIsVisible; + if (this.currentMusic) { + if (pageIsVisible) { + if (!this.currentMusic.isPlaying() && !this.musicMuted) { + this.currentMusic.play(); + } + } else { + this.currentMusic.stop(); + } + } + } + + /** + * @param {string} key + */ + playUiSound(key) { + if (this.soundsMuted) { + return; + } + if (!this.sounds[key]) { + logger.warn("Sound", key, "not found, probably not loaded yet"); + return; + } + this.sounds[key].play(1.0); + } + + /** + * + * @param {string} key + * @param {Vector} worldPosition + * @param {GameRoot} root + */ + play3DSound(key, worldPosition, root) { + if (!this.sounds[key]) { + logger.warn("Music", key, "not found, probably not loaded yet"); + return; + } + if (!this.pageIsVisible || this.soundsMuted) { + return; + } + + // hack, but works + if (root.time.getIsPaused()) { + return; + } + + let volume = 1.0; + if (!root.camera.isWorldPointOnScreen(worldPosition)) { + volume = 0.2; + } + volume *= clamp(root.camera.zoomLevel / 3); + this.sounds[key].play(clamp(volume)); + } + + /** + * @param {string} key + */ + playThemeMusic(key) { + const music = this.music[key]; + if (key !== null && !music) { + logger.warn("Music", key, "not found"); + } + if (this.currentMusic !== music) { + if (this.currentMusic) { + logger.log("Stopping", this.currentMusic.key); + this.currentMusic.stop(); + } + this.currentMusic = music; + if (music && this.pageIsVisible && !this.musicMuted) { + logger.log("Starting", this.currentMusic.key); + music.play(); + } + } + } +} diff --git a/src/js/platform/storage.js b/src/js/platform/storage.js new file mode 100644 index 00000000..1c7fc54b --- /dev/null +++ b/src/js/platform/storage.js @@ -0,0 +1,62 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +export const FILE_NOT_FOUND = "file_not_found"; + +export class StorageInterface { + constructor(app) { + /** @type {Application} */ + this.app = app; + } + + /** + * Initializes the storage + * @returns {Promise} + */ + initialize() { + abstract; + return Promise.reject(); + } + + /** + * Writes a string to a file asynchronously + * @param {string} filename + * @param {string} contents + * @returns {Promise} + */ + writeFileAsync(filename, contents) { + abstract; + return Promise.reject(); + } + + /** + * Tries to write a file synchronously, used in unload handler + * @param {string} filename + * @param {string} contents + */ + writeFileSyncIfSupported(filename, contents) { + abstract; + return false; + } + + /** + * Reads a string asynchronously. Returns Promise if file was not found. + * @param {string} filename + * @returns {Promise} + */ + readFileAsync(filename) { + abstract; + return Promise.reject(); + } + + /** + * Tries to delete a file + * @param {string} filename + * @returns {Promise} + */ + deleteFileAsync(filename) { + // Default implementation does not allow deleting files + return Promise.reject(); + } +} diff --git a/src/js/platform/wrapper.js b/src/js/platform/wrapper.js new file mode 100644 index 00000000..bda56fc2 --- /dev/null +++ b/src/js/platform/wrapper.js @@ -0,0 +1,131 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +import { IS_MOBILE } from "../core/config"; + +export class PlatformWrapperInterface { + constructor(app) { + /** @type {Application} */ + this.app = app; + } + + /** @returns {string} */ + getId() { + abstract; + return "unknown-platform"; + } + + /** + * Returns the UI scale, called on every resize + * @returns {number} */ + getUiScale() { + return 1; + } + + /** @returns {boolean} */ + getSupportsRestart() { + abstract; + return false; + } + + /** + * Returns the strength of touch pans with the mouse + */ + getTouchPanStrength() { + return 1; + } + + /** @returns {Promise} */ + initialize() { + document.documentElement.classList.add("p-" + this.getId()); + return Promise.resolve(); + } + + /** + * Should initialize the apps ad provider in case supported + * @returns {Promise} + */ + initializeAdProvider() { + return Promise.resolve(); + } + + /** + * Should return the minimum supported zoom level + * @returns {number} + */ + getMinimumZoom() { + return 0.2 * this.getScreenScale(); + } + + /** + * Should return the maximum supported zoom level + * @returns {number} + */ + getMaximumZoom() { + return 4 * this.getScreenScale(); + } + + getScreenScale() { + return Math.min(window.innerWidth, window.innerHeight) / 1024.0; + } + + /** + * Should return if this platform supports ads at all + */ + getSupportsAds() { + return false; + } + + /** + * Attempt to open an external url + * @param {string} url + * @param {boolean=} force Whether to always open the url even if not allowed + */ + openExternalLink(url, force = false) { + abstract; + } + + /** + * Attempt to restart the app + */ + performRestart() { + abstract; + } + + /** + * Returns whether this platform supports a toggleable fullscreen + */ + getSupportsFullscreen() { + return false; + } + + /** + * Should set the apps fullscreen state to the desired state + * @param {boolean} flag + */ + setFullscreen(flag) { + abstract; + } + + /** + * Returns whether this platform supports quitting the app + */ + getSupportsAppExit() { + return false; + } + + /** + * Attempts to quit the app + */ + exitApp() { + abstract; + } + + /** + * Whether this platform supports a keyboard + */ + getSupportsKeyboard() { + return !IS_MOBILE; + } +} diff --git a/src/js/profile/application_settings.js b/src/js/profile/application_settings.js new file mode 100644 index 00000000..6d09c148 --- /dev/null +++ b/src/js/profile/application_settings.js @@ -0,0 +1,191 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +import { ReadWriteProxy } from "../core/read_write_proxy"; +import { BoolSetting, EnumSetting, BaseSetting } from "./setting_types"; +import { createLogger } from "../core/logging"; +import { ExplainedResult } from "../core/explained_result"; + +const logger = createLogger("application_settings"); + +const categoryGame = "game"; +const categoryApp = "app"; + +export const uiScales = [ + { + id: "super_small", + size: 0.6, + label: "Super small", + }, + { + id: "small", + size: 0.8, + label: "Small", + }, + { + id: "regular", + size: 1, + label: "Regular", + }, + { + id: "large", + size: 1.2, + label: "Large", + }, + { + id: "huge", + size: 1.4, + label: "Huge", + }, +]; + +/** @type {Array} */ +export const allApplicationSettings = [ + new EnumSetting("uiScale", { + options: uiScales.sort((a, b) => a.size - b.size), + valueGetter: scale => scale.id, + textGetter: scale => scale.label, + category: categoryApp, + restartRequired: false, + changeCb: + /** + * @param {Application} app + */ + (app, id) => app.updateAfterUiScaleChanged(), + }), + new BoolSetting( + "fullscreen", + categoryApp, + /** + * @param {Application} app + */ + (app, value) => { + if (app.platformWrapper.getSupportsFullscreen()) { + app.platformWrapper.setFullscreen(value); + } + }, + G_IS_STANDALONE + ), + + // GAME +]; + +export function getApplicationSettingById(id) { + return allApplicationSettings.find(setting => setting.id === id); +} + +class SettingsStorage { + constructor() { + this.uiScale = "regular"; + this.fullscreen = G_IS_STANDALONE; + } +} + +export class ApplicationSettings extends ReadWriteProxy { + constructor(app) { + super(app, "app_settings.bin"); + } + + initialize() { + // Read and directly write latest data back + return this.readAsync().then(() => this.writeAsync()); + } + + save() { + return this.writeAsync(); + } + + // Getters + + /** + * @returns {SettingsStorage} + */ + getAllSettings() { + return this.getCurrentData().settings; + } + + /** + * @param {string} key + */ + getSetting(key) { + assert(this.getAllSettings().hasOwnProperty(key), "Setting not known: " + key); + return this.getAllSettings()[key]; + } + + getInterfaceScaleId() { + if (!this.currentData) { + // Not initialized yet + return "regular"; + } + return this.getAllSettings().uiScale; + } + + getInterfaceScaleValue() { + const id = this.getInterfaceScaleId(); + for (let i = 0; i < uiScales.length; ++i) { + if (uiScales[i].id === id) { + return uiScales[i].size; + } + } + logger.error("Unknown ui scale id:", id); + return 1; + } + + getIsFullScreen() { + return this.getAllSettings().fullscreen; + } + + // Setters + + /** + * @param {string} key + * @param {string|boolean} value + */ + updateSetting(key, value) { + assert(this.getAllSettings().hasOwnProperty(key), "Setting not known: " + key); + this.getAllSettings()[key] = value; + return this.writeAsync(); + } + + // RW Proxy impl + verify(data) { + if (!data.settings) { + return ExplainedResult.bad("missing key 'settings'"); + } + if (typeof data.settings !== "object") { + return ExplainedResult.bad("Bad settings object"); + } + + const settings = data.settings; + for (let i = 0; i < allApplicationSettings.length; ++i) { + const setting = allApplicationSettings[i]; + const storedValue = settings[setting.id]; + if (!setting.validate(storedValue)) { + return ExplainedResult.bad("Bad setting value for " + setting.id + ": " + storedValue); + } + } + return ExplainedResult.good(); + } + + getDefaultData() { + return { + version: this.getCurrentVersion(), + settings: new SettingsStorage(), + }; + } + + getCurrentVersion() { + return 1; + } + + migrate(data) { + // Simply reset + if (data.version < 1) { + data.settings = new SettingsStorage(); + data.version = 1; + } + + return ExplainedResult.good(); + } +} diff --git a/src/js/profile/setting_types.js b/src/js/profile/setting_types.js new file mode 100644 index 00000000..f35d17a6 --- /dev/null +++ b/src/js/profile/setting_types.js @@ -0,0 +1,208 @@ +/* typehints:start */ +import { Application } from "../application"; +/* typehints:end */ + +import { createLogger } from "../core/logging"; + +const logger = createLogger("setting_types"); + +export class BaseSetting { + /** + * + * @param {string} id + * @param {string} categoryId + * @param {function(Application, any):void} changeCb + * @param {boolean} enabled + */ + constructor(id, categoryId, changeCb, enabled) { + this.id = id; + this.categoryId = categoryId; + this.changeCb = changeCb; + this.enabled = enabled; + + /** @type {Application} */ + this.app = null; + + this.element = null; + this.dialogs = null; + } + + /** + * @param {Application} app + * @param {Element} element + * @param {HUDModalDialogs} dialogs + */ + bind(app, element, dialogs) { + this.app = app; + this.element = element; + this.dialogs = dialogs; + } + + getHtml() { + abstract; + return ""; + } + + syncValueToElement() { + abstract; + } + + modify() { + abstract; + } + + showRestartRequiredDialog() { + const { restart } = this.dialogs.showInfo( + "Restart required", + "You need to restart the game to apply the settings.", + this.app.platformWrapper.getSupportsRestart() ? ["later:grey", "restart:misc"] : ["ok:good"] + ); + if (restart) { + restart.add(() => this.app.platformWrapper.performRestart()); + } + } + + /** + * @param {any} value + * @returns {boolean} + */ + validate(value) { + abstract; + return false; + } +} + +export class EnumSetting extends BaseSetting { + constructor( + id, + { + options, + valueGetter, + textGetter, + descGetter = null, + category, + restartRequired = true, + iconPrefix = null, + changeCb = null, + magicValue = null, + enabled = true, + } + ) { + super(id, category, changeCb, enabled); + + this.options = options; + this.valueGetter = valueGetter; + this.textGetter = textGetter; + this.descGetter = descGetter || (() => null); + this.restartRequired = restartRequired; + this.iconPrefix = iconPrefix; + this.magicValue = magicValue; + } + + getHtml() { + return ` +
+
+ +
+
+
+ TODO: SETTING DESC +
+
`; + } + + validate(value) { + if (value === this.magicValue) { + return true; + } + + const availableValues = this.options.map(option => this.valueGetter(option)); + if (availableValues.indexOf(value) < 0) { + logger.error( + "Value '" + value + "' is not contained in available values:", + availableValues, + "of", + this.id + ); + return false; + } + return true; + } + + syncValueToElement() { + const value = this.app.settings.getSetting(this.id); + let displayText = "???"; + const matchedInstance = this.options.find(data => this.valueGetter(data) === value); + if (matchedInstance) { + displayText = this.textGetter(matchedInstance); + } else { + logger.warn("Setting value", value, "not found for", this.id, "!"); + } + this.element.innerText = displayText; + } + + modify() { + const { optionSelected } = this.dialogs.showOptionChooser("TODO: SETTING TITLE", { + active: this.app.settings.getSetting(this.id), + options: this.options.map(option => ({ + value: this.valueGetter(option), + text: this.textGetter(option), + desc: this.descGetter(option), + iconPrefix: this.iconPrefix, + })), + }); + optionSelected.add(value => { + this.app.settings.updateSetting(this.id, value); + this.syncValueToElement(); + + if (this.restartRequired) { + this.showRestartRequiredDialog(); + } + + if (this.changeCb) { + this.changeCb(this.app, value); + } + }, this); + } +} + +export class BoolSetting extends BaseSetting { + constructor(id, category, changeCb = null, enabled = true) { + super(id, category, changeCb, enabled); + } + + getHtml() { + return ` +
+
+ +
+ +
+
+
+ TODO: SETTING DESC +
+
`; + } + + syncValueToElement() { + const value = this.app.settings.getSetting(this.id); + this.element.classList.toggle("checked", value); + } + + modify() { + const newValue = !this.app.settings.getSetting(this.id); + this.app.settings.updateSetting(this.id, newValue); + this.syncValueToElement(); + + if (this.changeCb) { + this.changeCb(this.app, newValue); + } + } + + validate(value) { + return typeof value === "boolean"; + } +} diff --git a/src/js/savegame/savegame.js b/src/js/savegame/savegame.js new file mode 100644 index 00000000..f752c836 --- /dev/null +++ b/src/js/savegame/savegame.js @@ -0,0 +1,237 @@ +/* typehints:start */ +import { Application } from "../application"; +import { GameRoot } from "../game/root"; +/* typehints:end */ + +import { ReadWriteProxy } from "../core/read_write_proxy"; +import { ExplainedResult } from "../core/explained_result"; +import { SavegameSerializer } from "./savegame_serializer"; +import { BaseSavegameInterface } from "./savegame_interface"; +import { createLogger } from "../core/logging"; +import { globalConfig } from "../core/config"; +import { SavegameInterface_V1000 } from "./schemas/1000"; +import { getSavegameInterface } from "./savegame_interface_registry"; + +const logger = createLogger("savegame"); + +export class Savegame extends ReadWriteProxy { + /** + * + * @param {Application} app + * @param {object} param0 + * @param {string} param0.internalId + * @param {import("./savegame_manager").SavegameMetadata} param0.metaDataRef Handle to the meta data + */ + constructor(app, { internalId, metaDataRef }) { + super(app, "savegame-" + internalId + ".bin"); + this.internalId = internalId; + this.metaDataRef = metaDataRef; + + /** @type {SavegameData} */ + this.currentData = this.getDefaultData(); + } + + //////// RW Proxy Impl ////////// + + /** + * @returns {number} + */ + static getCurrentVersion() { + return 1015; + } + + /** + * @returns {typeof BaseSavegameInterface} + */ + static getReaderClass() { + return SavegameInterface_V1000; + } + + /** + * @returns {number} + */ + getCurrentVersion() { + return /** @type {typeof Savegame} */ (this.constructor).getCurrentVersion(); + } + + /** + * Returns the savegames default data + * @returns {SavegameData} + */ + getDefaultData() { + return { + version: this.getCurrentVersion(), + dump: null, + stats: { + buildingsPlaced: 0, + }, + lastUpdate: Date.now(), + }; + } + + /** + * Migrates the savegames data + * @param {SavegameData} data + */ + migrate(data) { + // if (data.version === 1014) { + // if (data.dump) { + // const reader = new SavegameInterface_V1015(fakeLogger, data); + // reader.migrateFrom1014(); + // } + // data.version = 1015; + // } + return ExplainedResult.good(); + } + + /** + * Verifies the savegames data + * @param {SavegameData} data + */ + verify(data) { + if (!data.dump) { + // Well, guess that works + return ExplainedResult.good(); + } + + if (!this.getDumpReaderForExternalData(data).validate()) { + return ExplainedResult.bad("dump-reader-failed-validation"); + } + return ExplainedResult.good(); + } + + //////// Subclasses interface //////// + + /** + * Returns if this game can be saved on disc + * @returns {boolean} + */ + isSaveable() { + return true; + } + /** + * Returns the statistics of the savegame + * @returns {SavegameStats} + */ + getStatistics() { + return this.currentData.stats; + } + + /** + * Returns the *real* last update of the savegame, not the one of the metadata + * which could also be the servers one + */ + getRealLastUpdate() { + return this.currentData.lastUpdate; + } + + /** + * Returns if this game has a serialized game dump + */ + hasGameDump() { + return !!this.currentData.dump; + } + + /** + * Returns the current game dump + * @returns {SerializedGame} + */ + getCurrentDump() { + return this.currentData.dump; + } + + /** + * Returns a reader to access the data + * @returns {BaseSavegameInterface} + */ + getDumpReader() { + if (!this.currentData.dump) { + logger.warn("Getting reader on null-savegame dump"); + } + + const cls = /** @type {typeof Savegame} */ (this.constructor).getReaderClass(); + return new cls(this.currentData); + } + + /** + * Returns a reader to access external data + * @returns {BaseSavegameInterface} + */ + getDumpReaderForExternalData(data) { + assert(data.version, "External data contains no version"); + return getSavegameInterface(data); + } + + ///////// Public Interface /////////// + + /** + * Updates the last update field so we can send the savegame to the server, + * WITHOUT Saving! + */ + setLastUpdate(time) { + this.currentData.lastUpdate = time; + } + + /** + * + * @param {GameRoot} root + */ + updateData(root) { + // Construct a new serializer + const serializer = new SavegameSerializer(); + + // let timer = performanceNow(); + const dump = serializer.generateDumpFromGameRoot(root); + if (!dump) { + return false; + } + // let duration = performanceNow() - timer; + // console.log("TOOK", duration, "ms to generate dump:", dump); + + const shadowData = Object.assign({}, this.currentData); + shadowData.dump = dump; + shadowData.lastUpdate = new Date().getTime(); + shadowData.version = this.getCurrentVersion(); + + const reader = this.getDumpReaderForExternalData(shadowData); + + // Validate (not in prod though) + if (!G_IS_RELEASE) { + const validationResult = reader.validate(); + if (!validationResult) { + return false; + } + } + + // Save data + this.currentData = shadowData; + } + + /** + * Writes the savegame as well as its metadata + */ + writeSavegameAndMetadata() { + return this.writeAsync().then(() => this.saveMetadata()); + } + + /** + * Updates the savegames metadata + */ + saveMetadata() { + const reader = this.getDumpReader(); + this.metaDataRef.lastUpdate = new Date().getTime(); + this.metaDataRef.version = this.getCurrentVersion(); + return this.app.savegameMgr.writeAsync(); + } + + /** + * @see ReadWriteProxy.writeAsync + * @returns {Promise} + */ + writeAsync() { + if (G_IS_DEV && globalConfig.debug.disableSavegameWrite) { + return Promise.resolve(); + } + return super.writeAsync(); + } +} diff --git a/src/js/savegame/savegame_interface.js b/src/js/savegame/savegame_interface.js new file mode 100644 index 00000000..66cada22 --- /dev/null +++ b/src/js/savegame/savegame_interface.js @@ -0,0 +1,108 @@ +import { createLogger } from "../core/logging"; + +const Ajv = require("ajv"); +const ajv = new Ajv({ + allErrors: false, + uniqueItems: false, + unicode: false, + nullable: false, +}); + +const validators = {}; + +const logger = createLogger("savegame_interface"); + +export class BaseSavegameInterface { + /** + * Returns the interfaces version + */ + getVersion() { + throw new Error("Implement get version"); + } + + /** + * Returns the uncached json schema + * @returns {object} + */ + getSchemaUncached() { + throw new Error("Implement get schema"); + return {}; + } + + getValidator() { + const version = this.getVersion(); + if (validators[version]) { + return validators[version]; + } + logger.log("Compiling schema for savegame version", version); + const schema = this.getSchemaUncached(); + try { + validators[version] = ajv.compile(schema); + } catch (ex) { + logger.error("SCHEMA FOR", this.getVersion(), "IS INVALID!"); + logger.error(ex); + throw new Error("Invalid schema for version " + version); + } + return validators[version]; + } + + /** + * Constructs an new interface for the given savegame + * @param {any} data + */ + constructor(data) { + this.data = data; + } + + /** + * Validates the data + * @returns {boolean} + */ + validate() { + const validator = this.getValidator(); + + if (!validator(this.data)) { + logger.error( + "Savegame failed validation! ErrorText:", + ajv.errorsText(validator.errors), + "RawErrors:", + validator.errors + ); + return false; + } + + return true; + } + + ///// INTERFACE (Override when the schema changes) ///// + + /** + * Returns the time of last update + * @returns {number} + */ + readLastUpdate() { + return this.data.lastUpdate; + } + + /** + * Returns the ingame time in seconds + * @returns {number} + */ + readIngameTimeSeconds() { + return this.data.dump.time.timeSeconds; + } + + /** + + + //////// ANTICHEAT /////// + + /** + * Detects cheats in the savegmae - returns false if the game looks cheated + */ + performAnticheatCheck() { + // TODO + + return true; + } +} diff --git a/src/js/savegame/savegame_interface_registry.js b/src/js/savegame/savegame_interface_registry.js new file mode 100644 index 00000000..6ad22a42 --- /dev/null +++ b/src/js/savegame/savegame_interface_registry.js @@ -0,0 +1,35 @@ +import { BaseSavegameInterface } from "./savegame_interface"; +import { SavegameInterface_V1000 } from "./schemas/1000"; +import { createLogger } from "../core/logging"; + +/** @type {Object.} */ +const interfaces = { + 1000: SavegameInterface_V1000, +}; + +const logger = createLogger("savegame_interface_registry"); + +/** + * Returns if the given savegame has any supported interface + * @param {any} savegame + * @returns {BaseSavegameInterface|null} + */ +export function getSavegameInterface(savegame) { + if (!savegame || !savegame.version) { + logger.warn("Savegame does not contain a valid version (undefined)"); + return null; + } + const version = savegame.version; + if (!Number.isInteger(version)) { + logger.warn("Savegame does not contain a valid version (non-integer):", version); + return null; + } + + const interfaceClass = interfaces[version]; + if (!interfaceClass) { + logger.warn("Version", version, "has no implemented interface!"); + return null; + } + + return new interfaceClass(savegame); +} diff --git a/src/js/savegame/savegame_manager.js b/src/js/savegame/savegame_manager.js new file mode 100644 index 00000000..69a275bb --- /dev/null +++ b/src/js/savegame/savegame_manager.js @@ -0,0 +1,211 @@ +import { ExplainedResult } from "../core/explained_result"; +import { createLogger } from "../core/logging"; +import { ReadWriteProxy } from "../core/read_write_proxy"; +import { globalConfig } from "../core/config"; +import { Savegame } from "./savegame"; +import { Math_floor } from "../core/builtins"; + +const logger = createLogger("savegame_manager"); + +const Rusha = require("rusha"); + +/** @enum {string} */ +export const enumLocalSavegameStatus = { + offline: "offline", + synced: "synced", +}; + +/** + * @typedef {{ + * lastUpdate: number, + * version: number, + * internalId: string + * }} SavegameMetadata + * + * @typedef {{ + * version: number, + * savegames: Array + * }} SavegamesData + */ + +export class SavegameManager extends ReadWriteProxy { + constructor(app) { + super(app, "savegames.bin"); + + /** @type {SavegamesData} */ + this.currentData = this.getDefaultData(); + } + + // RW Proxy Impl + /** + * @returns {SavegamesData} + */ + getDefaultData() { + return { + version: this.getCurrentVersion(), + savegames: [], + }; + } + + getCurrentVersion() { + return 1000; + } + + /** + * @returns {SavegamesData} + */ + getCurrentData() { + return super.getCurrentData(); + } + + verify(data) { + // TODO / FIXME!!!! + return ExplainedResult.good(); + } + + /** + * + * @param {SavegamesData} data + */ + migrate(data) { + return ExplainedResult.good(); + } + + // End rw proxy + + /** + * @returns {Array} + */ + getSavegamesMetaData() { + return this.currentData.savegames; + } + + /** + * + * @param {string} internalId + * @returns {Savegame} + */ + getSavegameById(internalId) { + const metadata = this.getGameMetaDataByInternalId(internalId); + if (!metadata) { + return null; + } + return new Savegame(this.app, { internalId, metaDataRef: metadata }); + } + + /** + * Deletes a savegame + * @param {SavegameMetadata} game + */ + deleteSavegame(game) { + const handle = new Savegame(this.app, { + internalId: game.internalId, + metaDataRef: game, + }); + + return handle.deleteAsync().then(() => { + for (let i = 0; i < this.currentData.savegames.length; ++i) { + const potentialGame = this.currentData.savegames[i]; + if (potentialGame.internalId === handle.internalId) { + this.currentData.savegames.splice(i, 1); + break; + } + } + + return this.writeAsync(); + }); + } + + /** + * Returns a given games metadata by id + * @param {string} id + * @returns {SavegameMetadata} + */ + getGameMetaDataByInternalId(id) { + for (let i = 0; i < this.currentData.savegames.length; ++i) { + const data = this.currentData.savegames[i]; + if (data.internalId === id) { + return data; + } + } + logger.error("Savegame internal id not found:", id); + return null; + } + + /** + * Creates a new savegame + * @returns {Savegame} + */ + createNewSavegame() { + const id = this.generateInternalId(); + + const metaData = /** @type {SavegameMetadata} */ ({ + lastUpdate: Date.now(), + version: Savegame.getCurrentVersion(), + internalId: id, + }); + + this.currentData.savegames.push(metaData); + this.sortSavegames(); + + return new Savegame(this.app, { + internalId: id, + metaDataRef: metaData, + }); + } + + /** + * Sorts all savegames by their creation time descending + * @returns {Promise} + */ + sortSavegames() { + this.currentData.savegames.sort((a, b) => b.lastUpdate - a.lastUpdate); + let promiseChain = Promise.resolve(); + while (this.currentData.savegames.length > 100) { + const toRemove = this.currentData.savegames.pop(); + + // Try to remove the savegame since its no longer available + const game = new Savegame(this.app, { + internalId: toRemove.internalId, + metaDataRef: toRemove, + }); + promiseChain = promiseChain + .then(() => game.deleteAsync()) + .then( + () => {}, + err => { + logger.error(this, "Failed to remove old savegame:", toRemove, ":", err); + } + ); + } + + return promiseChain; + } + + /** + * Helper method to generate a new internal savegame id + */ + generateInternalId() { + const timestamp = ("" + Math_floor(Date.now() / 1000.0 - 1565641619)).padStart(10, "0"); + return ( + timestamp + + "." + + Rusha.createHash() + .update(Date.now() + "/" + Math.random()) + .digest("hex") + ); + } + + // End + + initialize() { + // First read, then directly write to ensure we have the latest data + // @ts-ignore + return this.readAsync().then(() => { + if (G_IS_DEV && globalConfig.debug.disableSavegameWrite) { + return Promise.resolve(); + } + return this.writeAsync(); + }); + } +} diff --git a/src/js/savegame/savegame_serializer.js b/src/js/savegame/savegame_serializer.js new file mode 100644 index 00000000..0c02e550 --- /dev/null +++ b/src/js/savegame/savegame_serializer.js @@ -0,0 +1,216 @@ +/* typehints:start */ +import { Component } from "../game/component"; +import { GameRoot } from "../game/root"; +/* typehints:end */ + +import { JSON_stringify } from "../core/builtins"; +import { ExplainedResult } from "../core/explained_result"; +import { createLogger } from "../core/logging"; +// import { BuildingComponent } from "../components/impl/building"; +import { gComponentRegistry } from "../core/global_registries"; +import { SerializerInternal } from "./serializer_internal"; + +const logger = createLogger("savegame_serializer"); + +/** + * Allows to serialize a savegame + */ +export class SavegameSerializer { + constructor() { + this.internal = new SerializerInternal(); + } + + /** + * Serializes the game root into a dump + * @param {GameRoot} root + * @param {boolean=} sanityChecks Whether to check for validity + * @returns {SerializedGame} + */ + generateDumpFromGameRoot(root, sanityChecks = true) { + // Finalize particles before saving (Like granting destroy indicator rewards) + // root.particleMgr.finalizeBeforeSave(); + // root.uiParticleMgr.finalizeBeforeSave(); + + // Now store generic savegame payload + const data = /** @type {SerializedGame} */ ({ + camera: root.camera.serialize(), + time: root.time.serialize(), + entityMgr: root.entityMgr.serialize(), + entities: {}, + }); + + // Serialize all types of entities + const serializeEntities = component => + this.internal.serializeEntityArray(root.entityMgr.getAllWithComponent(component)); + const serializeEntitiesFixed = component => + this.internal.serializeEntityArrayFixedType(root.entityMgr.getAllWithComponent(component)); + + // data.entities.resources = serializeEntitiesFixed(RawMaterialComponent); + // data.entities.buildings = serializeEntities(BuildingComponent); + + if (!G_IS_RELEASE) { + if (sanityChecks) { + // Sanity check + const sanity = this.verifyLogicalErrors(data); + if (!sanity.result) { + logger.error("Created invalid savegame:", sanity.reason, "savegame:", data); + return null; + } + } + } + + return data; + } + + /** + * Verifies if there are logical errors in the savegame + * @param {SerializedGame} savegame + * @returns {ExplainedResult} + */ + verifyLogicalErrors(savegame) { + if (!savegame.entities) { + return ExplainedResult.bad("Savegame has no entities"); + } + + const seenUids = []; + + // Check for duplicate UIDS + for (const entityListId in savegame.entities) { + for (let i = 0; i < savegame.entities[entityListId].length; ++i) { + const list = savegame.entities[entityListId][i]; + for (let k = 0; k < list.length; ++k) { + const entity = list[k]; + const uid = entity.uid; + if (!Number.isInteger(uid)) { + return ExplainedResult.bad("Entity has invalid uid: " + uid); + } + if (seenUids.indexOf(uid) >= 0) { + return ExplainedResult.bad("Duplicate uid " + uid); + } + seenUids.push(uid); + + // Verify components + if (!entity.components) { + return ExplainedResult.bad( + "Entity is missing key 'components': " + JSON_stringify(entity) + ); + } + const components = entity.components; + for (const componentId in components) { + // Verify component data + const componentData = components[componentId]; + const componentClass = gComponentRegistry.findById(componentId); + + // Check component id is known + if (!componentClass) { + return ExplainedResult.bad("Unknown component id: " + componentId); + } + + // Check component data is ok + const componentVerifyError = /** @type {typeof Component} */ (componentClass).verify( + componentData + ); + if (componentVerifyError) { + return ExplainedResult.bad( + "Component " + componentId + " has invalid data: " + componentVerifyError + ); + } + } + } + } + } + + return ExplainedResult.good(); + } + + /** + * Tries to load the savegame from a given dump + * @param {SerializedGame} savegame + * @param {GameRoot} root + * @returns {ExplainedResult} + */ + deserialize(savegame, root) { + // Sanity + const verifyResult = this.verifyLogicalErrors(savegame); + if (!verifyResult.result) { + return ExplainedResult.bad(verifyResult.reason); + } + + let errorReason = null; + + // entities + errorReason = errorReason || root.entityMgr.deserialize(savegame.entityMgr); + + // resources + errorReason = + errorReason || + this.internal.deserializeEntityArrayFixedType( + root, + savegame.entities.resources, + this.internal.deserializeResource + ); + + // buildings + errorReason = + errorReason || + this.internal.deserializeEntityArray( + root, + savegame.entities.buildings, + this.internal.deserializeBuilding + ); + + // other stuff + errorReason = errorReason || root.time.deserialize(savegame.time); + errorReason = errorReason || root.camera.deserialize(savegame.camera); + + // Check for errors + if (errorReason) { + return ExplainedResult.bad(errorReason); + } + + return ExplainedResult.good(); + } + + /////////// MIGRATION HELPERS /////////// + + /** + * Performs a function on each component (useful to add / remove / alter properties for migration) + * @param {SerializedGame} savegame + * @param {typeof Component} componentHandle + * @param {function} modifier + */ + migration_migrateComponent(savegame, componentHandle, modifier) { + const targetId = componentHandle.getId(); + for (const entityListId in savegame.entities) { + for (let i = 0; i < savegame.entities[entityListId].length; ++i) { + const list = savegame.entities[entityListId][i]; + for (let k = 0; k < list.length; ++k) { + const entity = list[k]; + const components = entity.components; + if (components[targetId]) { + modifier(components[targetId]); + } + } + } + } + } + + /** + * Performs an operation on each object which is a PooledObject (usually Projectiles). Useful to + * perform migrations + * @param {Array} pools + * @param {string} targetClassKey + * @param {function} modifier + */ + migration_migrateGenericObjectPool(pools, targetClassKey, modifier) { + for (let i = 0; i < pools.length; ++i) { + const pool = pools[i]; + if (pool.key === targetClassKey) { + const entries = pool.data.entries; + for (const uid in entries) { + modifier(entries[uid]); + } + } + } + } +} diff --git a/src/js/savegame/savegame_typedefs.js b/src/js/savegame/savegame_typedefs.js new file mode 100644 index 00000000..3ab73761 --- /dev/null +++ b/src/js/savegame/savegame_typedefs.js @@ -0,0 +1,35 @@ +/** + * @typedef {{ + * buildingsPlaced: number + * }} SavegameStats + */ + +/** + * @typedef {{ + * x: number, + * y: number, + * uid: number, + * key: string + * }} SerializedMapResource + */ + +/** + * @typedef {{ + * camera: any, + * time: any, + * entityMgr: any, + * entities: { + * resources: Array, + * buildings: Array + * } + * }} SerializedGame + */ + +/** + * @typedef {{ + * version: number, + * dump: SerializedGame, + * stats: SavegameStats, + * lastUpdate: number + * }} SavegameData + */ diff --git a/src/js/savegame/schemas/1000.js b/src/js/savegame/schemas/1000.js new file mode 100644 index 00000000..29cd0b1a --- /dev/null +++ b/src/js/savegame/schemas/1000.js @@ -0,0 +1,13 @@ +import { BaseSavegameInterface } from "../savegame_interface.js"; + +const schema = require("./1000.json"); + +export class SavegameInterface_V1000 extends BaseSavegameInterface { + getVersion() { + return 1000; + } + + getSchemaUncached() { + return schema; + } +} diff --git a/src/js/savegame/schemas/1000.json b/src/js/savegame/schemas/1000.json new file mode 100644 index 00000000..6682f615 --- /dev/null +++ b/src/js/savegame/schemas/1000.json @@ -0,0 +1,5 @@ +{ + "type": "object", + "required": [], + "additionalProperties": true +} diff --git a/src/js/savegame/serialization.js b/src/js/savegame/serialization.js new file mode 100644 index 00000000..a6c8f4c0 --- /dev/null +++ b/src/js/savegame/serialization.js @@ -0,0 +1,330 @@ +import { JSON_stringify } from "../core/builtins"; +import { + BaseDataType, + TypeArray, + TypeBoolean, + TypeClass, + TypeClassId, + TypeEntity, + TypeEntityWeakref, + TypeEnum, + TypeFixedClass, + TypeInteger, + TypeKeyValueMap, + TypeMetaClass, + TypeNullable, + TypeNumber, + TypePair, + TypePositiveInteger, + TypePositiveNumber, + TypeString, + TypeVector, + TypeClassFromMetaclass, + TypeClassData, +} from "./serialization_data_types"; +import { createLogger } from "../core/logging"; + +const logger = createLogger("serialization"); + +// Schema declarations +export const types = { + int: new TypeInteger(), + uint: new TypePositiveInteger(), + float: new TypeNumber(), + ufloat: new TypePositiveNumber(), + string: new TypeString(), + entity: new TypeEntity(), + weakEntityRef: new TypeEntityWeakref(), + vector: new TypeVector(), + tileVector: new TypeVector(), + bool: new TypeBoolean(), + + /** + * @param {BaseDataType} wrapped + */ + nullable(wrapped) { + return new TypeNullable(wrapped); + }, + + /** + * @param {FactoryTemplate<*>|SingletonFactoryTemplate<*>} registry + */ + classId(registry) { + return new TypeClassId(registry); + }, + /** + * @param {BaseDataType} valueType + * @param {boolean=} includeEmptyValues + */ + keyValueMap(valueType, includeEmptyValues = true) { + return new TypeKeyValueMap(valueType, includeEmptyValues); + }, + + /** + * @param {Array} values + */ + enum(values) { + return new TypeEnum(values); + }, + + /** + * @param {FactoryTemplate<*>} registry + */ + obj(registry) { + return new TypeClass(registry); + }, + + /** + * @param {FactoryTemplate<*>} registry + */ + objData(registry) { + return new TypeClassData(registry); + }, + + /** + * @param {typeof BasicSerializableObject} cls + */ + knownType(cls) { + return new TypeFixedClass(cls); + }, + + /** + * @param {BaseDataType} innerType + */ + array(innerType) { + return new TypeArray(innerType); + }, + + /** + * @param {SingletonFactoryTemplate<*>} innerType + */ + classRef(registry) { + return new TypeMetaClass(registry); + }, + + /** + * @param {BaseDataType} a + * @param {BaseDataType} b + */ + pair(a, b) { + return new TypePair(a, b); + }, + + /** + * @param {typeof BasicSerializableObject} classHandle + * @param {SingletonFactoryTemplate<*>} registry + */ + classWithMetaclass(classHandle, registry) { + return new TypeClassFromMetaclass(classHandle, registry); + }, +}; + +/** + * A full schema declaration + * @typedef {Object.} Schema + */ + +const globalSchemaCache = {}; + +/* dev:start */ +const classnamesCache = {}; +/* dev:end*/ + +export class BasicSerializableObject { + /* dev:start */ + /** + * Fixes typeof DerivedComponent is not assignable to typeof Component, compiled out + * in non-dev builds + */ + constructor(...args) {} + + /* dev:end */ + + static getId() { + abstract; + } + + /** + * Should return the serialization schema + * @returns {Schema} + */ + static getSchema() { + return {}; + } + + // Implementation + /** @returns {Schema} */ + static getCachedSchema() { + const id = this.getId(); + + /* dev:start */ + assert( + classnamesCache[id] === this || classnamesCache[id] === undefined, + "Class name taken twice: " + id + " (from " + this.name + ")" + ); + classnamesCache[id] = this; + /* dev:end */ + + const entry = globalSchemaCache[id]; + if (entry) { + return entry; + } + + const schema = this.getSchema(); + globalSchemaCache[id] = schema; + return schema; + } + + /** @returns {object} */ + serialize() { + return serializeSchema( + this, + /** @type {typeof BasicSerializableObject} */ (this.constructor).getCachedSchema() + ); + } + + /** @returns {string|void} */ + deserialize(data) { + return deserializeSchema( + this, + /** @type {typeof BasicSerializableObject} */ (this.constructor).getCachedSchema(), + data + ); + } + + /** @returns {string|void} */ + static verify(data) { + return verifySchema(this.getCachedSchema(), data); + } +} + +/** + * Serializes an object using the given schema, mergin with the given properties + * @param {object} obj The object to serialize + * @param {Schema} schema The schema to use + * @param {object=} mergeWith Any additional properties to merge with the schema, useful for super calls + * @returns {object} Serialized data object + */ +export function serializeSchema(obj, schema, mergeWith = {}) { + for (const key in schema) { + if (!obj.hasOwnProperty(key)) { + logger.error("Invalid schema, property", key, "does not exist on", obj, "(schema=", schema, ")"); + assert( + obj.hasOwnProperty(key), + "serialization: invalid schema, property does not exist on object: " + key + ); + } + if (!schema[key]) { + assert(false, "Invalid schema: " + JSON_stringify(schema) + " / " + key); + } + + if (G_IS_DEV) { + try { + mergeWith[key] = schema[key].serialize(obj[key]); + } catch (ex) { + logger.error( + "Serialization of", + obj, + "failed on key '" + key + "' ->", + ex, + "(schema was", + schema, + ")" + ); + throw ex; + } + } else { + mergeWith[key] = schema[key].serialize(obj[key]); + } + } + return mergeWith; +} + +/** + * Deserializes data into an object + * @param {object} obj The object to store the deserialized data into + * @param {Schema} schema The schema to use + * @param {object} data The serialized data + * @param {string|void|null=} baseclassErrorResult Convenience, if this is a string error code, do nothing and return it + * @returns {string|void} String error code or nothing on success + */ +export function deserializeSchema(obj, schema, data, baseclassErrorResult = null) { + if (baseclassErrorResult) { + return baseclassErrorResult; + } + + if (!data) { + logger.error("Got 'NULL' data for", obj, "and schema", schema, "!"); + return "Got null data"; + } + + for (const key in schema) { + if (!data.hasOwnProperty(key)) { + logger.error("Data", data, "does not contain", key, "(schema:", schema, ")"); + return "Missing key in schema: " + key + " of class " + obj.constructor.name; + } + if (!schema[key].allowNull() && (data[key] === null || data[key] === undefined)) { + logger.error("Data", data, "has null value for", key, "(schema:", schema, ")"); + return "Non-nullable entry is null: " + key + " of class " + obj.constructor.name; + } + + const errorStatus = schema[key].deserializeWithVerify(data[key], obj, key, obj.root); + if (errorStatus) { + error( + "serialization", + "Deserialization failed with error '" + errorStatus + "' on object", + obj, + "and key", + key, + "(root? =", + obj.root ? "y" : "n", + ")" + ); + return errorStatus; + } + } +} + +/** + * Verifies stored data using the given schema + * @param {Schema} schema The schema to use + * @param {object} data The data to verify + * @returns {string|void} String error code or nothing on success + */ +export function verifySchema(schema, data) { + for (const key in schema) { + if (!data.hasOwnProperty(key)) { + error("verify", "Data", data, "does not contain", key, "(schema:", schema, ")"); + return "verify: missing key required by schema in stored data: " + key; + } + if (!schema[key].allowNull() && (data[key] === null || data[key] === undefined)) { + error("verify", "Data", data, "has null value for", key, "(schema:", schema, ")"); + return "verify: non-nullable entry is null: " + key; + } + + const errorStatus = schema[key].verifySerializedValue(data[key]); + if (errorStatus) { + error("verify", errorStatus); + return "verify: " + errorStatus; + } + } +} + +/** + * Extends a schema by adding the properties from the new schema to the existing base schema + * @param {Schema} base + * @param {Schema} newOne + * @returns {Schema} + */ +export function extendSchema(base, newOne) { + /** @type {Schema} */ + const result = Object.assign({}, base); + for (const key in newOne) { + if (result.hasOwnProperty(key)) { + logger.error("Extend schema got duplicate key:", key); + continue; + } + result[key] = newOne[key]; + } + return result; +} diff --git a/src/js/savegame/serialization_data_types.js b/src/js/savegame/serialization_data_types.js new file mode 100644 index 00000000..240e2313 --- /dev/null +++ b/src/js/savegame/serialization_data_types.js @@ -0,0 +1,1204 @@ +/* typehints:start */ +import { GameRoot } from "../game/root"; +import { BasicSerializableObject } from "./serialization"; +/* typehints:end */ + +import { Vector } from "../core/vector"; +import { round4Digits, schemaObject } from "../core/utils"; +import { JSON_stringify } from "../core/builtins"; + +export const globalJsonSchemaDefs = {}; + +/** + * + * @param {import("./serialization").Schema} schema + */ +export function schemaToJsonSchema(schema) { + const jsonSchema = { + type: "object", + additionalProperties: false, + required: [], + properties: {}, + }; + + for (const key in schema) { + const subSchema = schema[key].getAsJsonSchema(); + jsonSchema.required.push(key); + jsonSchema.properties[key] = subSchema; + } + + return jsonSchema; +} + +/** + * Base serialization data type + */ +export class BaseDataType { + /** + * Serializes a given raw value + * @param {any} value + */ + serialize(value) { + abstract; + return {}; + } + + /** + * Verifies a given serialized value + * @param {any} value + * @returns {string|void} String error code or null on success + */ + verifySerializedValue(value) {} + + /** + * Deserializes a serialized value into the target object under the given key + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + abstract; + } + + /** + * Returns the json schema + */ + getAsJsonSchema() { + const key = this.getCacheKey(); + const schema = this.getAsJsonSchemaUncached(); + + if (!globalJsonSchemaDefs[key]) { + // schema.$id = key; + globalJsonSchemaDefs[key] = schema; + } + + return { + $ref: "#/definitions/" + key, + }; + + // return this.getAsJsonSchemaUncached(); + // if (!globalJsonSchemaDefs[key]) { + // // schema.$id = key; + // globalJsonSchemaDefs[key] = { + // $id: key, + // definitions: { + // ["d-" + key]: schema + // } + // }; + // } + + // return { + // $ref: key + "#/definitions/d-" + key + // } + + // // return this.getAsJsonSchemaUncached(); + } + + /** + * INTERNAL Should return the json schema representation + */ + getAsJsonSchemaUncached() { + abstract; + } + + /** + * Returns whether null values are okay + * @returns {boolean} + */ + allowNull() { + return false; + } + + // Helper methods + + /** + * Deserializes a serialized value, but performs integrity checks before + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserializeWithVerify(value, targetObject, targetKey, root) { + const errorCode = this.verifySerializedValue(value); + if (errorCode) { + return ( + "serialization verify failed: " + + errorCode + + " [value " + + JSON_stringify(value).substr(0, 100) + + "]" + ); + } + return this.deserialize(value, targetObject, targetKey, root); + } + + /** + * Should return a cacheable key + */ + getCacheKey() { + abstract; + return ""; + } +} + +export class TypeInteger extends BaseDataType { + serialize(value) { + assert(Number.isInteger(value), "Type integer got non integer for serialize: " + value); + return value; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + + getAsJsonSchemaUncached() { + return { + type: "integer", + }; + } + + verifySerializedValue(value) { + if (!Number.isInteger(value)) { + return "Not a valid number"; + } + } + + getCacheKey() { + return "int"; + } +} + +export class TypePositiveInteger extends BaseDataType { + serialize(value) { + assert(Number.isInteger(value), "Type integer got non integer for serialize: " + value); + assert(value >= 0, "value < 0: " + value); + return value; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + + getAsJsonSchemaUncached() { + return { + type: "integer", + minimum: 0, + }; + } + + verifySerializedValue(value) { + if (!Number.isInteger(value)) { + return "Not a valid number"; + } + if (value < 0) { + return "Negative value for positive integer"; + } + } + + getCacheKey() { + return "uint"; + } +} + +export class TypeBoolean extends BaseDataType { + serialize(value) { + assert(value === true || value === false, "Type bool got non bool for serialize: " + value); + return value; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + + getAsJsonSchemaUncached() { + return { + type: "boolean", + }; + } + + verifySerializedValue(value) { + if (value !== true && value !== false) { + return "Not a boolean"; + } + } + + getCacheKey() { + return "bool"; + } +} + +export class TypeString extends BaseDataType { + serialize(value) { + assert(typeof value === "string", "Type string got non string for serialize: " + value); + return value; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + getAsJsonSchemaUncached() { + return { + type: "string", + }; + } + + verifySerializedValue(value) { + if (typeof value !== "string") { + return "Not a valid string"; + } + } + + getCacheKey() { + return "string"; + } +} + +export class TypeVector extends BaseDataType { + serialize(value) { + assert(value instanceof Vector, "Type vector got non vector for serialize: " + value); + return { + x: round4Digits(value.x), + y: round4Digits(value.y), + }; + } + + getAsJsonSchemaUncached() { + return schemaObject({ + x: { + type: "number", + }, + y: { + type: "number", + }, + }); + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = new Vector(value.x, value.y); + } + + verifySerializedValue(value) { + if (!Number.isFinite(value.x) || !Number.isFinite(value.y)) { + return "Not a valid vector, missing x/y or bad data type"; + } + } + + getCacheKey() { + return "vector"; + } +} + +export class TypeTileVector extends BaseDataType { + serialize(value) { + assert(value instanceof Vector, "Type vector got non vector for serialize: " + value); + assert(Number.isInteger(value.x) && value.x > 0, "Invalid tile x:" + value.x); + assert(Number.isInteger(value.y) && value.y > 0, "Invalid tile x:" + value.y); + return { x: value.x, y: value.y }; + } + + getAsJsonSchemaUncached() { + return schemaObject({ + x: { + type: "integer", + minimum: 0, + maximum: 256, + }, + y: { + type: "integer", + minimum: 0, + maximum: 256, + }, + }); + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = new Vector(value.x, value.y); + } + + verifySerializedValue(value) { + if (!Number.isInteger(value.x) || !Number.isInteger(value.y)) { + return "Not a valid tile vector, missing x/y or bad data type"; + } + if (value.x < 0 || value.y < 0) { + return "Invalid tile vector, x or y < 0"; + } + } + + getCacheKey() { + return "tilevector"; + } +} + +export class TypeNumber extends BaseDataType { + serialize(value) { + assert(Number.isFinite(value), "Type number got non number for serialize: " + value); + assert(!Number.isNaN(value), "Value is nan: " + value); + return round4Digits(value); + } + + getAsJsonSchemaUncached() { + return { + type: "number", + }; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + + verifySerializedValue(value) { + if (!Number.isFinite(value)) { + return "Not a valid number: " + value; + } + } + + getCacheKey() { + return "float"; + } +} + +export class TypePositiveNumber extends BaseDataType { + serialize(value) { + assert(Number.isFinite(value), "Type number got non number for serialize: " + value); + assert(value >= 0, "Postitive number got negative value: " + value); + return round4Digits(value); + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + + getAsJsonSchemaUncached() { + return { + type: "number", + minimum: 0, + }; + } + + verifySerializedValue(value) { + if (!Number.isFinite(value)) { + return "Not a valid number: " + value; + } + if (value < 0) { + return "Positive number got negative value: " + value; + } + } + + getCacheKey() { + return "ufloat"; + } +} + +export class TypeEnum extends BaseDataType { + /** + * @param {Array} availableValues + */ + constructor(availableValues = []) { + super(); + this.availableValues = availableValues; + } + + serialize(value) { + assert(this.availableValues.indexOf(value) >= 0, "Unknown value: " + value); + return value; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + + getAsJsonSchemaUncached() { + return { + type: "string", + enum: this.availableValues, + }; + } + + verifySerializedValue(value) { + if (this.availableValues.indexOf(value) < 0) { + return "Unknown enum value: " + value; + } + } + + getCacheKey() { + return "enum." + this.availableValues.join(","); + } +} + +export class TypeEntity extends BaseDataType { + serialize(value) { + // assert(value instanceof Entity, "Not a valid entity ref: " + value); + assert(value.uid, "Entity has no uid yet"); + assert(!value.destroyed, "Entity already destroyed"); + assert(!value.queuedForDestroy, "Entity queued for destroy"); + + return value.uid; + } + + getAsJsonSchemaUncached() { + return { + type: "integer", + minimum: 0, + }; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + const entity = root.entityMgr.findByUid(value); + if (!entity) { + return "Entity not found by uid: " + value; + } + targetObject[targetKey] = entity; + } + + verifySerializedValue(value) { + if (!Number.isFinite(value)) { + return "Not a valid uuid: " + value; + } + } + + getCacheKey() { + return "entity"; + } +} + +export class TypeEntityWeakref extends BaseDataType { + serialize(value) { + if (value === null) { + return null; + } + + // assert(value instanceof Entity, "Not a valid entity ref (weak): " + value); + assert(value.uid, "Entity has no uid yet"); + if (value.destroyed || value.queuedForDestroy) { + return null; + } + return value.uid; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + if (value === null) { + targetObject[targetKey] = null; + return; + } + const entity = root.entityMgr.findByUid(value, false); + targetObject[targetKey] = entity; + } + + getAsJsonSchemaUncached() { + return { + type: ["null", "integer"], + minimum: 0, + }; + } + + allowNull() { + return true; + } + + verifySerializedValue(value) { + if (value !== null && !Number.isFinite(value)) { + return "Not a valid uuid: " + value; + } + } + + getCacheKey() { + return "entity-weakref"; + } +} + +export class TypeClass extends BaseDataType { + /** + * + * @param {FactoryTemplate<*>} registry + */ + constructor(registry) { + super(); + this.registry = registry; + } + + serialize(value) { + assert(typeof value === "object", "Not a class instance: " + value); + return { + $: value.constructor.getId(), + data: value.serialize(), + }; + } + + getAsJsonSchemaUncached() { + const options = []; + const entries = this.registry.getEntries(); + for (let i = 0; i < entries.length; ++i) { + const entry = entries[i]; + + options.push( + schemaObject({ + $: { + type: "string", + // @ts-ignore + enum: [entry.getId()], + }, + // @ts-ignore + data: schemaToJsonSchema(entry.getCachedSchema()), + }) + ); + } + + return { oneOf: options }; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + const instanceClass = this.registry.findById(value.$); + if (!instanceClass || !instanceClass.prototype) { + return "Invalid class id (runtime-err): " + value.$ + "->" + instanceClass; + } + const instance = Object.create(instanceClass.prototype); + const errorState = instance.deserialize(value.data); + if (errorState) { + return errorState; + } + targetObject[targetKey] = instance; + } + + verifySerializedValue(value) { + if (!value) { + return "Got null data"; + } + + if (!this.registry.hasId(value.$)) { + return "Invalid class id: " + value.$; + } + } + + getCacheKey() { + return "class." + this.registry.getId(); + } +} + +export class TypeClassData extends BaseDataType { + /** + * + * @param {FactoryTemplate<*>} registry + */ + constructor(registry) { + super(); + this.registry = registry; + } + + serialize(value) { + assert(typeof value === "object", "Not a class instance: " + value); + return value.serialize(); + } + + getAsJsonSchemaUncached() { + const options = []; + const entries = this.registry.getEntries(); + for (let i = 0; i < entries.length; ++i) { + const entry = entries[i]; + options.push( + schemaToJsonSchema(/** @type {typeof BasicSerializableObject} */ (entry).getCachedSchema()) + ); + } + return { oneOf: options }; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + assert(false, "can not deserialize class data"); + } + + verifySerializedValue(value) { + if (!value) { + return "Got null data"; + } + } + + getCacheKey() { + return "class." + this.registry.getId(); + } +} + +export class TypeClassFromMetaclass extends BaseDataType { + /** + * + * @param {typeof BasicSerializableObject} classHandle + * @param {SingletonFactoryTemplate<*>} registry + */ + constructor(classHandle, registry) { + super(); + this.registry = registry; + this.classHandle = classHandle; + } + + serialize(value) { + assert(typeof value === "object", "Not a class instance: " + value); + return { + $: value.getMetaclass().getId(), + data: value.serialize(), + }; + } + + getAsJsonSchemaUncached() { + // const options = []; + const ids = this.registry.getAllIds(); + + return { + $: { + type: "string", + enum: ids, + }, + data: schemaToJsonSchema(this.classHandle.getCachedSchema()), + }; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + const metaClassInstance = this.registry.findById(value.$); + if (!metaClassInstance || !metaClassInstance.prototype) { + return "Invalid meta class id (runtime-err): " + value.$ + "->" + metaClassInstance; + } + + const instanceClass = metaClassInstance.getInstanceClass(); + const instance = Object.create(instanceClass.prototype); + const errorState = instance.deserialize(value.data); + if (errorState) { + return errorState; + } + targetObject[targetKey] = instance; + } + + verifySerializedValue(value) { + if (!value) { + return "Got null data"; + } + + if (!this.registry.hasId(value.$)) { + return "Invalid class id: " + value.$; + } + } + + getCacheKey() { + return "classofmetaclass." + this.registry.getId(); + } +} + +export class TypeMetaClass extends BaseDataType { + /** + * + * @param {SingletonFactoryTemplate<*>} registry + */ + constructor(registry) { + super(); + this.registry = registry; + } + + serialize(value) { + return value.getId(); + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + const instanceClass = this.registry.findById(value); + if (!instanceClass) { + return "Invalid class id (runtime-err): " + value; + } + targetObject[targetKey] = instanceClass; + } + + getAsJsonSchemaUncached() { + return { + type: "string", + enum: this.registry.getAllIds(), + }; + } + + verifySerializedValue(value) { + if (!value) { + return "Got null data"; + } + + if (typeof value !== "string") { + return "Got non string data"; + } + + if (!this.registry.hasId(value)) { + return "Invalid class id: " + value; + } + } + + getCacheKey() { + return "metaclass." + this.registry.getId(); + } +} + +export class TypeArray extends BaseDataType { + /** + * @param {BaseDataType} innerType + */ + constructor(innerType) { + super(); + this.innerType = innerType; + } + + serialize(value) { + assert(Array.isArray(value), "Not an array"); + const result = new Array(value.length); + for (let i = 0; i < value.length; ++i) { + result[i] = this.innerType.serialize(value[i]); + } + return result; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + const result = new Array(value.length); + for (let i = 0; i < value.length; ++i) { + const errorStatus = this.innerType.deserializeWithVerify(value[i], result, i, root); + if (errorStatus) { + return errorStatus; + } + } + targetObject[targetKey] = result; + } + + getAsJsonSchemaUncached() { + return { + type: "array", + items: this.innerType.getAsJsonSchema(), + }; + } + + verifySerializedValue(value) { + if (!Array.isArray(value)) { + return "Not an array: " + value; + } + } + + getCacheKey() { + return "array." + this.innerType.getCacheKey(); + } +} + +export class TypeFixedClass extends BaseDataType { + /** + * + * @param {typeof BasicSerializableObject} baseclass + */ + constructor(baseclass) { + super(); + this.baseclass = baseclass; + } + + serialize(value) { + assert(value instanceof this.baseclass, "Not a valid class instance"); + return value.serialize(); + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + const instance = Object.create(this.baseclass.prototype); + const errorState = instance.deserialize(value); + if (errorState) { + return "Failed to deserialize class: " + errorState; + } + targetObject[targetKey] = instance; + } + + getAsJsonSchemaUncached() { + this.baseclass.getSchema(); + this.baseclass.getCachedSchema(); + return schemaToJsonSchema(this.baseclass.getCachedSchema()); + } + + verifySerializedValue(value) { + if (!value) { + return "Got null data"; + } + } + + getCacheKey() { + return "fixedclass." + this.baseclass.getId(); + } +} + +export class TypeKeyValueMap extends BaseDataType { + /** + * @param {BaseDataType} valueType + * @param {boolean=} includeEmptyValues + */ + constructor(valueType, includeEmptyValues = true) { + super(); + this.valueType = valueType; + this.includeEmptyValues = includeEmptyValues; + } + + serialize(value) { + assert(typeof value === "object", "not an object"); + let result = {}; + for (const key in value) { + const serialized = this.valueType.serialize(value[key]); + if (!this.includeEmptyValues && typeof serialized === "object") { + if ( + serialized.$ && + typeof serialized.data === "object" && + Object.keys(serialized.data).length === 0 + ) { + continue; + } else if (Object.keys(serialized).length === 0) { + continue; + } + } + + result[key] = serialized; + } + return result; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + let result = {}; + for (const key in value) { + const errorCode = this.valueType.deserializeWithVerify(value[key], result, key, root); + if (errorCode) { + return errorCode; + } + } + targetObject[targetKey] = result; + } + + getAsJsonSchemaUncached() { + return { + type: "object", + additionalProperties: this.valueType.getAsJsonSchema(), + }; + } + + verifySerializedValue(value) { + if (typeof value !== "object") { + return "KV map is not an object"; + } + } + + getCacheKey() { + return "kvmap." + this.valueType.getCacheKey(); + } +} + +export class TypeClassId extends BaseDataType { + /** + * @param {FactoryTemplate<*>|SingletonFactoryTemplate<*>} registry + */ + constructor(registry) { + super(); + this.registry = registry; + } + + serialize(value) { + assert(typeof value === "string", "Not a valid string"); + assert(this.registry.hasId(value), "Id " + value + " not found in registry"); + return value; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + targetObject[targetKey] = value; + } + + getAsJsonSchemaUncached() { + return { + type: "string", + enum: this.registry.getAllIds(), + }; + } + + verifySerializedValue(value) { + if (typeof value !== "string") { + return "Not a valid registry id key: " + value; + } + if (!this.registry.hasId(value)) { + return "Id " + value + " not known to registry"; + } + } + + getCacheKey() { + return "classid." + this.registry.getId(); + } +} + +export class TypePair extends BaseDataType { + /** + * @param {BaseDataType} type1 + * @param {BaseDataType} type2 + */ + constructor(type1, type2) { + super(); + this.type1 = type1; + this.type2 = type2; + } + + serialize(value) { + assert(Array.isArray(value), "pair: not an array"); + assert(value.length === 2, "pair: length != 2"); + return [this.type1.serialize(value[0]), this.type2.serialize(value[1])]; + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + const result = [undefined, undefined]; + + let errorCode = this.type1.deserialize(value, result, 0, root); + if (errorCode) { + return errorCode; + } + + errorCode = this.type2.deserialize(value, result, 1, root); + if (errorCode) { + return errorCode; + } + + targetObject[targetKey] = result; + } + + getAsJsonSchemaUncached() { + return { + type: "array", + minLength: 2, + maxLength: 2, + items: [this.type1.getAsJsonSchema(), this.type2.getAsJsonSchema()], + }; + } + + verifySerializedValue(value) { + if (!Array.isArray(value)) { + return "Pair is not an array"; + } + if (value.length !== 2) { + return "Pair length != 2"; + } + let errorCode = this.type1.verifySerializedValue(value[0]); + if (errorCode) { + return errorCode; + } + errorCode = this.type2.verifySerializedValue(value[1]); + if (errorCode) { + return errorCode; + } + } + + getCacheKey() { + return "pair.(" + this.type1.getCacheKey() + "," + this.type2.getCacheKey + ")"; + } +} + +export class TypeNullable extends BaseDataType { + /** + * @param {BaseDataType} wrapped + */ + constructor(wrapped) { + super(); + this.wrapped = wrapped; + } + + serialize(value) { + if (value === null || value === undefined) { + return null; + } + return this.wrapped.serialize(value); + } + + /** + * @see BaseDataType.deserialize + * @param {any} value + * @param {GameRoot} root + * @param {object} targetObject + * @param {string|number} targetKey + * @returns {string|void} String error code or null on success + */ + deserialize(value, targetObject, targetKey, root) { + if (value === null || value === undefined) { + targetObject[targetKey] = null; + return; + } + return this.wrapped.deserialize(value, targetObject, targetKey, root); + } + + verifySerializedValue(value) { + if (value === null) { + return; + } + return this.wrapped.verifySerializedValue(value); + } + + getAsJsonSchemaUncached() { + return { + oneOf: [ + { + type: "null", + }, + this.wrapped.getAsJsonSchema(), + ], + }; + } + + allowNull() { + return true; + } + + getCacheKey() { + return "nullable." + this.wrapped.getCacheKey(); + } +} diff --git a/src/js/savegame/serializer_internal.js b/src/js/savegame/serializer_internal.js new file mode 100644 index 00000000..298871e5 --- /dev/null +++ b/src/js/savegame/serializer_internal.js @@ -0,0 +1,180 @@ +/* typehints:start */ +import { GameRoot } from "../game/root"; +/* typehints:end */ + +import { Vector } from "../core/vector"; +import { createLogger } from "../core/logging"; +import { gMetaBuildingRegistry } from "../core/global_registries"; +import { Entity } from "../game/entity"; + +const logger = createLogger("serializer_internal"); + +// Internal serializer methods +export class SerializerInternal { + constructor() {} + + /** + * Serializes an array of entities + * @param {Array} array + */ + serializeEntityArray(array) { + const serialized = []; + for (let i = 0; i < array.length; ++i) { + const entity = array[i]; + if (!entity.queuedForDestroy && !entity.destroyed) { + serialized.push({ + $: entity.getMetaclass().getId(), + data: entity.serialize(), + }); + } + } + return serialized; + } + + /** + * Serializes an array of entities where we know the type of + * @param {Array} array + */ + serializeEntityArrayFixedType(array) { + const serialized = []; + for (let i = 0; i < array.length; ++i) { + const entity = array[i]; + if (!entity.queuedForDestroy && !entity.destroyed) { + serialized.push(entity.serialize()); + } + } + return serialized; + } + + /** + * + * @param {GameRoot} root + * @param {Array} array + * @param {function(GameRoot, { $: string, data: object }):string|void} deserializerMethod + * @returns {string|void} + */ + deserializeEntityArray(root, array, deserializerMethod) { + for (let i = 0; i < array.length; ++i) { + const errorState = deserializerMethod.call(this, root, array[i]); + if (errorState) { + return errorState; + } + } + return null; + } + + /** + * + * @param {GameRoot} root + * @param {Array} array + * @param {function(GameRoot, object):string|void} deserializerMethod + * @returns {string|void} + */ + deserializeEntityArrayFixedType(root, array, deserializerMethod) { + for (let i = 0; i < array.length; ++i) { + const errorState = deserializerMethod.call(this, root, array[i]); + if (errorState) { + return errorState; + } + } + return null; + } + + /** + * Deserializes a building + * @param {GameRoot} root + * @param {{ $: string, data: any }} payload + */ + deserializeBuilding(root, payload) { + const data = payload.data; + const id = payload.$; + if (!gMetaBuildingRegistry.hasId(id)) { + return "Metaclass not found for building: '" + id + "'"; + } + const meta = gMetaBuildingRegistry.findById(id); + if (!meta) { + return "Metaclass not found for building: '" + id + "'"; + } + + const tile = new Vector(data.x, data.y).toTileSpace(); + const instance = root.logic.internalPlaceBuildingLocalClientOnly({ + tile: tile, + metaBuilding: meta, + uid: data.uid, + }); + + // Apply component specific properties + const errorStatus = this.deserializeComponents(instance, data.components); + if (errorStatus) { + return errorStatus; + } + + // Apply enhancements + instance.updateEnhancements(); + } + + /** + * Deserializes a blueprint + * @param {GameRoot} root + * @param {any} data + * @returns {string|void} + */ + deserializeBlueprint(root, data) { + const id = data.meta; + const metaClass = gMetaBuildingRegistry.findById(id); + if (!metaClass) { + return "Metaclass not found for blueprint: '" + id + "'"; + } + + const tile = new Vector(data.x, data.y).toTileSpace(); + const instance = root.logic.internalPlaceBlueprintLocalClientOnly({ + tile: tile, + metaBuilding: metaClass, + uid: data.uid, + }); + return this.deserializeComponents(instance, data.components); + } + + /////// COMPONENTS //// + + /** + * Deserializes components of an entity + * @param {Entity} entity + * @param {Object.} data + * @returns {string|void} + */ + deserializeComponents(entity, data) { + for (const componentId in data) { + const componentHandle = entity.components[componentId]; + if (!componentHandle) { + logger.warn( + "Loading outdated savegame, where entity had component", + componentId, + "but now no longer has" + ); + continue; + } + const componentData = data[componentId]; + const errorStatus = componentHandle.deserialize(componentData); + if (errorStatus) { + return errorStatus; + } + } + } + + /** + * Deserializes a resource + * @param {GameRoot} root + * @param {object} data + * @returns {string|void} + */ + deserializeResource(root, data) { + const id = data.key; + const instance = new MapResource(root, this.neutralFaction, id); + root.logic.internalPlaceMapEntityLocalClientOnly( + new Vector(data.x, data.y).toTileSpace(), + instance, + data.uid + ); + } +} diff --git a/src/js/states/ingame.js b/src/js/states/ingame.js new file mode 100644 index 00000000..6a400a14 --- /dev/null +++ b/src/js/states/ingame.js @@ -0,0 +1,443 @@ +import { APPLICATION_ERROR_OCCURED } from "../core/error_handler"; +import { GameState } from "../core/game_state"; +import { logSection, createLogger } from "../core/logging"; +import { waitNextFrame } from "../core/utils"; +import { globalConfig } from "../core/config"; +import { GameLoadingOverlay } from "../game/game_loading_overlay"; +import { KeyActionMapper } from "../game/key_action_mapper"; +import { Savegame } from "../savegame/savegame"; +import { GameCore } from "../game/core"; +import { MUSIC } from "../platform/sound"; + +const logger = createLogger("state/ingame"); + +// Different sub-states +const stages = { + s3_createCore: "🌈 3: Create core", + s4_A_initEmptyGame: "🌈 4/A: Init empty game", + s4_B_resumeGame: "🌈 4/B: Resume game", + + s5_firstUpdate: "🌈 5: First game update", + s6_postLoadHook: "🌈 6: Post load hook", + s7_warmup: "🌈 7: Warmup", + + s10_gameRunning: "🌈 10: Game finally running", + + leaving: "🌈 Saving, then leaving the game", + destroyed: "🌈 DESTROYED: Core is empty and waits for state leave", + initFailed: "🌈 ERROR: Initialization failed!", +}; + +export const gameCreationAction = { + new: "new-game", + resume: "resume-game", +}; + +// Typehints +export class GameCreationPayload { + constructor() { + /** @type {boolean|undefined} */ + this.fastEnter; + + /** @type {Savegame} */ + this.savegame; + } +} + +export class InGameState extends GameState { + constructor() { + super("InGameState"); + + /** @type {GameCreationPayload} */ + this.creationPayload = null; + + // Stores current stage + this.stage = ""; + + /** @type {GameCore} */ + this.core = null; + + /** @type {KeyActionMapper} */ + this.keyActionMapper = null; + + /** @type {GameLoadingOverlay} */ + this.loadingOverlay = null; + + /** @type {Savegame} */ + this.savegame; + + this.boundInputFilter = this.filterInput.bind(this); + } + + /** + * Switches the game into another sub-state + * @param {string} stage + */ + switchStage(stage) { + assert(stage, "Got empty stage"); + if (stage !== this.stage) { + this.stage = stage; + logger.log(this.stage); + return true; + } else { + // log(this, "Re entering", stage); + return false; + } + } + + // GameState implementation + getInnerHTML() { + return ""; + } + + getThemeMusic() { + // set later + return MUSIC.gameBg; + } + + onBeforeExit() { + logger.log("Saving before quitting"); + return this.doSave(true, true).then(() => { + logger.log(this, "Successfully saved"); + // this.stageDestroyed(); + }); + } + + onAppPause() { + if (this.stage === stages.s10_gameRunning) { + logger.log("Saving because app got paused"); + this.doSave(true, true); + } + } + + getHasFadeIn() { + return false; + } + + getPauseOnFocusLost() { + return !this.isMultiplayer(); + } + + getHasUnloadConfirmation() { + return true; + } + + onLeave() { + if (this.core) { + this.stageDestroyed(); + } + this.app.inputMgr.dismountFilter(this.boundInputFilter); + } + + onResized(w, h) { + super.onResized(w, h); + if (this.stage === stages.s10_gameRunning) { + this.core.resize(w, h); + } + } + + // ---- End of GameState implementation + + /** + * Goes back to the menu state + */ + goBackToMenu() { + this.saveThenGoToState("MainMenuState"); + } + + /** + * Moves to a state outside of the game + * @param {string} stateId + * @param {any=} payload + */ + saveThenGoToState(stateId, payload) { + if (this.stage === stages.leaving || this.stage === stages.destroyed) { + logger.warn( + "Tried to leave game twice or during destroy:", + this.stage, + "(attempted to move to", + stateId, + ")" + ); + return; + } + this.stageLeavingGame(); + this.doSave(false, true).then(() => { + this.stageDestroyed(); + this.moveToState(stateId, payload); + }); + } + + onBackButton() { + // do nothing + } + + /** + * Called when the game somehow failed to initialize. Resets everything to basic state and + * then goes to the main menu, showing the error + * @param {string} err + */ + onInitializationFailure(err) { + if (this.switchStage(stages.initFailed)) { + logger.error("Init failure:", err); + this.stageDestroyed(); + this.moveToState("MainMenuState", { loadError: err }); + } + } + + // STAGES + + /** + * Creates the game core instance, and thus the root + */ + stage3CreateCore() { + if (this.switchStage(stages.s3_createCore)) { + logger.log("Creating new game core"); + this.core = new GameCore(this.app); + + this.core.initializeRoot(this, this.savegame); + + if (this.savegame.hasGameDump()) { + this.stage4bResumeGame(); + } else { + this.stage4aInitEmptyGame(); + } + } + } + + /** + * Initializes a new empty game + */ + stage4aInitEmptyGame() { + if (this.switchStage(stages.s4_A_initEmptyGame)) { + this.core.initNewGame(); + this.stage5FirstUpdate(); + } + } + + /** + * Resumes an existing game + */ + stage4bResumeGame() { + if (this.switchStage(stages.s4_B_resumeGame)) { + if (!this.core.initExistingGame()) { + this.onInitializationFailure("Savegame is corrupt and can not be restored."); + return; + } + this.stage5FirstUpdate(); + } + } + + /** + * Performs the first game update on the game which initializes most caches + */ + stage5FirstUpdate() { + if (this.switchStage(stages.s5_firstUpdate)) { + this.core.root.logicInitialized = true; + this.core.updateLogic(); + this.stage6PostLoadHook(); + } + } + + /** + * Call the post load hook, this means that we have loaded the game, and all systems + * can operate and start to work now. + */ + stage6PostLoadHook() { + if (this.switchStage(stages.s6_postLoadHook)) { + logger.log("Post load hook"); + this.core.postLoadHook(); + this.stage7Warmup(); + } + } + + /** + * This makes the game idle and draw for a while, because we run most code this way + * the V8 engine can already start to optimize it. Also this makes sure the resources + * are in the VRAM and we have a smooth experience once we start. + */ + stage7Warmup() { + if (this.switchStage(stages.s7_warmup)) { + if (G_IS_DEV && globalConfig.debug.noArtificialDelays) { + this.warmupTimeSeconds = 0.05; + } else { + if (this.creationPayload.fastEnter) { + this.warmupTimeSeconds = globalConfig.warmupTimeSecondsFast; + } else { + this.warmupTimeSeconds = globalConfig.warmupTimeSecondsRegular; + } + } + } + } + + /** + * The final stage where this game is running and updating regulary. + */ + stage10GameRunning() { + if (this.switchStage(stages.s10_gameRunning)) { + this.core.root.signals.readyToRender.dispatch(); + + logSection("GAME STARTED", "#26a69a"); + + // Initial resize, might have changed during loading (this is possible) + this.core.resize(this.app.screenWidth, this.app.screenHeight); + } + } + + /** + * This stage destroys the whole game, used to cleanup + */ + stageDestroyed() { + if (this.switchStage(stages.destroyed)) { + // Cleanup all api calls + this.cancelAllAsyncOperations(); + + if (this.syncer) { + this.syncer.cancelSync(); + this.syncer = null; + } + + // Cleanup core + if (this.core) { + this.core.destruct(); + this.core = null; + } + } + } + + /** + * When leaving the game + */ + stageLeavingGame() { + if (this.switchStage(stages.leaving)) { + // ... + } + } + + // END STAGES + + /** + * Filters the input (keybindings) + */ + filterInput() { + return this.stage === stages.s10_gameRunning; + } + + /** + * @param {GameCreationPayload} payload + */ + onEnter(payload) { + this.app.inputMgr.installFilter(this.boundInputFilter); + + this.creationPayload = payload; + this.savegame = payload.savegame; + + this.loadingOverlay = new GameLoadingOverlay(this.app, this.getDivElement()); + this.loadingOverlay.showBasic(); + + // Remove unneded default element + document.body.querySelector(".modalDialogParent").remove(); + + this.asyncChannel.watch(waitNextFrame()).then(() => this.stage3CreateCore()); + } + + /** + * Render callback + * @param {number} dt + */ + onRender(dt) { + if (APPLICATION_ERROR_OCCURED) { + // Application somehow crashed, do not do anything + return; + } + + if (this.stage === stages.s7_warmup) { + this.core.draw(); + this.warmupTimeSeconds -= dt / 1000.0; + if (this.warmupTimeSeconds < 0) { + logger.log("Warmup completed"); + this.stage10GameRunning(); + } + } + + // // Check if we can show an ad + // // DISABLED + // if (this.stage === stages.s10_gameRunning && !this.core.root.hud.parts.processingOverlay.hasTasks()) { + // if (this.app.isRenderable() && this.app.adProvider.getCanShowVideoAd()) { + // this.saveThenGoToState("WatchAdState", { + // nextStateId: "RunningGameState", + // nextStatePayload: this.creationPayload, + // }); + // } + // } + + if (this.stage === stages.s10_gameRunning) { + this.core.tick(dt); + } + + // If the stage is still active (This might not be the case if tick() moved us to game over) + if (this.stage === stages.s10_gameRunning) { + // Only draw if page visible + if (this.app.pageVisible) { + this.core.draw(); + } + + this.loadingOverlay.removeIfAttached(); + } else { + if (!this.loadingOverlay.isAttached()) { + this.loadingOverlay.showBasic(); + } + } + } + + onBackgroundTick(dt) { + this.onRender(dt); + } + + /** + * Saves the game + * @param {boolean=} syncWithServer + * @param {boolean} force + */ + + doSave(syncWithServer = true, force = false) { + // TODO + return; + + if (!this.savegame || !this.savegame.isSaveable()) { + // Can not save in multiplayer + return Promise.resolve(); + } + + if (APPLICATION_ERROR_OCCURED) { + logger.warn("skipping save because application crashed"); + return Promise.resolve(); + } + + if ( + this.stage !== stages.s10_gameRunning && + this.stage !== stages.s7_warmup && + this.stage !== stages.leaving + ) { + logger.warn("Skipping save because game is not ready"); + return Promise.resolve(); + } + + // First update the game data + + logger.log("Starting to save game ..."); + this.savegame.updateData(this.core.root); + + let savePromise = this.savegame.writeSavegameAndMetadata(); + + if (syncWithServer) { + // Sync in parallel + // @ts-ignore + savePromise = savePromise.then(() => this.syncer.sync(this.core, this.savegame, force)); + } + + return savePromise.catch(err => { + logger.warn("Failed to save:", err); + }); + } +} diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js new file mode 100644 index 00000000..b5ea8c63 --- /dev/null +++ b/src/js/states/main_menu.js @@ -0,0 +1,52 @@ +import { GameState } from "../core/game_state"; +import { cachebust } from "../core/cachebust"; +import { globalConfig } from "../core/config"; + +export class MainMenuState extends GameState { + constructor() { + super("MainMenuState"); + } + + getInnerHTML() { + return ` + + + +
+ +
+ `; + } + + onBackButton() { + this.app.platformWrapper.exitApp(); + } + + onEnter(payload) { + if (payload.loadError) { + alert("Error while loading game: " + payload.loadError); + } + + const qs = this.htmlElement.querySelector.bind(this.htmlElement); + this.trackClicks(qs(".mainContainer .playButton"), this.onPlayButtonClicked); + + if (G_IS_DEV && globalConfig.debug.fastGameEnter) { + this.onPlayButtonClicked(); + } + } + + onPlayButtonClicked() { + const savegame = this.app.savegameMgr.createNewSavegame(); + + this.app.analytics.trackUiClick("startgame"); + this.moveToState("InGameState", { + savegame, + }); + } + + onLeave() { + // this.dialogs.cleanup(); + } +} diff --git a/src/js/states/preload.js b/src/js/states/preload.js new file mode 100644 index 00000000..ba3b515f --- /dev/null +++ b/src/js/states/preload.js @@ -0,0 +1,238 @@ +import { GameState } from "../core/game_state"; +import { createLogger } from "../core/logging"; +import { findNiceValue, waitNextFrame } from "../core/utils"; +import { cachebust } from "../core/cachebust"; +import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper"; + +const logger = createLogger("state/preload"); + +export class PreloadState extends GameState { + constructor() { + super("PreloadState"); + } + + getInnerHTML() { + return ` +
+
+ Booting + + + 0% + +
+ + `; + } + + getThemeMusic() { + return null; + } + + getHasFadeIn() { + return false; + } + + onEnter(payload) { + this.htmlElement.classList.add("prefab_LoadingState"); + + const elementsToRemove = ["#loadingPreload", "#fontPreload"]; + for (let i = 0; i < elementsToRemove.length; ++i) { + const elem = document.querySelector(elementsToRemove[i]); + if (elem) { + elem.remove(); + } + } + + // this.dialogs = new HUDModalDialogs(null, this.app); + // const dialogsElement = document.body.querySelector(".modalDialogParent"); + // this.dialogs.initializeToElement(dialogsElement); + + this.statusText = this.htmlElement.querySelector(".loadingStatus > .desc"); + this.statusBar = this.htmlElement.querySelector(".loadingStatus > .bar > .inner"); + this.statusBarText = this.htmlElement.querySelector(".loadingStatus > .bar > .status"); + this.currentStatus = "booting"; + this.currentIndex = 0; + + this.startLoading(); + } + + onLeave() { + // this.dialogs.cleanup(); + } + + startLoading() { + this.setStatus("Booting") + + .then(() => this.setStatus("Creating platform wrapper")) + .then(() => this.app.platformWrapper.initialize()) + + .then(() => this.setStatus("Initializing libraries")) + .then(() => this.app.analytics.initialize()) + .then(() => this.app.gameAnalytics.initialize()) + + .then(() => this.setStatus("Initializing local storage")) + .then(() => { + const wrapper = this.app.platformWrapper; + if (wrapper instanceof PlatformWrapperImplBrowser) { + try { + window.localStorage.setItem("local_storage_test", "1"); + window.localStorage.removeItem("local_storage_test"); + } catch (ex) { + logger.error("Failed to read/write local storage:", ex); + return new Promise(() => { + alert(`Your brower does not support thirdparty cookies or you have disabled it in your security settings.\n\n + In Chrome this setting is called "Block third-party cookies and site data".\n\n + Please allow third party cookies and then reload the page.`); + // Never return + }); + } + } + }) + + .then(() => this.setStatus("Creating storage")) + .then(() => { + return this.app.storage.initialize(); + }) + + .then(() => this.setStatus("Initializing settings")) + .then(() => { + return this.app.settings.initialize(); + }) + .then(() => { + // Make sure the app pickups the right size + this.app.updateAfterUiScaleChanged(); + }) + + .then(() => { + // Initialize fullscreen + if (this.app.platformWrapper.getSupportsFullscreen()) { + this.app.platformWrapper.setFullscreen(this.app.settings.getIsFullScreen()); + } + }) + + .then(() => this.setStatus("Initializing sounds")) + .then(() => { + // Notice: We don't await the sounds loading itself + return this.app.sound.initialize(); + }) + + .then(() => { + this.app.backgroundResourceLoader.startLoading(); + }) + + .then(() => this.setStatus("Initializing savegame")) + .then(() => { + return this.app.savegameMgr.initialize().catch(err => { + logger.error("Failed to initialize savegames:", err); + return new Promise(resolve => { + // const { ok } = this.dialogs.showWarning( + // T.preload.savegame_corrupt_dialog.title, + // T.preload.savegame_corrupt_dialog.content, + // ["ok:good"] + // ); + // ok.add(resolve); + alert("Your savegames failed to load. They might not show up. Sorry!"); + }); + }); + }) + + .then(() => this.setStatus("Downloading resources")) + .then(() => { + return this.app.backgroundResourceLoader.getPromiseForBareGame(); + }) + + .then(() => this.setStatus("Launching")) + .then( + () => { + this.moveToState("MainMenuState"); + }, + err => { + this.showFailMessage(err); + } + ); + } + + setStatus(text) { + logger.log("✅ " + text); + this.currentIndex += 1; + this.currentStatus = text; + this.statusText.innerText = text; + + const numSteps = 10; // FIXME + + const percentage = (this.currentIndex / numSteps) * 100.0; + this.statusBar.style.width = percentage + "%"; + this.statusBarText.innerText = findNiceValue(percentage) + "%"; + + if (G_IS_DEV) { + return Promise.resolve(); + } + return waitNextFrame(); + } + + showFailMessage(text) { + logger.error("App init failed:", text); + + const email = "bugs@shapez.io"; + + const subElement = document.createElement("div"); + subElement.classList.add("failureBox"); + + subElement.innerHTML = ` + +
+
+ Failed to initialize application! +
+
+ ${this.currentStatus} failed:
+ ${text} +
+ +
+ Please send me an email with steps to reproduce and what you did before this happened: +
+
+ +
+ + Build ${G_BUILD_VERSION} @ ${G_BUILD_COMMIT_HASH} +
+
+ `; + + this.htmlElement.classList.add("failure"); + this.htmlElement.appendChild(subElement); + + const resetBtn = subElement.querySelector("button.resetApp"); + this.trackClicks(resetBtn, this.showResetConfirm); + } + + showResetConfirm() { + if (confirm("Are you sure you want to reset the app? This will delete all your savegames")) { + this.resetApp(); + } + // const signals = this.dialogs.showWarning(T.preload.reset_app_warning.title, T.preload.reset_app_warning.desc, [ + // "delete:bad:timeout", + // "cancel:good", + // ]); + // signals.delete.add(this.resetApp, this); + } + + resetApp() { + this.app.settings + .resetEverythingAsync() + .then(() => { + this.app.savegameMgr.resetEverythingAsync(); + }) + .then(() => { + this.app.settings.resetEverythingAsync(); + }) + .then(() => { + window.location.reload(); + }); + } +} diff --git a/src/js/webworkers/background_animation_frame_emittter.worker.js b/src/js/webworkers/background_animation_frame_emittter.worker.js new file mode 100644 index 00000000..5a3fe5c9 --- /dev/null +++ b/src/js/webworkers/background_animation_frame_emittter.worker.js @@ -0,0 +1,16 @@ +// We clamp high deltas so 30 fps is fairly ok +const bgFps = 30; +const desiredMsDelay = 1000 / bgFps; + +let lastTick = 0; + +function tick() { + const now = performance.now(); + const delta = now - lastTick; + lastTick = now; + + // @ts-ignore + postMessage({ delta }); +} + +setInterval(tick, desiredMsDelay); diff --git a/src/js/webworkers/compression.worker.js b/src/js/webworkers/compression.worker.js new file mode 100644 index 00000000..69e7a817 --- /dev/null +++ b/src/js/webworkers/compression.worker.js @@ -0,0 +1,48 @@ +import { compressX64 } from "../core/lzstring"; +import { globalConfig } from "../core/config"; +import { sha1 } from "../core/sensitive_utils.encrypt"; + +function accessNestedPropertyReverse(obj, keys) { + let result = obj; + for (let i = keys.length - 1; i >= 0; --i) { + result = result[keys[i]]; + } + return result; +} + +const rusha = require("rusha"); + +const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]); +const encryptKey = globalConfig.info.sgSalt; + +onmessage = function (event) { + const { jobId, job, data } = event.data; + const result = performJob(job, data); + + // @ts-ignore + postMessage({ + jobId, + result, + }); +}; + +function performJob(job, data) { + switch (job) { + case "compressX64": { + return compressX64(data); + } + case "compressWithChecksum": { + const checksum = rusha + .createHash() + .update(data + encryptKey) + .digest("hex"); + return compressX64(checksum + data); + } + case "compressFile": { + const checksum = sha1(data.text + salt); + return data.compressionPrefix + compressX64(checksum + data.text); + } + default: + throw new Error("Webworker: Unknown job: " + job); + } +} diff --git a/tools/shape_generator/index.html b/tools/shape_generator/index.html new file mode 100644 index 00000000..22a388d6 --- /dev/null +++ b/tools/shape_generator/index.html @@ -0,0 +1,72 @@ + + + + + shapez.io shape generator + + + + + + + +
Error
+
+ + + diff --git a/tools/shape_generator/index.js b/tools/shape_generator/index.js new file mode 100644 index 00000000..d248e678 --- /dev/null +++ b/tools/shape_generator/index.js @@ -0,0 +1,125 @@ +// From shape_definition.js + +/** @enum {string} */ +const enumSubShape = { + rect: "rect", + circle: "circle", + star: "star", + windmill: "windmill", +}; + +/** @enum {string} */ +const enumSubShapeToShortcode = { + [enumSubShape.rect]: "R", + [enumSubShape.circle]: "C", + [enumSubShape.star]: "S", + [enumSubShape.windmill]: "W", +}; + +/** @enum {enumSubShape} */ +const enumShortcodeToSubShape = {}; +for (const key in enumSubShapeToShortcode) { + enumShortcodeToSubShape[enumSubShapeToShortcode[key]] = key; +} + +// From colors.js +/** @enum {string} */ +const enumColors = { + red: "red", + green: "green", + blue: "blue", + + yellow: "yellow", + purple: "purple", + cyan: "cyan", + + white: "white", + uncolored: "uncolored", +}; + +/** @enum {string} */ +const enumColorToShortcode = { + [enumColors.red]: "r", + [enumColors.green]: "g", + [enumColors.blue]: "b", + + [enumColors.yellow]: "y", + [enumColors.purple]: "p", + [enumColors.cyan]: "c", + + [enumColors.white]: "w", + [enumColors.uncolored]: "u", +}; + +/** @enum {enumColors} */ +const enumShortcodeToColor = {}; +for (const key in enumColorToShortcode) { + enumShortcodeToColor[enumColorToShortcode[key]] = key; +} + +///////////////////////////////////////////////////// + +/** + * Generates the definition from the given short key + */ +function fromShortKey(key) { + const sourceLayers = key.split(":"); + let layers = []; + for (let i = 0; i < sourceLayers.length; ++i) { + const text = sourceLayers[i]; + if (text.length !== 8) { + throw new Error("Invalid layer: '" + text + "' -> must be 8 characters"); + } + + const quads = [null, null, null, null]; + for (let quad = 0; quad < 4; ++quad) { + const shapeText = text[quad * 2 + 0]; + const subShape = enumShortcodeToSubShape[shapeText]; + const color = enumShortcodeToColor[text[quad * 2 + 1]]; + if (subShape) { + if (!color) { + throw new Error("Invalid shape color key: " + key); + } + quads[quad] = { + subShape, + color, + }; + } else if (shapeText !== "-") { + throw new Error("Invalid shape key: " + shapeText); + } + } + layers.push(quads); + } + + return layers; +} + +///////////////////////////////////////////////////// + +function showError(msg) { + const errorDiv = document.getElementById("error"); + errorDiv.classList.toggle("hasError", !!msg); + if (msg) { + errorDiv.innerText = msg; + } else { + errorDiv.innerText = "Shape generated"; + } +} + +window.generate = () => { + showError(null); + const code = document.getElementById("code").value.trim(); + + let parsed = null; + try { + parsed = fromShortKey(code); + } catch (ex) { + showError(ex); + } +}; + +window.debounce = fn => { + setTimeout(fn, 0); +}; + +window.addEventListener("load", generate); diff --git a/tools/shape_generator/package.json b/tools/shape_generator/package.json new file mode 100644 index 00000000..0715ac87 --- /dev/null +++ b/tools/shape_generator/package.json @@ -0,0 +1,13 @@ +{ + "name": "shape_generator", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "private": true, + "devDependencies": { + "http-server": "^0.12.3" + }, + "scripts": { + "serve": "http-server . -p 9000 -g --cors -o -c-1" + } +} diff --git a/tools/shape_generator/yarn.lock b/tools/shape_generator/yarn.lock new file mode 100644 index 00000000..013aab17 --- /dev/null +++ b/tools/shape_generator/yarn.lock @@ -0,0 +1,152 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +basic-auth@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" + integrity sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ= + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c= + +debug@^3.0.0, debug@^3.1.1: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +ecstatic@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-3.3.2.tgz#6d1dd49814d00594682c652adb66076a69d46c48" + integrity sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog== + dependencies: + he "^1.1.1" + mime "^1.6.0" + minimist "^1.1.0" + url-join "^2.0.5" + +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + +follow-redirects@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== + dependencies: + debug "^3.0.0" + +he@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-proxy@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-server@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.12.3.tgz#ba0471d0ecc425886616cb35c4faf279140a0d37" + integrity sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA== + dependencies: + basic-auth "^1.0.3" + colors "^1.4.0" + corser "^2.0.1" + ecstatic "^3.3.2" + http-proxy "^1.18.0" + minimist "^1.2.5" + opener "^1.5.1" + portfinder "^1.0.25" + secure-compare "3.0.1" + union "~0.5.0" + +lodash@^4.17.14: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +mime@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimist@^1.1.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +portfinder@^1.0.25: + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +qs@^6.4.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha1-8aAymzCLIh+uN7mXTz1XjQypmeM= + +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.0" + +url-join@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" + integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg= diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..17d22902 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,62 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + "allowJs": true, /* Allow javascript files to be compiled. */ + "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./typedefs_gen", /* Concatenate and emit output to single file. */ + // "outDir": "./typedefs_gen", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "incremental": true, /* Enable incremental compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + // "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + "strictFunctionTypes": true, /* Enable strict checking of function types. */ + "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "resolveJsonModule": true + }, + "exclude": [ + "backend/shared/gameserver_base_impl", + "backend/shared/sentry_logger.js" + ] +} \ No newline at end of file diff --git a/tslint.json b/tslint.json new file mode 100644 index 00000000..01942cdc --- /dev/null +++ b/tslint.json @@ -0,0 +1,23 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": { + "trailing-comma": false, + "comma-dangle": [ + "error", + "never" + ], + "object-literal-sort-keys": false, + "member-ordering": false, + "max-line-length": false, + "no-console": false, + "forin": false, + "no-empty": false, + "space-before-function-paren": [ + "always" + ] + }, + "rulesDirectory": [] +} \ No newline at end of file diff --git a/version b/version new file mode 100644 index 00000000..8a9ecc2e --- /dev/null +++ b/version @@ -0,0 +1 @@ +0.0.1 \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..7fbd075b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,9580 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== + dependencies: + browserslist "^4.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.5.4": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== + dependencies: + "@babel/types" "^7.9.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz#3fd65911306d8746014ec0d0cf78f0e39a149116" + integrity sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.4.4", "@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.5.5", "@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@^7.5.4": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.5.tgz#8ddc76039bc45b774b19e2fc548f6807d8a8919f" + integrity sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ== + dependencies: + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.5" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.5" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.5" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.42.tgz#352e40c92e0460d3e82f49bd7e79f6cda76f919f" + integrity sha512-iOGRzUoONLOtmCvjUsZv3mZzgCT6ljHQY5fr1qG1QIiJQwtM7zbPWGGpa3QWETq+UqwWyJnoi5XZDZRwZDFciQ== + dependencies: + core-js "^2.5.3" + regenerator-runtime "^0.11.1" + +"@babel/runtime@^7.8.4": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@jimp/bmp@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.6.8.tgz#8abbfd9e26ba17a47fab311059ea9f7dd82005b6" + integrity sha512-uxVgSkI62uAzk5ZazYHEHBehow590WAkLKmDXLzkr/XP/Hv2Fx1T4DKwJ/15IY5ktq5VAhAUWGXTyd8KWFsx7w== + dependencies: + "@jimp/utils" "^0.6.8" + bmp-js "^0.1.0" + core-js "^2.5.7" + +"@jimp/core@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.6.8.tgz#6a41089792516f6e64a5302d12eb562aa7847c7b" + integrity sha512-JOFqBBcSNiDiMZJFr6OJqC6viXj5NVBQISua0eacoYvo4YJtTajOIxC4MqWyUmGrDpRMZBR8QhSsIOwsFrdROA== + dependencies: + "@jimp/utils" "^0.6.8" + any-base "^1.1.0" + buffer "^5.2.0" + core-js "^2.5.7" + exif-parser "^0.1.12" + file-type "^9.0.0" + load-bmfont "^1.3.1" + mkdirp "0.5.1" + phin "^2.9.1" + pixelmatch "^4.0.2" + tinycolor2 "^1.4.1" + +"@jimp/custom@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.6.8.tgz#0476d7b3f5da3121d98895a2e14f2899e602f2b6" + integrity sha512-FrYlzZRVXP2vuVwd7Nc2dlK+iZk4g6IaT1Ib8Z6vU5Kkwlt83FJIPJ2UUFABf3bF5big0wkk8ZUihWxE4Nzdng== + dependencies: + "@jimp/core" "^0.6.8" + core-js "^2.5.7" + +"@jimp/gif@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.6.8.tgz#848dd4e6e1a56ca2b3ce528969e44dfa99a53b14" + integrity sha512-yyOlujjQcgz9zkjM5ihZDEppn9d1brJ7jQHP5rAKmqep0G7FU1D0AKcV+Ql18RhuI/CgWs10wAVcrQpmLnu4Yw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + omggif "^1.0.9" + +"@jimp/jpeg@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.6.8.tgz#4cad85a6d1e15759acb56bddef29aa3473859f2c" + integrity sha512-rGtXbYpFXAn471qLpTGvhbBMNHJo5KiufN+vC5AWyufntmkt5f0Ox2Cx4ijuBMDtirZchxbMLtrfGjznS4L/ew== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + jpeg-js "^0.3.4" + +"@jimp/plugin-blit@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.6.8.tgz#646ebb631f35afc28c1e8908524bc43d1e9afa3d" + integrity sha512-7Tl6YpKTSpvwQbnGNhsfX2zyl3jRVVopd276Y2hF2zpDz9Bycow7NdfNU/4Nx1jaf96X6uWOtSVINcQ7rGd47w== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-blur@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.6.8.tgz#7b753ae94f6099103f57c268c3b2679047eefe95" + integrity sha512-NpZCMKxXHLDQsX9zPlWtpMA660DQStY6/z8ZetyxCDbqrLe9YCXpeR4MNhdJdABIiwTm1W5FyFF4kp81PHJx3Q== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-color@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.6.8.tgz#4101cb1208879b331db6e43ea6b96eaf8dbaedbc" + integrity sha512-jjFyU0zNmGOH2rjzHuOMU4kaia0oo82s/7UYfn5h7OUkmUZTd6Do3ZSK1PiXA7KR+s4B76/Omm6Doh/0SGb7BQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + tinycolor2 "^1.4.1" + +"@jimp/plugin-contain@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.6.8.tgz#af95d33b63d0478943374ae15dd2607fc69cad14" + integrity sha512-p/P2wCXhAzbmEgXvGsvmxLmbz45feF6VpR4m9suPSOr8PC/i/XvTklTqYEUidYYAft4vHgsYJdS74HKSMnH8lw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-cover@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.6.8.tgz#490e3186627a34d93cc015c4169bac9070d6ad17" + integrity sha512-2PvWgk+PJfRsfWDI1G8Fpjrsu0ZlpNyZxO2+fqWlVo6y/y2gP4v08FqvbkcqSjNlOu2IDWIFXpgyU0sTINWZLg== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-crop@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.6.8.tgz#ffec8951a2f3eccad1e3cff9afff5326bd980ce7" + integrity sha512-CbrcpWE2xxPK1n/JoTXzhRUhP4mO07mTWaSavenCg664oQl/9XCtL+A0FekuNHzIvn4myEqvkiTwN7FsbunS/Q== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-displace@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.6.8.tgz#89df05ab7daaff6befc190bb8ac54ec8d57e533b" + integrity sha512-RmV2bPxoPE6mrPxtYSPtHxm2cGwBQr5a2p+9gH6SPy+eUMrbGjbvjwKNfXWUYD0leML+Pt5XOmAS9pIROmuruQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-dither@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.6.8.tgz#17e5b9f56575a871e329fef8b388e614b92d84f8" + integrity sha512-x6V/qjxe+xypjpQm7GbiMNqci1EW5UizrcebOhHr8AHijOEqHd2hjXh5f6QIGfrkTFelc4/jzq1UyCsYntqz9Q== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-flip@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.6.8.tgz#153df0c677f79d4078bb9e4c1f2ac392b96dc3a1" + integrity sha512-4il6Da6G39s9MyWBEee4jztEOUGJ40E6OlPjkMrdpDNvge6hYEAB31BczTYBP/CEY74j4LDSoY5LbcU4kv06yA== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-gaussian@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.6.8.tgz#100abc7ae1f19fe9c09ed41625b475aae7c6093c" + integrity sha512-pVOblmjv7stZjsqloi4YzHVwAPXKGdNaHPhp4KP4vj41qtc6Hxd9z/+VWGYRTunMFac84gUToe0UKIXd6GhoKw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-invert@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.6.8.tgz#f40bfaa3b592d21ff14ede0e49aabec88048cad0" + integrity sha512-11zuLiXDHr6tFv4U8aieXqNXQEKbDbSBG/h+X62gGTNFpyn8EVPpncHhOqrAFtZUaPibBqMFlNJ15SzwC7ExsQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-mask@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.6.8.tgz#e64405f7dacf0672bff74f3b95b724d9ac517f86" + integrity sha512-hZJ0OiKGJyv7hDSATwJDkunB1Ie80xJnONMgpUuUseteK45YeYNBOiZVUe8vum8QI1UwavgBzcvQ9u4fcgXc9g== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-normalize@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.6.8.tgz#a0180f2b8835e3638cdc5e057b44ac63f60db6ba" + integrity sha512-Q4oYhU+sSyTJI7pMZlg9/mYh68ujLfOxXzQGEXuw0sHGoGQs3B0Jw7jmzGa6pIS06Hup5hD2Zuh1ppvMdjJBfQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-print@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.6.8.tgz#66309549e01896473111e3a0ad2cee428638bd6e" + integrity sha512-2aokejGn4Drv1FesnZGqh5KEq0FQtR0drlmtyZrBH+r9cx7hh0Qgf4D1BOTDEgXkfSSngjGRjKKRW/fwOrVXYw== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + load-bmfont "^1.4.0" + +"@jimp/plugin-resize@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.6.8.tgz#c26d9a973f7eec51ad9018fcbbac1146f7a73aa0" + integrity sha512-27nPh8L1YWsxtfmV/+Ub5dOTpXyC0HMF2cu52RQSCYxr+Lm1+23dJF70AF1poUbUe+FWXphwuUxQzjBJza9UoA== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-rotate@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.6.8.tgz#2afda247984eeebed95c1bb1b13ccd3be5973299" + integrity sha512-GbjETvL05BDoLdszNUV4Y0yLkHf177MnqGqilA113LIvx9aD0FtUopGXYfRGVvmtTOTouoaGJUc+K6qngvKxww== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugin-scale@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.6.8.tgz#5de403345859bb0b30bf3e242dedd8ceb6ecb96c" + integrity sha512-GzIYWR/oCUK2jAwku23zt19V1ssaEU4pL0x2XsLNKuuJEU6DvEytJyTMXCE7OLG/MpDBQcQclJKHgiyQm5gIOQ== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + +"@jimp/plugins@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.6.8.tgz#5618170a986ced1ea795adcd9376122f2543b856" + integrity sha512-fMcTI72Vn/Lz6JftezTURmyP5ml/xGMe0Ljx2KRJ85IWyP33vDmGIUuutFiBEbh2+y7lRT+aTSmjs0QGa/xTmQ== + dependencies: + "@jimp/plugin-blit" "^0.6.8" + "@jimp/plugin-blur" "^0.6.8" + "@jimp/plugin-color" "^0.6.8" + "@jimp/plugin-contain" "^0.6.8" + "@jimp/plugin-cover" "^0.6.8" + "@jimp/plugin-crop" "^0.6.8" + "@jimp/plugin-displace" "^0.6.8" + "@jimp/plugin-dither" "^0.6.8" + "@jimp/plugin-flip" "^0.6.8" + "@jimp/plugin-gaussian" "^0.6.8" + "@jimp/plugin-invert" "^0.6.8" + "@jimp/plugin-mask" "^0.6.8" + "@jimp/plugin-normalize" "^0.6.8" + "@jimp/plugin-print" "^0.6.8" + "@jimp/plugin-resize" "^0.6.8" + "@jimp/plugin-rotate" "^0.6.8" + "@jimp/plugin-scale" "^0.6.8" + core-js "^2.5.7" + timm "^1.6.1" + +"@jimp/png@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.6.8.tgz#ee06cf078b381137ec7206c4bb1b4cfcbe15ca6f" + integrity sha512-JHHg/BZ7KDtHQrcG+a7fztw45rdf7okL/YwkN4qU5FH7Fcrp41nX5QnRviDtD9hN+GaNC7kvjvcqRAxW25qjew== + dependencies: + "@jimp/utils" "^0.6.8" + core-js "^2.5.7" + pngjs "^3.3.3" + +"@jimp/tiff@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.6.8.tgz#79bd22ed435edbe29d02a2c8c9bf829f988ebacc" + integrity sha512-iWHbxd+0IKWdJyJ0HhoJCGYmtjPBOusz1z1HT/DnpePs/Lo3TO4d9ALXqYfUkyG74ZK5jULZ69KLtwuhuJz1bg== + dependencies: + core-js "^2.5.7" + utif "^2.0.1" + +"@jimp/types@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.6.8.tgz#4510eb635cd00b201745d70e38f791748baa7075" + integrity sha512-vCZ/Cp2osy69VP21XOBACfHI5HeR60Rfd4Jidj4W73UL+HrFWOtyQiJ7hlToyu1vI5mR/NsUQpzyQvz56ADm5A== + dependencies: + "@jimp/bmp" "^0.6.8" + "@jimp/gif" "^0.6.8" + "@jimp/jpeg" "^0.6.8" + "@jimp/png" "^0.6.8" + "@jimp/tiff" "^0.6.8" + core-js "^2.5.7" + timm "^1.6.1" + +"@jimp/utils@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.6.8.tgz#09f794945631173567aa50f72ac28170de58a63d" + integrity sha512-7RDfxQ2C/rarNG9iso5vmnKQbcvlQjBIlF/p7/uYj72WeZgVCB+5t1fFBKJSU4WhniHX4jUMijK+wYGE3Y3bGw== + dependencies: + core-js "^2.5.7" + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/cordova@^0.0.34": + version "0.0.34" + resolved "https://registry.yarnpkg.com/@types/cordova/-/cordova-0.0.34.tgz#ea7addf74ecec3d7629827a0c39e2c9addc73d04" + integrity sha1-6nrd907Ow9dimCegw54smt3HPQQ= + +"@types/filesystem@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz#ee3748eb5be140dcf980c3bd35f11aec5f7a3748" + integrity sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.28" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3" + integrity sha1-wFTor02d11205jq8dviFFocU1LM= + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= + dependencies: + acorn "^3.0.4" + +acorn-jsx@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-walk@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" + integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^5.5.0: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.7, acorn@^6.2.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.9.1: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= + +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-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +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-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +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" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +any-base@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" + integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + +archive-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" + integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA= + dependencies: + file-type "^4.2.0" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= + +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" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + 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" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assets@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/assets/-/assets-3.0.1.tgz#7a69f4bcc3aca9702760e2a73a7e76ca93e9e3e0" + integrity sha512-fTyLNf/9V24y5zO83f4DAEuvaKj7MWBixbnqdZneAhsv1r21yQ/6ogZfvXHmphJAHsz4DhuOwHeJKVbGqqvk0Q== + dependencies: + async "^2.5.0" + bluebird "^3.4.6" + calipers "^2.0.0" + calipers-gif "^2.0.0" + calipers-jpeg "^2.0.0" + calipers-png "^2.0.0" + calipers-svg "^2.0.0" + calipers-webp "^2.0.0" + glob "^7.0.6" + lodash "^4.15.0" + mime "^2.4.0" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.5.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +async@~0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + +async@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" + integrity sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw= + dependencies: + lodash "^4.14.0" + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.4.3, autoprefixer@^9.4.7, autoprefixer@^9.6.1: + version "9.7.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4" + integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ== + dependencies: + browserslist "^4.11.1" + caniuse-lite "^1.0.30001039" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.27" + postcss-value-parser "^4.0.3" + +axios@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + +babel-loader@^8.0.4: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-closure-elimination@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-closure-elimination/-/babel-plugin-closure-elimination-1.3.0.tgz#3217fbf6d416dfdf14ff41a8a34e4d0a6bfc22b2" + integrity sha512-ClKuSxKLLNhe69bvTMuONDI0dQDW49lXB2qtQyyKCzvwegRGel/q4/e+1EoDNDN97Hf1QkxGMbzpAGPmU4Tfjw== + +babel-plugin-console-source@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-console-source/-/babel-plugin-console-source-2.0.4.tgz#263985b1d69b68e463358d087fa877dd967c5f41" + integrity sha512-OGhrdhuMjiEW0Ma0P9e2B4dFddCpJ/xN/RRaM/4wwDLl+6ZKf+Xd77FtVjpNeDzNRNk8wjRdStA4hpZizXzl1g== + +babel-plugin-danger-remove-unused-import@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-danger-remove-unused-import/-/babel-plugin-danger-remove-unused-import-1.1.2.tgz#ac39c30edfe524ef8cfc411fec5edc479d19e132" + integrity sha512-3bNmVAaakP3b1aROj7O3bOWj2kBa85sZR5naZ3Rn8L9buiZaAyZLgjfrPDL3zhX4wySOA5jrTm/wSmJPsMm3cg== + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + integrity sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0= + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-runtime@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-runtime@^7.0.0-beta.3: + version "7.0.0-beta.3" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-7.0.0-beta.3.tgz#7c750de5514452c27612172506b49085a4a630f2" + integrity sha512-jlzZ8RACjt0QGxq+wqsw5bCQE9RcUyWpw987mDY3GYxTpOQT2xoyNoG++oVCHzr/nACLBIprfVBNvv/If1ZYcg== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + 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" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bin-build@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861" + integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA== + dependencies: + decompress "^4.0.0" + download "^6.2.2" + execa "^0.7.0" + p-map-series "^1.0.0" + tempfile "^2.0.0" + +bin-check@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" + integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== + dependencies: + execa "^0.7.0" + executable "^4.1.0" + +bin-version-check@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71" + integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ== + dependencies: + bin-version "^3.0.0" + semver "^5.6.0" + semver-truncate "^1.1.2" + +bin-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839" + integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ== + dependencies: + execa "^1.0.0" + find-versions "^3.0.0" + +bin-wrapper@^4.0.0, bin-wrapper@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605" + integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q== + dependencies: + bin-check "^4.1.0" + bin-version-check "^4.0.0" + download "^7.1.0" + import-lazy "^3.1.0" + os-filter-obj "^2.0.0" + pify "^4.0.1" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +bluebird@3.x.x, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bmp-js@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" + integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= + +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" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + 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" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-sync-client@^2.26.6: + version "2.26.6" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.6.tgz#e5201d3ace8aee88af17656b7b0c0620b6f8e4ab" + integrity sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw== + dependencies: + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + rxjs "^5.5.6" + +browser-sync-ui@^2.26.4: + version "2.26.4" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz#3772f13c6b93f2d7d333f4be0ca1ec02aae97dba" + integrity sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA== + dependencies: + async-each-series "0.1.1" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^2.0.4" + stream-throttle "^0.1.3" + +browser-sync@^2.24.6: + version "2.26.7" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.7.tgz#120287716eb405651a76cc74fe851c31350557f9" + integrity sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w== + dependencies: + browser-sync-client "^2.26.6" + browser-sync-ui "^2.26.4" + bs-recipes "1.3.4" + bs-snippet-injector "^2.0.1" + chokidar "^2.0.4" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "^3" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "1.15.2" + immutable "^3" + localtunnel "1.9.2" + micromatch "^3.1.10" + opn "5.3.0" + portscanner "2.1.1" + qs "6.2.3" + raw-body "^2.3.2" + resp-modifier "6.0.2" + rx "4.1.0" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" + server-destroy "1.0.1" + socket.io "2.1.1" + ua-parser-js "0.7.17" + yargs "6.4.0" + +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" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + 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" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + 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" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + 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" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + 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" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + 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" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.6.4, browserslist@^4.8.5, browserslist@^4.9.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" + integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== + dependencies: + caniuse-lite "^1.0.30001038" + electron-to-chromium "^1.3.390" + node-releases "^1.1.53" + pkg-up "^2.0.0" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU= + +bs-snippet-injector@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" + integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU= + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.2.0, buffer@^5.2.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce" + integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +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" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + 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" + +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +calipers-gif@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-gif/-/calipers-gif-2.0.0.tgz#b5eefec3064a77c6dcdbd5bdc51735a01bafdc37" + integrity sha1-te7+wwZKd8bc29W9xRc1oBuv3Dc= + dependencies: + bluebird "3.x.x" + +calipers-jpeg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-jpeg/-/calipers-jpeg-2.0.0.tgz#06d56a53f62717dd809cb956cf64423ce693465b" + integrity sha1-BtVqU/YnF92AnLlWz2RCPOaTRls= + dependencies: + bluebird "3.x.x" + +calipers-png@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-png/-/calipers-png-2.0.0.tgz#1d0d20e5c1ae5f79b74d5286a2e97f59bb70b658" + integrity sha1-HQ0g5cGuX3m3TVKGoul/Wbtwtlg= + dependencies: + bluebird "3.x.x" + +calipers-svg@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/calipers-svg/-/calipers-svg-2.0.1.tgz#cd9eaa58ef7428c1a14f5da57e56715fb60f6541" + integrity sha512-3PROqHARmj8wWudUC7DzXm1+mSocqgY7jNuehFNHgrUVrKf8o7MqDjS92vJz5LvZsAofJsoAFMajkqwbxBROSQ== + dependencies: + bluebird "3.x.x" + +calipers-webp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calipers-webp/-/calipers-webp-2.0.0.tgz#e126ece2f84cd71779612bfa2b2653cd95cea77a" + integrity sha1-4Sbs4vhM1xd5YSv6KyZTzZXOp3o= + dependencies: + bluebird "3.x.x" + +calipers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/calipers/-/calipers-2.0.1.tgz#0d3f303ce75ec5f1eda7fecfc7dba6736e35c926" + integrity sha512-AP4Ui2Z8fZf69d8Dx4cfJgPjQHY3m+QXGFCaAGu8pfNQjyajkosS+Kkf1n6pQDMZcelN5h3MdcjweUqxcsS4pg== + dependencies: + bluebird "3.x.x" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + 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" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.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.30000981, caniuse-lite@^1.0.30001038, caniuse-lite@^1.0.30001039: + version "1.0.30001041" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz#c2ea138dafc6fe03877921ddcddd4a02a14daf76" + integrity sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA== + +caw@^2.0.0, caw@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" + integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== + dependencies: + get-proxy "^2.0.0" + isurl "^1.0.0-alpha5" + tunnel-agent "^0.6.0" + url-to-options "^1.0.1" + +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" + integrity sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chance@1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.13.tgz#666bec2db42b3084456a3e4f4c28a82db5ccb7e6" + integrity sha512-9cpcgmAIQiXC0eMgQuMZgXuHR2Y+gKUyGQnalqSAg5LlUJyJFsZeKyuHVSGhj+bx18ppH+Jo3VOayNeXR/7p9Q== + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +chokidar@^2.0.4, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +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" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-dependency-plugin@^5.0.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" + integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw== + +circular-json@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +class-validator@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.8.5.tgz#484785acda98f68549c3a84dc1bb2f77b736dc58" + integrity sha512-84yezRo44aP4oGhvPmqj6obAFQF1NzUyfR0+f8jubzdAspO5pmjpHhBBlPf335epUskzXAFe5uo4Qf+c7SI+DA== + dependencies: + validator "9.2.0" + +clean-css@4.2.x: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +clipboard-copy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-3.1.0.tgz#4c59030a43d4988990564a664baeafba99f78ca4" + integrity sha512-Xsu1NddBXB89IUauda5BIq3Zq73UWkjkaQlPQbLNvNsd5WBMnTWPNKYR6HGaySOxGYZ+BKxP2E9X4ElnI3yiPA== + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +clone-response@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +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" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +commander@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + +commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commander@^2.18.0, commander@^2.2.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commander@~2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@~2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@^1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +connect-history-api-fallback@^1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" + integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3, content-disposition@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +core-js@3: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + +core-js@^2.4.0, core-js@^2.5.3, core-js@^2.5.7: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + 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" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + 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" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + 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" + +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + 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-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.9.1.tgz#2e1aa00ce7e30ef2c6a7a4b300a080a7c979e0dc" + integrity sha1-LhqgDOfjDvLGp6SzAKCAp8l54Nw= + dependencies: + csso "1.3.x" + loader-utils "~0.2.2" + source-map "~0.1.38" + +css-mqpacker@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/css-mqpacker/-/css-mqpacker-7.0.0.tgz#48f4a0ff45b81ec661c4a33ed80b9db8a026333b" + integrity sha512-temVrWS+sB4uocE2quhW8ru/KguDmGhCU7zN213KxtDvWOH3WS/ZUStfpF4fdCT7W8fPpFrQdWRFqtFtPPfBLA== + dependencies: + minimist "^1.2.0" + postcss "^7.0.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz#d981527b77712e2f3f3f09c73313e9b71b278b88" + integrity sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw== + dependencies: + autoprefixer "^9.4.7" + cssnano-preset-default "^4.0.7" + postcss-discard-unused "^4.0.1" + postcss-merge-idents "^4.0.1" + postcss-reduce-idents "^4.0.2" + postcss-zindex "^4.0.1" + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@1.3.x: + version "1.3.12" + resolved "https://registry.yarnpkg.com/csso/-/csso-1.3.12.tgz#fc628694a2d38938aaac4996753218fd311cdb9e" + integrity sha1-/GKGlKLTiTiqrEmWdTIY/TEc254= + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@=3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +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" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^4.0.0, decompress@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deep-scope-analyser@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/deep-scope-analyser/-/deep-scope-analyser-1.7.0.tgz#23015b3a1d23181b1d9cebd25b783a7378ead8da" + integrity sha512-rl5Dmt2IZkFpZo6XbEY1zG8st2Wpq8Pi/dV2gz8ZF6BDYt3fnor2JNxHwdO1WLo0k6JbmYp0x8MNy8kE4l1NtA== + dependencies: + esrecurse "^4.2.1" + estraverse "^4.2.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + 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" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + 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" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + 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" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA= + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +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-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +download@^6.2.2: + version "6.2.5" + resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714" + integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA== + dependencies: + caw "^2.0.0" + content-disposition "^0.5.2" + decompress "^4.0.0" + ext-name "^5.0.0" + file-type "5.2.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^7.0.0" + make-dir "^1.0.0" + p-event "^1.0.0" + pify "^3.0.0" + +download@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233" + integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ== + dependencies: + archive-type "^4.0.0" + caw "^2.0.1" + content-disposition "^0.5.2" + decompress "^4.2.0" + ext-name "^5.0.0" + file-type "^8.1.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^8.3.1" + make-dir "^1.2.0" + p-event "^2.1.0" + pify "^3.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== + dependencies: + lodash "^4.17.10" + +eazy-logger@^3: + version "3.0.2" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" + integrity sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw= + dependencies: + tfunk "^3.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.390: + version "1.3.403" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz#c8bab4e2e72bf78bc28bad1cc355c061f9cc1918" + integrity sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw== + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + 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" + +email-validator@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" + integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-client@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.0.tgz#82a642b42862a9b3f7a188f41776b2deab643700" + integrity sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~4.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io-parser@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" + integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" + integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + 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" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-templates@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" + integrity sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ= + dependencies: + recast "~0.11.12" + through "~2.3.6" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen-wallaby@1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/escodegen-wallaby/-/escodegen-wallaby-1.6.18.tgz#95a41e2fdc88687466e43550c7bf136386fd4363" + integrity sha512-3UvR14JRNh8VfKJixTDHWmhPNKAJiVZS807KUjECBk6f05WMe8ZeWL1gbrswNYhDiAUeDBQccyTWR91fayx3og== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.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" + +eslint-utils@^1.3.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^5.9.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.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + 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.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + 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" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +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.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esquery@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.1.tgz#105239e215c5aa480369c7794d74b8b5914c19d4" + integrity sha512-/IcAXa9GWOX9BUIb/Tz2QrrAWFWzWGrFIeLeMRwtiuwg9qTFhSYemsi9DixwrFFqVbhBZ47vGcxEnu5mbPqbig== + dependencies: + estraverse "^5.0.0" + +esrecurse@^4.1.0, esrecurse@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" + integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +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" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + 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" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + 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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +executable@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +exif-parser@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext-list@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" + integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== + dependencies: + mime-db "^1.28.0" + +ext-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" + integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== + dependencies: + ext-list "^2.0.0" + sort-keys-length "^1.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + 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" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +external-editor@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + 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" + +fancy-log@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastdom@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.9.tgz#b395fab11a3701173c02a054fe769d8f596a0a26" + integrity sha512-SSp4fbVzu8JkkG01NUX+0iOwe9M5PN3MGIQ84txLf4TkkJG4q30khkzumKgi4hUqO1+jX6wLHfnCPoZ6eSZ6Tg== + dependencies: + strictdom "^1.0.1" + +faster.js@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/faster.js/-/faster.js-1.1.1.tgz#8bbd7eefdb8f03faac26ad5025b059f94c5cfb4d" + integrity sha512-vPThNSLL/E1f7cLHd9yuayxZR82o/Iic4S5ZY45iY5AgBLNIlr3b3c+VpDjoYqjY9a9C/FQVUQy9oTILVP7X0g== + +fastparse@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +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 "^2.0.1" + +file-loader@^0.8.1: + version "0.8.5" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.8.5.tgz#9275d031fe780f27d47f5f4af02bd43713cc151b" + integrity sha1-knXQMf54DyfUf19K8CvUNxPMFRs= + dependencies: + loader-utils "~0.2.5" + +file-type@5.2.0, file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + +file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +file-type@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" + integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== + +file-type@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" + integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== + +file-type@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" + integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" + integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.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" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^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" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + 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" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.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, flatted@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0, from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +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" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + 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" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +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" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +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" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-proxy@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" + integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== + dependencies: + npm-conf "^1.1.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@3.0.0, get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +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" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-all@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.2.1.tgz#082ca81afd2247cbd3ed2149bb2630f4dc877d95" + integrity sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw== + dependencies: + glob "^7.1.2" + yargs "^15.3.1" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.5, glob@^7.0.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.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" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +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== + +gonzales-pe@^4.2.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + +got@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +got@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + +graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + 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" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + 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" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + 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" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +howler@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/howler/-/howler-2.1.3.tgz#07c88618f8767e879407a4d647fe2d6d5f15f121" + integrity sha512-PSGbOi1EYgw80C5UQbxtJM7TmzD+giJunIMBYyH3RVzHZx2fZLYBoes0SpVVHi/SFa1GoNtgXj/j6I7NOKYBxQ== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-loader@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea" + integrity sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog== + dependencies: + es6-templates "^0.2.3" + fastparse "^1.1.1" + html-minifier "^3.5.8" + loader-utils "^1.1.0" + object-assign "^4.1.1" + +html-minifier@^3.5.8: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@1.7.3, http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-proxy@1.15.2: + version "1.15.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" + integrity sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE= + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-loader@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463" + integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM= + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +imagemin-mozjpeg@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz#d2ca4e8c982c7c6eda55069af89dee4c1cebcdfd" + integrity sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA== + dependencies: + execa "^1.0.0" + is-jpg "^2.0.0" + mozjpeg "^6.0.0" + +imagemin-pngquant@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-8.0.0.tgz#bf7a41d850c6998f2475c54058ab1db9c516385d" + integrity sha512-PVq0diOxO+Zyq/zlMCz2Pfu6mVLHgiT1GpW702OwVlnej+NhS6ZQegYi3OFEDW8d7GxouyR5e8R+t53SMciOeg== + dependencies: + execa "^1.0.0" + is-png "^2.0.0" + is-stream "^2.0.0" + ow "^0.13.2" + pngquant-bin "^5.0.0" + +immutable@^3: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + +import-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.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" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + integrity sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c= + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +inversify@4.11.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.11.1.tgz#9a10635d1fd347da11da96475b3608babd5945a6" + integrity sha512-9bs/36crPdTSOCcoomHMb96s+B8W0+2c9dHFP/Srv9ZQaPnUvsMgzmMHfgVECqfHVUIW+M5S7SYOjoig8khWuQ== + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +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" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + 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" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + 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" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +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" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-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" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + 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" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + 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" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + 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" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +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" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +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" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +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" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + 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" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-jpg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97" + integrity sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc= + +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= + +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== + dependencies: + lodash.isfinite "^3.3.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.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.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" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-png@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d" + integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g== + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, 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" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +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" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + 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" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +javascript-obfuscator@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/javascript-obfuscator/-/javascript-obfuscator-0.15.0.tgz#e2b348c3a6895ef9195e3088f05747cff7a914f1" + integrity sha512-d4mzMLkwZarZE9ZDFXQapNba4iHEj6ARveU4qCz7j/T/TlrHJVbyhVRcZigIuiQqgotTWGub5vMCa2/ep+hA+w== + dependencies: + "@babel/runtime" "7.0.0-beta.42" + chalk "2.3.2" + chance "1.0.13" + class-validator "0.8.5" + commander "2.15.1" + escodegen-wallaby "1.6.18" + espree "3.5.4" + estraverse "4.2.0" + inversify "4.11.1" + js-string-escape "1.0.1" + md5 "2.2.1" + mkdirp "0.5.1" + multimatch "2.1.0" + opencollective "1.0.3" + pjson "1.0.9" + reflect-metadata "0.1.12" + source-map-support "0.5.4" + string-template "1.0.0" + tslib "1.9.0" + +jimp@^0.6.1: + version "0.6.8" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.6.8.tgz#63074984337cc469cd4030946e503e7c02a18b5c" + integrity sha512-F7emeG7Hp61IM8VFbNvWENLTuHe0ghizWPuP4JS9ujx2r5mCVYEd/zdaz6M2M42ZdN41blxPajLWl9FXo7Mr2Q== + dependencies: + "@jimp/custom" "^0.6.8" + "@jimp/plugins" "^0.6.8" + "@jimp/types" "^0.6.8" + core-js "^2.5.7" + regenerator-runtime "^0.13.3" + +jpeg-js@^0.3.4: + version "0.3.7" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d" + integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== + +js-base64@^2.1.9: + version "2.5.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" + integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + +js-string-escape@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + +"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" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.0, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +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" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +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" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +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" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" + +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" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + 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" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + 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" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +known-css-properties@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a" + integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w== + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +limiter@^1.0.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + +load-bmfont@^1.3.1, load-bmfont@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" + integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g== + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + phin "^2.9.1" + xhr "^2.0.1" + xtend "^4.0.0" + +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" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + 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" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.0, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +localtunnel@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.9.2.tgz#0012fcabc29cf964c130a01858768aa2bb65b5af" + integrity sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg== + dependencies: + axios "0.19.0" + debug "4.1.1" + openurl "1.1.1" + yargs "6.6.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + 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" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.some@^4.2.2: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +logalot@^2.0.0, logalot@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" + integrity sha1-X46MkNME7fElMJUaVVSruMXj9VI= + dependencies: + figures "^1.3.5" + squeak "^1.0.0" + +longest@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + 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" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lpad-align@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" + integrity sha1-IfYArBwwlcPG5JfuZyce4ISB/p4= + dependencies: + get-stdin "^4.0.1" + indent-string "^2.1.0" + longest "^1.0.0" + meow "^3.3.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= + +make-dir@^1.0.0, make-dir@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +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" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/markdown-loader/-/markdown-loader-4.0.0.tgz#502eb94f5db1673beb1721bed82dac9e1d333b9a" + integrity sha512-9BCm8iyLF4AVYtjtybOTg8cTcpWYKsDGWWhsc7XaJlXQiddo3ztbZxLPJ28pmCxFI1BlMkT1wDVav1chPjTpdA== + dependencies: + loader-utils "^1.1.0" + marked "^0.5.0" + +marked@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.2.tgz#3efdb27b1fd0ecec4f5aba362bddcd18120e5ba9" + integrity sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +md5@2.2.1, md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.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" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + 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" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + 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" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0, mime-db@^1.28.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@1.6.0, mime@^1.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +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" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +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" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + 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" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mitt@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +mozjpeg@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-6.0.1.tgz#56969dddb5741ef2bcb1af066cae21e61a91a27b" + integrity sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.0" + logalot "^2.1.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multimatch@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + 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" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + integrity sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ= + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^1.6.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.53: + version "1.1.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" + integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.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" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.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" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-conf@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +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" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + 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" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +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" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +obfuscator-loader@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obfuscator-loader/-/obfuscator-loader-1.1.2.tgz#6e8460066296fc642a68c945e64906e3c964cb0f" + integrity sha512-5PKsa4Vzq8uLJG0GT9BvC9ZxCr44wyV0c9wi782RYWh44GdFMSqlnUldgqSV+HQkFH3MWNc34AlSVSEhg7I26w== + dependencies: + esprima "^4.0.0" + javascript-obfuscator "^0.15.0" + loader-utils "^1.1.0" + +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" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + integrity sha1-D9mnT8X60a45aLWGvaXGMr1sBaU= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + 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" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +omggif@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" + integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +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" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onesky-fetch@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/onesky-fetch/-/onesky-fetch-0.0.7.tgz#96fce1a258a80683d6a37840958bae2f6fdb2809" + integrity sha1-lvzholioBoPWo3hAlYuuL2/bKAk= + dependencies: + md5 "^2.2.1" + node-fetch "^1.6.3" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opencollective@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + integrity sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE= + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + integrity sha1-erwi5kTf9jsKltWrfyeQwPAavJU= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +opn@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-filter-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" + integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== + dependencies: + arch "^2.1.0" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +ow@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.13.2.tgz#375e76d3d3f928a8dfcf0cd0b9c921cb62e469a0" + integrity sha512-9wvr+q+ZTDRvXDjL6eDOdFe5WUl/wa5sntf9kAolxqSpkBqaIObwLgFCGXSJASFw+YciXnOVtDWpxXa9cqV94A== + dependencies: + type-fest "^0.5.1" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-event@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085" + integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU= + dependencies: + p-timeout "^1.1.1" + +p-event@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" + integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== + dependencies: + p-timeout "^2.0.1" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + 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" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + 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" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" + integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= + dependencies: + p-reduce "^1.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@^1.0.5, pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + 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" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +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.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + 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" + safe-buffer "^5.1.1" + +parse-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= + +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= + +parse-bmfont-xml@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" + integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== + dependencies: + xml-parse-from-string "^1.0.0" + xml2js "^0.4.5" + +parse-headers@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" + integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + 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" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + 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" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +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" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +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" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +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" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + 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" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +phin@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" + integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== + +phonegap-plugin-mobile-accessibility@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/phonegap-plugin-mobile-accessibility/-/phonegap-plugin-mobile-accessibility-1.0.5.tgz#95a8754d127508bc6e1ae259a53ce765836eac03" + integrity sha1-lah1TRJ1CLxuGuJZpTznZYNurAM= + +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + 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" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pixelmatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= + dependencies: + pngjs "^3.0.0" + +pjson@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/pjson/-/pjson-1.0.9.tgz#8a9520ce76a4739f8fee91679dad6b065b1c7938" + integrity sha512-4hRJH3YzkUpOlShRzhyxAmThSNnAaIlWZCAb27hd0pVUAXNUAHAO7XZbsPPvsCYwBFEScTmCCL6DGE8NyZ8BdQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +pngjs@^3.0.0, pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +pngquant-bin@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.2.tgz#6f34f3e89c9722a72bbc509062b40f1b17cda460" + integrity sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.1" + execa "^0.10.0" + logalot "^2.0.0" + +portscanner@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" + integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y= + dependencies: + async "1.5.2" + is-number-like "^1.0.3" + +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" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-assets@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-assets/-/postcss-assets-5.0.0.tgz#f721d07d339605fb58414e9f69cf05401c54e709" + integrity sha1-9yHQfTOWBftYQU6fac8FQBxU5wk= + dependencies: + assets "^3.0.0" + bluebird "^3.5.0" + postcss "^6.0.10" + postcss-functions "^3.0.0" + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-discard-unused@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz#ee7cc66af8c7e8c19bd36f12d09c4bde4039abea" + integrity sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA== + dependencies: + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-functions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e" + integrity sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4= + dependencies: + glob "^7.1.2" + object-assign "^4.1.1" + postcss "^6.0.9" + postcss-value-parser "^3.3.0" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-idents@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz#b7df282a92f052ea0a66c62d8f8812e6d2cbed23" + integrity sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A== + dependencies: + cssnano-util-same-parent "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.5.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-idents@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz#30447a6ec20941e78e21bd4482a11f569c4f455b" + integrity sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-round-subpixels@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-round-subpixels/-/postcss-round-subpixels-1.2.0.tgz#e21d6ac5952e185f9bdc008b94f004fe509d0a11" + integrity sha1-4h1qxZUuGF+b3ACLlPAE/lCdChE= + dependencies: + postcss "^5.0.2" + postcss-value-parser "^3.1.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-unprefix@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/postcss-unprefix/-/postcss-unprefix-2.1.4.tgz#ab1c038ab77f068799ed36e1cbd997b51e7360a1" + integrity sha512-s+muBiGIMx3RvgPTtPBnSrfvIBHJ2Zx16QZf/VDB/sAxdYP6FIzci8d1gLh0+9psu5W6zVtCbU5micNt6Zh3cg== + dependencies: + autoprefixer "^9.4.3" + known-css-properties "^0.11.0" + normalize-range "^0.1.2" + postcss-selector-parser "^5.0.0" + postcss-value-parser "^3.3.1" + pseudo-classes "^1.0.0" + pseudo-elements "^1.1.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.1.2, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-zindex@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz#8db6a4cec3111e5d3fd99ea70abeda61873d10c1" + integrity sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss@^5.0.2: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.10, postcss@^6.0.9: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@~1.1.2: + version "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.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +prettier@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" + integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== + +private@^0.1.8, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-polyfill@^8.1.0: + version "8.1.3" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" + integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudo-classes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pseudo-classes/-/pseudo-classes-1.0.0.tgz#60a69b67395c36ff119c4d1c86e1981785206b96" + integrity sha1-YKabZzlcNv8RnE0chuGYF4Uga5Y= + +pseudo-elements@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pseudo-elements/-/pseudo-elements-1.1.0.tgz#9ba6dd8ac3ce1f3d7d36d4355aa3e28d08391f28" + integrity sha1-m6bdisPOHz19NtQ1WqPijQg5Hyg= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + 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" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + 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" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^6.8.1: + version "6.12.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c" + integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.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" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + 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" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@^2.3.2: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.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" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.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" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.1.0, readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reflect-metadata@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" + integrity sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A== + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +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" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + 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" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +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" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +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" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "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-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.3.2: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + +responselike@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + 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" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + 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" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rusha@^0.8.13: + version "0.8.13" + resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a" + integrity sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo= + +rx@4.1.0, rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + +rxjs@^5.5.6: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.4.0: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + +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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-unused@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/sass-unused/-/sass-unused-0.3.0.tgz#69924e4996d6c96840fb3a99e0a0290516811a9f" + integrity sha512-fGNcUpDeSFwnN+BTQ251iM77Py8awPXc96vSE3TpvMcgbC90IrohonRb4oxWX/KzHpezkmUddS8/t04R+yIB8w== + dependencies: + glob "^7.0.5" + gonzales-pe "^4.2.3" + +sax@>=0.6.0, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.4.0: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +seek-bzip@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= + dependencies: + commander "~2.8.1" + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +semver-truncate@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" + integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g= + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + 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" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-error@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-3.0.0.tgz#80100282b09be33c611536f50033481cb9cc87cf" + integrity sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A== + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-index@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + 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: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +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" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + 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" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +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" + is-fullwidth-code-point "^2.0.0" + +sloc@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/sloc/-/sloc-0.2.1.tgz#42ad891e76838c1a22bbd8483468e9d74c7f531e" + integrity sha512-8XJnwCFR4DatLz1s0nGFe6IJPJ+5pjRFhoBuBKq8SLgFI40eD7ak6jOXpzeG0tmIpyOc1zCs9bjKAxMFm1451A== + dependencies: + async "~2.1.4" + cli-table "^0.3.1" + commander "~2.9.0" + readdirp "^2.1.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + 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" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + 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" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + 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" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" + integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.2.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.2.0" + to-array "0.1.4" + +socket.io-client@^2.0.4: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" + integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~4.1.0" + engine.io-client "~3.4.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" + integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== + dependencies: + debug "~3.1.0" + engine.io "~3.2.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.1.1" + socket.io-parser "~3.2.0" + +sort-keys-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" + integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= + dependencies: + sort-keys "^1.0.0" + +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" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + 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" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.4.tgz#54456efa89caa9270af7cd624cc2f123e51fbae8" + integrity sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg== + dependencies: + source-map "^0.6.0" + +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + 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" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +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" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= + dependencies: + amdefine ">=0.0.4" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + dependencies: + amdefine ">=0.0.4" + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +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" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +speed-measure-webpack-plugin@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz#6ff894fc83e8a6310dde3af863a0329cd79da4f5" + integrity sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ== + dependencies: + chalk "^2.0.1" + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +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" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +squeak@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" + integrity sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM= + dependencies: + chalk "^1.0.0" + console-stream "^0.1.1" + lpad-align "^1.0.1" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + 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" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + 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" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + 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.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM= + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + +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= + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + +strictdom@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460" + integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA= + +string-replace-webpack-plugin@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/string-replace-webpack-plugin/-/string-replace-webpack-plugin-0.1.3.tgz#73c657e759d66cfe80ae1e0cf091aa256d0e715c" + integrity sha1-c8ZX51nWbP6Arh4M8JGqJW0OcVw= + dependencies: + async "~0.2.10" + loader-utils "~0.2.3" + optionalDependencies: + css-loader "^0.9.1" + file-loader "^0.8.1" + style-loader "^0.8.3" + +string-template@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96" + integrity sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y= + +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" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.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-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" + +string.prototype.trimright@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string_decoder@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +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" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + 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" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.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.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== + dependencies: + is-natural-number "^4.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.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" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== + +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +style-loader@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.8.3.tgz#f4f92eb7db63768748f15065cd6700f5a1c85357" + integrity sha1-9Pkut9tjdodI8VBlzWcA9aHIU1c= + dependencies: + loader-utils "^0.2.5" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempfile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" + integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= + dependencies: + temp-dir "^1.0.0" + uuid "^3.0.1" + +terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.11" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.11.tgz#12ff99fdd62a26de2a82f508515407eb6ccd8a9f" + integrity sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +tfunk@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b" + integrity sha1-OORBT8ZJd9h6/apy+sttKfgve1s= + dependencies: + chalk "^1.1.1" + object-path "^0.9.0" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6, through@^2.3.8, through@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +timed-out@^4.0.0, timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timm@^1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd" + integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tinycolor2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +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" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +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" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + 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" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + 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" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + +trim@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tslib@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== + +tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@0.7.17: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + integrity sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g== + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +uglify-template-string-loader@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/uglify-template-string-loader/-/uglify-template-string-loader-1.1.1.tgz#d091d15f66b65f1cae2f4222583009302c86339f" + integrity sha512-EHJx8m0aIHlwX5xlJd2xPYIFvLrPkVK5X8zpVxSNTmu7KoT2eSg1TNlwZS+JS65+dwJXC4rC5mc+F4UVe2rckw== + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unbzip2-stream@^1.0.9: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.1.tgz#151b104af853df3efdaa135d8b1eca850a44b426" + integrity sha512-sgDYfSDPMsA4Hr2/w7vOlrJBlwzmyakk1+hW8ObLvxSp0LA36LcL2XItGvOT3OSblohSdevMuT8FQjLsqyy4sA== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unused-files-webpack-plugin@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/unused-files-webpack-plugin/-/unused-files-webpack-plugin-3.4.0.tgz#adc67a3b5549d028818d3119cbf2b5c88aea8670" + integrity sha512-cmukKOBdIqaM1pqThY0+jp+mYgCVyzrD8uRbKEucQwIGZcLIRn+gSRiQ7uLjcDd3Zba9NUxVGyYa7lWM4UCGeg== + dependencies: + babel-runtime "^7.0.0-beta.3" + glob-all "^3.1.0" + semver "^5.5.0" + util.promisify "^1.0.0" + warning "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + 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" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + 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" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +utif@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" + integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== + dependencies: + pako "^1.0.5" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validator@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.2.0.tgz#ad216eed5f37cac31a6fe00ceab1f6b88bded03e" + integrity sha512-6Ij4Eo0KM4LkR0d0IegOwluG5453uqT5QyF5SV5Ezvm8/zmkKI/L4eoraafZGlZPC9guLkwKzgypcw8VGWWnGA== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vinyl@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +watchpack@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" + integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== + dependencies: + chokidar "^2.1.8" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +webpack-bundle-analyzer@^3.0.3: + version "3.7.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.7.0.tgz#84da434e89442899b884d9ad38e466d0db02a56f" + integrity sha512-mETdjZ30a3Yf+NTB/wqTgACK7rAYQl5uxKK0WVTNmF0sM3Uv8s3R58YZMW7Rhu0Lk2Rmuhdj5dcH5Q76zCDVdA== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-cli@^3.1.0: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-deep-scope-plugin@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/webpack-deep-scope-plugin/-/webpack-deep-scope-plugin-1.6.2.tgz#131eac79739021e42ebc07066ea8869107f37b85" + integrity sha512-S5ZM1i7oTIVPIS1z/Fu41tqFzaXpy8vZnwEDC9I7NLj5XD8GGrDZbDXtG5FCGkHPGxtAzF4O21DKZZ76vpBGzw== + dependencies: + deep-scope-analyser "^1.7.0" + +webpack-plugin-replace@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-plugin-replace/-/webpack-plugin-replace-1.2.0.tgz#3f20db96237400433231e35ea76d9be3f7128916" + integrity sha512-1HA3etHpJW55qonJqv84o5w5GY7iqF8fqSHpTWdNwarj1llkkt4jT4QSvYs1hoaU8Lu5akDnq/spHHO5mXwo1w== + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-stream@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39" + integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A== + dependencies: + fancy-log "^1.3.3" + lodash.clone "^4.3.2" + lodash.some "^4.2.2" + memory-fs "^0.4.1" + plugin-error "^1.0.1" + supports-color "^5.5.0" + through "^2.3.8" + vinyl "^2.1.0" + webpack "^4.26.1" + +webpack-strip-block@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/webpack-strip-block/-/webpack-strip-block-0.2.0.tgz#c60d4a703e0eeee8895e7f1abe9b5fe914681470" + integrity sha1-xg1KcD4O7uiJXn8avptf6RRoFHA= + dependencies: + loader-utils "^1.1.0" + +webpack@^4.26.1, webpack@^4.31.0: + version "4.42.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" + integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac" + integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw== + dependencies: + loader-utils "^1.0.0" + schema-utils "^0.4.0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +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" + +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" + +xhr@^2.0.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" + integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= + +xml2js@^0.4.5: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^13.1.0: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.1: + version "18.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" + integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^4.1.0, yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= + dependencies: + camelcase "^3.0.0" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" + integrity sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ= + 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" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^4.1.0" + +yargs@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= + 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 "^4.2.0" + +yargs@^15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.1" + +yauzl@^2.4.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=